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-ID: 8248160050

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

Ausgedruckt am: 22.11.2024 um 01:11 Uhr

HDA2023
HDA2023 05.08.2024 um 18:22:15 Uhr
Goto Top
Hast Du mal überprüft, welchen Wert die Variable startCounter hat, bevor das Inkrementieren durchgeführt wird?
sabines
sabines 06.08.2024 um 00:44:14 Uhr
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
insidERR
insidERR 06.08.2024 um 07:18:12 Uhr
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.
13910172396
13910172396 06.08.2024 aktualisiert um 07:58:55 Uhr
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
insidERR
insidERR 06.08.2024 um 09:16:01 Uhr
Goto Top
@13910172396 danke für den Hinweiß
Habe den Code angepasst.
#include <EEPROM.h>      {{comment_single_line_double_slash:0}}

int startCounter = 0;     //int-Variable definieren

void setup() {
  Serial.begin(9600);
  Serial.println("setup ANFANG");  

  EEPROM.get(0, startCounter);              //Wert aus Speicher holen
  Serial.print("StartCounter frisch aus dem Speicher: "); Serial.println(startCounter);   //Wert ausgeben  

  startCounter++;                            //Zähler hochsetzen
  EEPROM.put(0, startCounter);              //Wert in Festspeicher schreiben

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

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

Trotzdem dasselbe Symptom. Ziehe ich den Stecker, holt er beim wiedereinstecken die zuletzt gespeicher Zahl +1
Dazu wird dann wieder 1 addiert.

09:12:00.640 -> setup ANFANG
09:12:00.640 -> StartCounter frisch aus dem Speicher: 12
09:12:00.672 -> StartCounter hochgezählt: 13
09:12:00.705 -> setup ENDE

09:12:09.443 -> setup ANFANG
09:12:09.443 -> StartCounter frisch aus dem Speicher: 14 <--- müsste 13 sein
09:12:09.489 -> StartCounter hochgezählt: 15
09:12:09.535 -> setup ENDE

09:12:17.751 -> setup ANFANG
09:12:17.751 -> StartCounter frisch aus dem Speicher: 16 <--- müsste 15 sein
09:12:17.751 -> StartCounter hochgezählt: 17
09:12:17.784 -> setup ENDE
13910172396
13910172396 06.08.2024 aktualisiert um 09:49:20 Uhr
Goto Top
Habe den Code angepasst.
Sieht hier nur keiner weil die Funktionen fehlen...
insidERR
Lösung insidERR 06.08.2024 aktualisiert um 14:29:18 Uhr
Goto Top
Das ist der gesamte Code.
Die Funktionen sind in EEPROM.h

Nachtrag:
Problem mit Hilfe von Copilot gelöst.
Abhilfe schaffte eine Verzögerung (1000ms) ganz am Anfang.