UNO att minnas vad siffran var senast?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: UNO att minnas vad siffran var senast?

Inlägg av fosfor »

Hallå allihop!
Vill poängtera att maskinen används väldigt lite, så vi behöver inte oroa oss för att minnet kommer slitas ut. Glömde skriva det.
Så att den skriver till en intern Eeprom är Helt Ok! :tumupp:

Nu är bara frågan, hur "döper" jag en ny sektion minne som jag kan skriva till?
Som alltså ska fungera separat från den minnesdel som redan används. :humm:
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: UNO att minnas vad siffran var senast?

Inlägg av fosfor »

Skulle någon kunna förklara vad dessa rader betyder mer exakt?

Kod: Markera allt

float f = 0.00f;        //Variable to store data read from EEPROM. F är namnet 0.00f är värdet
int eeAddress = 0;      //EEPROM address to start reading from
Jag förstår inte riktigt.
Är det f man anropar från andra kommandorader? Varför står det 0.00f?
Och vad menar man med intern adress 0? Finns det fler adresser som nummer?
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: UNO att minnas vad siffran var senast?

Inlägg av arvidb »

int står för integer (heltal) och float står för flyttal (ett slags decimaltal). Raderna är variabeldeklarationer som talar om för kompilatorn att du vill ha tillgång till en variabel med namn f av typen float och en variabel vid namn eeAddress av typen int. Båda initialiserade till 0. 0.00f betyder "värdet noll av typen float" (till skillnad från noll av typen double, t.ex.).
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: UNO att minnas vad siffran var senast?

Inlägg av Icecap »

Den interna EEPROM har en viss storlek. På PIC varierar det mellan 128 bytes och ett par k. Dom jag använder är oftast på 256 bytes EEPROM internt.

Så adressen refererar till detta.

Och sedan lite tips om du ska spara fler data:
Skapa ett block:

Kod: Markera allt

struct
  {
  unsigned short Position;
  unsigned short SomethingElse;
  ... // Possibly more variables
  } Config;
Då kan man spara hela blocket vid att spara varje byte startande från blockets start ((unsigned char*)&Config) och sedan stega igenom beroende på blockets storlek (sizeof(Config)).

Likaså kan man hämta hela blocket vid uppstart - och saken är biff. Lägger man till variabler kommer ovanstående automatisk att justeras (antal bytes). Såklart kommer nya variabler som läggs till att vara odefinierat (oftast 0xFF) men det ska programmet ju klara ändå.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: UNO att minnas vad siffran var senast?

Inlägg av fosfor »

Hej... ok.
Jag blir bara mer förvirrad :shock:

Vad är fördel med att skapa ett så kallat block då?
Och varför bör jag inte köra två "separata" delar av minnet?
Exakt vad är det jag anropar till och läser från?
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: UNO att minnas vad siffran var senast?

Inlägg av Icecap »

+ Vad är fördel med att skapa ett så kallat block då?
- Att man kan samla alla de värden (bytes) som ska sparas till ett enda block. Då kan man spara alla värden i blocket (strukturen) i ett svep vid att spara alla bytes som ingår i det block. Antalet bytes anpassas efter vad som behövs och vilken typ variabler som ingår. Alltså behöver man inte räkna manuellt hur många bytes det består av, inte att sätta manuella adresser osv. och därmed inte glömma att ändra en adress.

+ Och varför bör jag inte köra två "separata" delar av minnet?
- För att man någon gång helt säkert kommer att överlappa minnesadressorna vilket ger kaos i inställningarna. Att ange dessa värden som en samlat enhet (struktur) gör att de ligger rätt och har rätt storlek.

+ Exakt vad är det jag anropar till och läser från?
- Det man kallar EEPROM. Ett inbyggt minne som kan ändras rimligt enkelt och som håller kvar värden i avstängd läge. Man kan alltså skriva in värden i EEPROM, stänga av strömmen i 10 år och när man slår på igen kan man läsa in dessa värden utan problem.

Visst, är det bara ett enda värde som ska kunde sparas och kallas fram igen kan det vara "mycket" att deklarera en struktur - MEN om värdet som ska sparas är t.ex. ett WORD eller annan variabel som fyller mer i minnet än 1 byte ska man ÄNDÅ skriva alla bytes (2 eller fler) till var sin plats i EEPROM och då är steget till en struct väldigt kort.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: UNO att minnas vad siffran var senast?

Inlägg av fosfor »

Ok!

Hmm....
Vad skulle du rekommendera för mig att göra? :oops:
Jag har två separata siffror jag vill spara. De båda kan ligga på max 10.000 eller -10.000 (större siffror än så behövs inte).
Den ena är position för motorn särskilt viktig vid off/on.
Den andra position för motorn att pausa en sekund vid när den passerar.

Bygger man som ett "träd"/klump av dessa långt upp i koden?
Och sen anropar / skriver till separat till någon av dessa eller båda längre ner?
Hur vet jag vilken del av minnet som går till vad? Kan jag namnge dom som typ "OnOffminne" och "PausMinne" eller något sådant?
Vet du några bra exempel jag skulle kunna kika på? :roll:

Jag skulle t.ex. vilja att i koden för när jag "kör ner" min motor, så avslutas koden med att spara positionen automatisk.
Så att den hela tiden är uppdaterad. Likadant för "kör upp" kodsnutten.
Så att när man släpper knappen, och motorn stannar, så har den sparat sin position.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: UNO att minnas vad siffran var senast?

Inlägg av Icecap »

Jag fattar inte riktigt din terminologi.

"Hur vet jag vilken del av minnet som går till vad?"
Här börjar jag bli allvarligt bekymret - men jag ska försöka reda ut lite för dig. Jag kommer att skriva C-aktig kod och alltid på engelsk.

Kod: Markera allt

struct
  {
  short OnOff; // Max ±32k
  short Pause; // Max ±32k
  } Config;
Nu är de två värden deklarerat. Du kommer åt dom vid att skriva 'Config.OnOff' hhv. 'Config.Pause'. Så länge du använder dessa namn kommer kompilern att hålla reda på det för dig. Du kan såklart ange andra namn om du vill.

Men du ska kunde spara dessa värden om du ändrar endera. Jag utgår ifrån att det finns en funktion som heter 'void EEPROM_Save(unsigned char Address, unsigned char Data)' som löser detta med att programmera in en byte i EEPROM.

Kod: Markera allt

void Config_Save(void)
  {
  unsigned char  Addr;
  Addr = 0; // Start adress i EEPROM
  while(Addr < sizeof(Config))
    {
    EEPROM_Save(Addr, *((unsigned char*)&Config + Addr);
    }
  }
Nu kan alla värden som finns i Config sparas i en sekventiell klump.

Och du ska kunde hämta dessa värden om du ändrar endera. Jag utgår ifrån att det finns en funktion som heter 'unsigned char EEPROM_Read(unsigned char Address)' som kan hämta en byte från EEPROM.

Kod: Markera allt

void Config_Read(void)
  {
  unsigned char  Addr;
  Addr = 0; // Start adress i EEPROM
  while(Addr < sizeof(Config))
    {
    *((unsigned char*)&Config + Addr) = EEPROM_Read(Addr); // Lite speciellt men skapar en pekare till en byte som börjar på den adress som Config ligger i samt stegar fram så långt det behövs. Varje sparade byte hämtas och i Config är alla variabler då hela när den är klar.
    }
  }
Nu kan alla värden som finns i Config hämtas i en sekventiell klump.

Så när du sparar värden skrivs dessa först i rätt variabel och Config_Save() kallas.

När projektet startas (power-on) ska dessa värden hämtas in vid att kalla Config_Read() under initialiseringen.

Klart. När du vill spara ändringar är det bara att göra det och när programmet börjar rulla är värden hämtade och klara.

Det ska sägas att rutinerna kan vara ganska mycket mer avancerat med valbar adress i EEPROM osv men jag försökte att göra det enkelt.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: UNO att minnas vad siffran var senast?

Inlägg av fosfor »

Ok tack!
Dock saknar jag void raden.

Här är koden så kan du se hur det ser ut just nu.
Går det lika väl att implementera ditt förslag på detta?
Då lär jag behöva ta bort det sättet jag sparar en position på antar jag?

Kod: Markera allt

//  ---- MOTOR CONST INTARNA  - DESSA GÅR TILL H-BRYGGAN ----
const int controlPin1 = 7;
const int controlPin2 = 6;
const int enablePin = 9;

#include <Wire.h>                   // Tillåter I2C kommunikation - Pins A4 (SDA), A5 (SCL)
#include <LiquidCrystal_I2C.h>      // Denna aktiverar LCD
#include <EEPROM.h>                 // Denna aktiverar EEPROM minnet

// ---- Dessa används för sparning i EEPROM - 2018-04-16 ---------------------
// ---- Testade ta bort se vad som händer   - 2018-04-23 - Dessa rader verkar inte behövas
// struct MyObject{
//   float field1;
//   byte field2;
//   char name[10];
// };

// ---- DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN ---------------------
// ---- Testar avaktivera 2018-04-23 - Denna rad verkar inte behövas
// char lineText[] = "  Hoy! Denna text syns ingenstans.  ";

// ---- VARIABLER
// exempel:   int pinName = 13      int är typ av variabeln ~ pinName är namnet ~ namnets värde är 13
// Senare i programmet kan man hänvisa till denna variabel med namnet, då kommer dess värde letas upp och användas
// exempel: float varName=val       varName är float namnet ~ val är värdet du assignar till den variabeln

int sensor01;               // Integer är din primära datatyp för nummersparning
int sensor02;
int stepOld;
int step;
long PulseCount;            // --- Long är förlängda storleks variabler för sparning av nummer. 32 bits (4 bytes).
long UserStopPulseCount;    // --- Denna ser till att räkningen är stadig


// ---- MOTOR TEST INT - VARIABLER ---------------------------------------------------------------------------------
int intest1Pin = 4;        // KNAPP 1   -  Kabel GRÅ    - Går åt plus hållet    - UPP
int intest2Pin = 5;        // KNAPP 2   -  Kabel GRÖN   - Går åt minus hållet   - NER
int intest3Pin = 10;       // KNAPP 3   -  Kabel SVART  - SPARA POSITION        - Minnet SPARA
int intest4Pin = 11;       // KNAPP 4   -  Kabel BLÅ    - VISA SPARAD POSITION  - Minnet RADERA
int intest5Pin = 16;       // KNAPP 5   -  Kabel GRÖN   - Truddelutt 1
int intest6Pin = 17;       // KNAPP 6   -  Kabel RÖD    - Truddelutt 2

int stopsensor1Pin = 12;   // SENSOR 1  -  Kabel GRÖN   - Enskild sensor - STOPPAR NER
int stopsensor2Pin = 8;    // SENSOR 2  -  Kabel GRÅ    - Enskild sensor - STOPPAR UPP
int stopsensor3Pin = 15;   // SENSOR 3  -  Kabel ROSA   - Enskild sensor - TOTALSTOPP
int val = 0;
int tonePin = 13;          // --- BEEPER ---


// ---- Dessa används för sparning i EEPROM - 2018-04-16 ---------------------
float f = 0.00f;        //Variable to store data read from EEPROM. F är namnet 0.00f är värdet
int eeAddress = 0;      //EEPROM address to start reading from


// I2C - DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN - initialize the library with the numbers of the interface pins
// 0x27 adressen hittades via I2C scanner på den med svart tejp - De andra hade 0x3F
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// Aktivera denna rad härunder, och av-avaktivera den ovanför, om någon av de andra I2C displayerna ska användas
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);


// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
#define SENSOR_A 3
#define SENSOR_B 2

void checkState()       // Void används bara i en funktions deklaration. Den indikerar att funktionen förväntas returnera ingen info till funktionen från vilken den var kallad
{
  sensor01 = digitalRead(SENSOR_A);
  sensor02 = digitalRead(SENSOR_B);

  if (sensor01 == 1 && sensor02 == 1) {
    step = 0;
    if (stepOld == 1) {
      PulseCount--;
    }
    if (stepOld == 3) {
      PulseCount++;
    }
    stepOld = 0;
  }

  if (sensor01 == 0 && sensor02 == 1) {
    step = 1;
    if (stepOld == 2) {
      PulseCount--;
    }
    if (stepOld == 0) {
      PulseCount++;
    }
    stepOld = 1;
  }

  if (sensor01 == 0 && sensor02 == 0) {
    step = 2;
    if (stepOld == 3) {
      PulseCount--;
    }
    if (stepOld == 1) {
      PulseCount++;
    }
    stepOld = 2;
  }

  if (sensor01 == 1 && sensor02 == 0) {
    step = 3;
    if (stepOld == 0) {
      PulseCount--;
    }
    if (stepOld == 2) {
      PulseCount++;
    }
    stepOld = 3;
  }
}


// VOID SETUP - KÖRS BARA EN GÅNG I BÖRJAN, EN FÖRBEREDELSE, LOOP ÄR EXEKVERING OCH GÖR DET MESTA JOBBET
// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
// Void används bara i en funktions deklaration. Den indikerar att funktionen förväntas returnera ingen info till funktionen från vilken den var kallad

void setup()
{
  Serial.begin(9600);                      // Sätter data rate i bits per sekund (baud) för serial data transmission.
  lcd.begin(16, 2);                        // set up the LCD's number of columns and rows:
  lcd.setCursor(0, 0);                     // Print a message to the LCD.
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print("                ");

  attachInterrupt(0, checkState, CHANGE);
  attachInterrupt(1, checkState, CHANGE);
  PulseCount = 0;
  EEPROM.get(0, UserStopPulseCount);    // Denna håller koll på räkning och radering av pulser. Adressen är 0.


  // TEST MOTOR  - VOID SETUP ---------------------------------------------------------------------------------
  pinMode(intest1Pin, INPUT);         //Declarar denna som input  UNO input är 4         Knapp 1   Grå     UPP
  pinMode(intest2Pin, INPUT);         //Declarar denna som input  UNO input är 5         Knapp 2   Grön    NER
  pinMode(intest3Pin, INPUT);         //Declarar denna som input  UNO input är 10        Knapp 3   Svart   SPARA POSITION
  pinMode(intest4Pin, INPUT);         //Declarar denna som input  UNO input är 11        Knapp 4   Blå     TA BORT POSITION
  pinMode(intest5Pin, INPUT);         //Declarar denna som input  UNO input är 16 (A2)   Knapp 5   Grön    Truddelutt 1
  pinMode(intest6Pin, INPUT);         //Declarar denna som input  UNO input är 17 (A3)   Knapp 6   Röd     Truddelutt 2
  pinMode(stopsensor1Pin, INPUT);     //Declarar denna som input  UNO input är 12                  Grön
  pinMode(stopsensor2Pin, INPUT);     //Declarar denna som input  UNO input är 8                   Grå
  pinMode(stopsensor3Pin, INPUT);     //Declarar denna som input  UNO input är 15 (A1)             Rosa
  pinMode(tonePin, OUTPUT);           //Declarar denna som output UNO input är 13        Högtalare / Beeper

  //  ---- LCD start presentationen
  {
    lcd.setCursor(2, 0);
    lcd.print("PROTOTYPE");
    Serial.println("Boot initialized");
    delay(500);
    // lcd.clear();

    lcd.setCursor(11, 1);
    lcd.print("1");
    delay(100);

    lcd.setCursor(11, 1);
    lcd.print("10");
    delay(100);

    lcd.setCursor(11, 1);
    lcd.print("100");
    delay(900);
    lcd.clear();

    lcd.setCursor(2, 0);
    lcd.print("Prototype 1.0");
    delay(200);

    lcd.setCursor(0, 1);
    lcd.print("www.");
    delay(100);

    lcd.setCursor(12, 1);
    lcd.print(".se");
    delay(100);

    lcd.setCursor(0, 1);
    lcd.print("www.PROTOTYPE.se");
    delay(250);

    lcd.setCursor(0, 1);
    lcd.print("www.PROTOTYPE.se");
    Serial.println("unit is active");

    delay(800);
    lcd.clear();
  }
}


void loop()

{
  // DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
  // LCD set the cursor to column 0, line 1 (note: line 1 is the second row, since counting begins with 0):

  lcd.setCursor(0, 0);

  lcd.print("Pulses:");
  if (PulseCount > -1) {
    lcd.print(" ");
  }

  if (PulseCount < 10 && PulseCount > -10) {
    lcd.print(" ");
  }

  if (PulseCount < 100 && PulseCount > -100) {
    lcd.print(" ");
  }

  lcd.print(PulseCount);
  if (sensor01 == 1) {
    lcd.print(" HIGH");
  }
  else {
    lcd.print(" LOW ");
  }

  lcd.setCursor(0, 1);

  if (sensor02 == 1) {
    lcd.print("            HIGH");
  }
  else {
    lcd.print("            LOW ");
  }


  // ---- INTEST PIN 3 - SPARAR
  // ---- SPARAR POSITION TILL EEPROM - FUNGERAR! ---- Använder knapp 3 på breadboard

  {
    val = digitalRead(intest3Pin);         // Knapp 3 - Denna ska spara position i minnet
    if (val == HIGH) {                     // Kollar om knappen är tryckt
      UserStopPulseCount = PulseCount;
      EEPROM.put(0, UserStopPulseCount);   // Skriver PulseCount numret till minnet, adressen är 0

      lcd.setCursor(0, 1);                 // Dessa två rader skriver till LCD, i detta fall är 0,1 rad 2
      lcd.print(PulseCount);
      delay(750);
      lcd.setCursor(0, 1);
      lcd.print("Pos. SAVED");
      Serial.println("Saving liftposition to memory");
      delay(750);
    }
  }


  // ---- INTEST PIN 4 - RADERAR positionen från minnet/EEPROM
  {
    val = digitalRead(intest4Pin);         // Knapp 4 - Ska radera minnet
    if (val == HIGH) {                     // Kollar om knappen är tryckt
      UserStopPulseCount = 0;
      EEPROM.put(0, UserStopPulseCount);   //
      lcd.setCursor(0, 1);                 // Dessa två rader skriver till LCD, i detta fall är 0,1 rad 2
      lcd.print("Pos. erased");
      Serial.println("Erasing position from memory");
      delay(1000);
    }
  }


  // ---- FUNGERAR! Dessa rader stoppar motorn 1 sek när den är inom värdet, gäller både UPP och NED
  {
    if ( UserStopPulseCount != 0 && PulseCount >= UserStopPulseCount - 15 && PulseCount <= UserStopPulseCount + 15 )
    {
      digitalWrite(controlPin1, LOW);
      digitalWrite(controlPin2, LOW);
      lcd.setCursor(0, 1);
      lcd.print("Users Stop");
      Serial.println("Users programmed STOP activated");
      delay(1500);
    }
  }       //Går till raderna ovan


  // ---- INTEST PIN 5 - TEST för melodi!
  {
    val = digitalRead(intest5Pin);         // Knapp 5 - TEST - Ska spela melodi eller ljud
    if (val == HIGH) {                     // Kollar om knappen är tryckt
      lcd.setCursor(0, 1);                 // Dessa två rader skriver till LCD, i detta fall är 0,1 rad 2
      lcd.print("Button 5");
      Serial.println("Playing tone on button 5!");
      delay(200);

      // -- Dessa tre rader nedanför gör pipljudet när användarens programmerade stopp aktiveras
      tone(tonePin, 600);
      delay(50);
      tone(tonePin, 950);
      delay(70);
      tone(tonePin, 680, 125);
      delay(100);
      tone(tonePin, 600);
      delay(50);
      tone(tonePin, 950);
      delay(70);
      tone(tonePin, 720, 125);
      delay(800);
      noTone(tonePin);
      delay(100);
    }
  }

  // ---- INTEST PIN 6 - TEST för melodi!
  {
    val = digitalRead(intest6Pin);         // Knapp 6 - TEST - Ska spela melodi eller ljud
    if (val == HIGH) {                     // Kollar om knappen är tryckt
      lcd.setCursor(0, 1);                 // Dessa två rader skriver till LCD, i detta fall är 0,1 rad 2
      lcd.print("Button 6");
      Serial.println("Playing tone on button 6!");
      delay(200);

      // -- Dessa tre rader nedanför gör pipljudet när användarens programmerade stopp aktiveras
      tone(tonePin, 600);
      delay(50);
      tone(tonePin, 720);
      delay(70);
      tone(tonePin, 680);
      delay(100);
      tone(tonePin, 600);
      delay(50);
      tone(tonePin, 950);
      delay(70);
      tone(tonePin, 880, 125);
      delay(800);
      noTone(tonePin);
      delay(100);
    }
  }


  //  ---- MOTORNS VOID LOOP - KNAPPSTYRNINGEN TILL MOTORERNA ----
  // intest 1 ÅKER UPP
  // intest 2 ÅKER NER
  // stopsensor1Pin heter stoppsensorn som hindrar UPP
  // stopsensor2Pin heter stoppsensorn som hindrar NED
  // stopsensor3Pin heter stoppsensorn som hindrar UPP eller NED

  {
    // ---- ÅKER UPP
    val = digitalRead(intest1Pin);         // UPP - Läser input värde
    if (val == HIGH)                       // Checkar om knappen trycks
    {
      digitalWrite(controlPin1, HIGH);
      digitalWrite(controlPin2, LOW);


      // ---- UPP o NER HINDRAS av denna sensor, denna kod stoppar när man kör upp
      {
        val = digitalRead(stopsensor3Pin);
        if (val == HIGH) {
          digitalWrite(controlPin1, LOW);

          // -- Dessa 3 rader visar USER STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
          lcd.setCursor(0, 1);
          lcd.print("User Stop");
          Serial.println("User removeable module defined stop 1");
          delay(50);

          // -- Dessa tre rader nedanför gör pipljudet när UPP & NER stopsensorn (ovan) täcks
          tone(tonePin, 600);
          delay(50);
          tone(tonePin, 950);
          delay(70);
          tone(tonePin, 800, 125);
          delay(800);
          noTone(tonePin);
        }
      }

      // ---- UPP HINDRAS av denna sensor
      {
        val = digitalRead(stopsensor2Pin);         // Sensor 2 som stoppar motorn, likaså sensor 3 vars uppgift är att stoppa både upp och ner
        if (val == HIGH) {
          digitalWrite(controlPin1, LOW);

          // -- Dessa 3 rader visar UPSTOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
          lcd.setCursor(0, 1);
          lcd.print("Up Stop");
          Serial.println("Upper security sensor reached Can only go down");
          delay(50);

          // -- Dessa tre rader nedanför gör pipljudet när stopsensorn (ovan) täcks påvägen UPP
          tone(tonePin, 880);
          delay(125);
          tone(tonePin, 400, 125);
          delay(650);
          noTone(tonePin);
        }

        // ---- Dessa rader visar UP när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
        lcd.setCursor(0, 1);
        lcd.print("Up");
        Serial.println("Lift going up at full speed");
        delay(50);
      }
    }


    // ---- ÅKER NER ----
    else {
      val = digitalRead(intest2Pin);         // NER - Läser input värde
      if (val == HIGH) {                     // Checkar om knappen trycks
        digitalWrite(controlPin1, LOW);
        digitalWrite(controlPin2, HIGH);


        // -- UPP o NER HINDRAS av denna sensor, denna kod stoppar när man kör ner
        {
          val = digitalRead(stopsensor3Pin);         // TEST
          if (val == HIGH) {
            digitalWrite(controlPin2, LOW);

            // -- Dessa 3 rader visar STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
            lcd.setCursor(0, 1);
            lcd.print("User Stop");
            Serial.println("User removeable module defined stop 2");
            delay(50);

            // -- Dessa tre rader nedanför gör pipljudet när UPP & NER stopsensorn (ovan) täcks
            tone(tonePin, 600);
            delay(50);
            tone(tonePin, 950);
            delay(70);
            tone(tonePin, 800, 125);
            delay(800);
            noTone(tonePin);
          }
        }


        // ---- NER HINDRAS av denna sensor
        {
          val = digitalRead(stopsensor1Pin);         // Sensorn 1 som stoppar motorn, likaså sensor 3 vars uppgift är att stoppa både upp och ner
          if (val == HIGH) {
            digitalWrite(controlPin2, LOW);

            // -- Dessa 3 rader visar DOWN STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
            lcd.setCursor(0, 1);
            lcd.print("Down Stop");
            Serial.println("Lower security sensor reached Can only go up");
            delay(50);

            // -- Dessa tre rader nedanför gör pipljudet när stopsensorn (ovan) täcks påvägen ner
            tone(tonePin, 880);
            delay(125);
            tone(tonePin, 400, 125);
            delay(650);
            noTone(tonePin);
          }

          // -- Dessa 3 rader visar DOWN när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
          lcd.setCursor(0, 1);
          lcd.print("Down");
          Serial.println("Lift going down at full speed");
          delay(50);
        }

        // -- Dessa två rader stoppar motorn när man släpper knappen
      }  else
      {
        digitalWrite(controlPin1, LOW);
        digitalWrite(controlPin2, LOW);
      }


    }   // Går till Åker ner
  }     // Går till Åker upp
}       // Går till puls o grafikräkning - Högst upp


Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: UNO att minnas vad siffran var senast?

Inlägg av Icecap »

Det sätt du gör det på just nu fungerar inte så himla bra till det du vill uppnå. Så ja, ditt sätt är fel.

Men då jag inte rör vid Arduino-skiten vet jag inte vilka EEPROM-funktioner det finns. Det finns ju EEPROM.Get(Address, Variabel) och den kan kanske fungera till att hämta hela blocken: EEPROM.Get(0, Config); (Efter att Config är definierat.)

OM det fungerar ska EEPROM.Put(0, Config); också fungera.
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: UNO att minnas vad siffran var senast?

Inlägg av SeniorLemuren »

En för att använda structur har jag visat här och hänvisat dig till ett par gånger och nu kommer frågan upp igen i en tredje tråd.

(se exemplet spara variabler i EEPROM.)
Structuren "MyObject" som sparas är i detta exempel 2 heltal int field1; och int field2;
men kan vara flyttal char osv och ha andra önskade namn
sedan ger du önskad data till elementen i strukturen.
Data som skall sparas.
MyObject customVar = { 40, 280 };
(Se exemplet på hur du läser det sparade.)
Skapa variabeln customVar att lägga strukturen: MyObject customVar;
Hämta Sedan structuren:
EEPROM.get( eeAddress, customVar );
Nu har du dina datavariabler i customVar.field1 och customVar.fiel2.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: UNO att minnas vad siffran var senast?

Inlägg av fosfor »

Minnsedelen som jag använder är

Kod: Markera allt

float f = 0.00f;
Skulle jag även kunna ha en till genom att skriva

Kod: Markera allt

float g = 0.00f;
Om jag vill hat två separata delar att spara till så att säga.
g och f är väl bara namnet när de står efter float?

?
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: UNO att minnas vad siffran var senast?

Inlägg av lillahuset »

Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: UNO att minnas vad siffran var senast?

Inlägg av fosfor »

SeniorLemuren:

Ditt tips verkar bra, ska försöka mig på det.

Skulle du kunna skriva vad allt betyder? Vad är det vad i koden?
Så att jag vet vart att använda den i förhållande till allt annat.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: UNO att minnas vad siffran var senast?

Inlägg av Icecap »

fosfor:
Det börjar bli mycket dags att du läser upp lite på C.

Att du inte ens förstår hur man deklarerar en variabel är ett problem - och ändå otroligt grundläggande.

Men ja, du kan deklarera:
float Flyttal_1, Flyttal_2, q, j; // osv

Då en C-kompiler nästan alltid har en "fixa-innan-start" som nollar RAM först och sedan kopierar in de konstanter man definierar (t.ex. const float Pi = 3.14159265) från ROM betyder det att om du vill ha ett givet värde nollad vid start kan du antingen låta bli att göra något och hoppas på det bästa (inte 100%), deklarera den med ett startvärde eller (bäst anser jag) deklarera variabeln och under initieringen av allting ge den ett känd värde.

Orsaken till att jag anser att det är bäst att ge den ett känd värde under initieringen är att det STÅR I KODEN, tydligt och klart. Man kan även lägga till en kommentar om varför den ska ha ett visst värde om det behövs.

Alltså:
float q; // Deklarerar q som flyttal
float q = 0.00f; // Deklarerar q som flyttal och initierar värdet till 0.00

Om en variabel inte tvunget MÅSTE ha ett visst värde (t.ex. att den räknas ut innan den används) ska man låta bli att initiera den med ett givet värde, det kastas ju ändå bort.
Skriv svar