insiderr
Goto Top

Arduino Nano, Startzähler zählt falsch

Hallo zusammen.
Ich habe ein Problem mit einem Startzähler beim Arduino NANO (Nachbau von Ali)

Und zwar zählt er die Sketchstarts zwei Mal, wenn man ihm den Saft abdreht (Stecker ziehen) aber nur ein Mal (wie gewünscht) wenn man den Resetbutton drückt.
Hier de Code:
#include <EEPROM.h> {{comment_single_line_double_slash:0}}
int startCounter = 0;     //int-Variable definieren

void setup() {
  Serial.begin(9600);

  startCounter = ReadEEPROM(0,5).toInt();   //gespeicherten Wert aus dem Festspeicher auslesen (erste 5 Zeichen)
  startCounter++; //Zähler hochsetzen

  Serial.print("StartCounter: "); Serial.println(String(startCounter));   //Wert ausgeben  

  String tmpString = String(startCounter);                                //Variable als String merken
  WriteEEPROM(0,tmpString,5);                                             //String in Festspeicher schreiben

}

void loop() {
  // put your main code here, to run repeatedly:
  // wird nicht benötigt
}



void WriteEEPROM(int StartPosition, String xString, int reservedLength)
{
  EEPROM.begin();  //Initialize EEPROM
  for(int i=0;i<reservedLength;i++)  //Schleife zum löschen des reservierten Speichers
  {
    EEPROM.write(0x0F + i + StartPosition, ""); //Write one by one with starting address of 0x0F  
  }

  for(int i=0;i<xString.length();i++)
  {
    EEPROM.write(0x0F + i + StartPosition, xString[i]); //Write one by one with starting address of 0x0F
  }
  EEPROM.end();
}

String ReadEEPROM(int StartPosition, int StringLength)
{
  EEPROM.begin();  //Initialize EEPROM
  String strText;   
  for(int i=StartPosition;i<StringLength+StartPosition;i++) 
  {
    strText = strText + char(EEPROM.read(0x0F+i)); //Read one by one with starting address of 0x0F    
  }
  return(strText);
}

Die Zeile mit "startCounter++;" macht der anscheinend zwei Mal direkt hintereinander.
Was läuft da falsch?

Content-Key: 8248160050

Url: https://administrator.de/contentid/8248160050

Printed on: August 6, 2024 at 06:08 o'clock

Member: HDA2023
HDA2023 Aug 05, 2024 at 16:22:15 (UTC)
Goto Top
Hast Du mal überprüft, welchen Wert die Variable startCounter hat, bevor das Inkrementieren durchgeführt wird?
Member: sabines
sabines Aug 05, 2024 at 22:44:14 (UTC)
Goto Top
Moin,

kann es sein, dass dein Programm beim Stecker ziehen den Speicher noch nicht gelöscht hat und da eine 1 steht, die dann auf zwei springt?

Und beim Reset wird der Speicher gelöscht, so das dein Zähler mit 0 anfängt?

Grüße
Member: insidERR
insidERR Aug 06, 2024 at 05:18:12 (UTC)
Goto Top
Hallo @HDA2023
Habe in setup() paar Zeilen ergänzt.
void setup() {
  Serial.begin(9600);
  Serial.println("setup ANFANG");  

  startCounter = ReadEEPROM(0,5).toInt();   //gespeicherten Wert aus dem Festspeicher auslesen (erste 5 Zeichen)
  Serial.print("StartCounter frisch aus dem Speicher: "); Serial.println(String(startCounter));   //Wert ausgeben  

  startCounter++;                           //Zähler hochsetzen

  Serial.print("StartCounter hochgezählt: "); Serial.println(String(startCounter));   //Wert ausgeben  

  String tmpString = String(startCounter);                                //Variable als String merken
  Serial.println("schreibe in Festspeicher: " + tmpString);  
  WriteEEPROM(0,tmpString,5);                                             //String in Festspeicher schreiben
  Serial.println("setup ENDE");  
}

Das ist die Ausgabe am Seriellen Monitor:

07:04:43.009 -> setup ANFANG <--- NANO an USB angeschlossen
07:04:43.009 -> StartCounter frisch aus dem Speicher: 30 <--- Wert >0 da der Sketch schon mehrmals gestartet wurde
07:04:43.042 -> StartCounter hochgezählt: 31 <--- das ist der Wert direkt nach startCounter++;
07:04:43.075 -> schreibe in Festspeicher: 31 <--- das wurde in den Speicher geschrieben
07:04:43.109 -> setup ENDE

07:05:08.742 -> setup ANFANG <--- NANO von USB getrennt und wieder dran
07:05:08.742 -> StartCounter frisch aus dem Speicher: 32 <--- warum plötzlich 32 ???????
07:05:08.742 -> StartCounter hochgezählt: 33
07:05:08.774 -> schreibe in Festspeicher: 33
07:05:08.807 -> setup ENDE

07:05:17.988 -> setup ANFANG <--- hier wurde der NANO per RESET-Taste neugestartet
07:05:17.988 -> StartCounter frisch aus dem Speicher: 33 <--- hier wieder der Wert aus dem Festspeicher
07:05:17.988 -> StartCounter hochgezählt: 34
07:05:18.019 -> schreibe in Festspeicher: 34
07:05:18.053 -> setup ENDE

@sabines: das soll ja auch so sein. Der Speicher soll nicht gelöscht werden. Ich will ja die Starts hochzählen.
Member: Strods
Strods Aug 06, 2024 updated at 05:58:55 (UTC)
Goto Top
Die Funktion zum Schreiben und Lesen des EEPROM sind fehlerhaft. Erwartet wird ein byte(0-255), keine Strings. Und die Umwandlung toInt() liefert dadurch dann einen nicht erwarteten Wert.

RTFM.

Gruß Strods