Problem mit dem speichern einer variabel bei Stromausfall (EEPROM geht nicht)

Hallo zusammen,

ich habe ein Problem ich habe einen Sketch, welcher einen Schrittmotor bewegt.
der Sketch ist untern so wie er grade ist

Die Uhr soll Minuten und stunden anzeigen. daher macht der Motor jede Minute eine Bewegung und überschreibt die variabel mminute. jetzt ist es wenn der Strom Verbindung mal abricht ist der Motor und das Getriebe hat auf z.B. auf 3 Sunden 20 Minuten steht dann fängt das Programm ja wieder bei 0 stunden 0 Minuten an. da ich aber später noch ein DCF 77 Empfangsmodul einbauen will das die Uhr immer richtig geht würde die Uhr intern mit 0 stunden 0 min rechnen und nach außen um 3 stunden 20 min falsch gehen.

meine Idee war es jetzt das man Minuten und stunden Irgendwo hin Speichert und das dann immer überschreibt.

ich habe schon ein paar frage Stellungen im Forum gelesen da haben sich die Probleme immer mit EEPROM lösen lassen, da ich aber auf die 10.000 schreib Vorgänge nach einer Woche erreicht habe ist das leider keine Lösung für mich.

daher meine frage hat von euch einer eine Idee wie ich die Minuten und stunden speichern kann oder einer andere Lösung ?

Vielen Danke für einer Hilfe

mein Sketch

 #include <Stepper.h>
 int mminute;
 int mstunde;
 //Uhr motoruhr(mminute, mstunde); //konstruktor Viruelle uhr  
 const int stepsPerRevoluttion = 2048; 
 const int rolePermin =15;
 int comRate;
 
 Stepper myStepper(stepsPerRevoluttion, 8, 10, 9, 11);
 
 
 long int millism;
 void setup() {
   myStepper.setSpeed(rolePermin);
   Serial.begin(9600);
   millism = millis();
   
 }
 
 void loop() {
   
   // put your main code here, to run repeatedly:
   if (millism%60000==0)//60 sekunden für den test 
   mminute++;
   Serial.println();
   myStepper.step(32);
   //myStepper.step(stepsPerRevoluttion/64);
   
   if(mminute==60){
     mstunde++;
     mminute=0;
   }
   if (mstunde==24){
     mstunde=0;
   }
   Serial.print(mstunde);
   Serial.println(mminute);
 }

warum nimmst du nicht einfach ein RTC-Modul, dann hast du immer die richtige Uhrzeit.

Wenn du dann später mal ein DCF Modul dazu hängst, kannst ja immer noch deine Uhrzeit "nachbessern". Aber ich würde mit einem RTC anfangen.

ja das geht auch Antenne oder rtc Modul mal schauen ich dann noch aber das nützt mir nichts bei dem Speicher Problem wenn der Strom ausfällt denkt der Arduino das der Motor noch keine Drehungen gemacht hat und das Getriebe mit den Zeigern gibt ja kein Feedback also weiß der Arduino nicht wie die Zeiger stehen der denkt es ist 0 stunden 0 min. das eigentliche Problem ist es die variabel auf einen Speicher zu schreiben welcher nicht flüchtig. hast du da vielleicht eine Idee wie man das anstellen kann oder womit ?

aber danke für den tipp mit dem RTC Modul :smiley:

aber danke für den tipp mit dem RTC Modul :smiley:

Auf vielen RTC Modulen findet sich ein EEPROM.

Mit dem passenden Wearleveling Code könnte das lange halten.
Ansonsten kannst du das auch durch ein FRAM ersetzen.
Das hält dann noch viel länger

da ich aber auf die 10.000 schreib Vorgänge nach einer Woche erreicht habe ist das leider keine Lösung für mich.

Alternativ:
Stromausfall rechtzeitig erkennen und dann, nur dann, den Wert ins EEPROM schreiben.

nein, außer EEPROM (oder andere nicht volatile Speicher) fällt mir nichts ein.
Auf vielen RTC Modulen gäbe es einen zusätzlichen EEPROM.

Auch haben einige RTC Chips (DS3232) ein paar batteriegepufferte RAM Speicherzellen die man nutzen könnte. Ob du aber ein Modul mit einem DS3232 findest (und der dann auch wirklich einen drauf hat) müsstest du probieren (den letzten den ich gesehen habe wurde mit DS3232 beworben aber lt Beschreibung nur ein DS1302 drauf gehabt, den willst aber auch wieder nicht).

Ich würde den Motoren/Zeigern eher einen Sensor/Nullung geben um nach dem Einschalten auf diese Nullung fahren zu können und anschließend die richtige Uhrzeit anfahren zu können.

Um welches Board geht es denn? Das EEPROM auf den AVR Boards hat mindestens 100000 Schreibzyklen ( pro Zelle ). Nur das Flash ist auf 10000 begrenzt. Externe I²C EEPROMs haben in der Regel sogar 1000000 Schreibzyklen.
Da die Schreibzyklen pro Zelle gelten, kann man das durch Verteilen auf mehrere Zellen ( z.B. je nachdem wie die Stunden gerade stehen, werden die Minuten in unterschiedlichen Zellen gespeichert ) noch deutlich ausdehnen.
Die beste Lösung ist aber definitiv der schon vorgeschlagene Weg, die Nullstellung erkennen zu können. So machen das z.B. auch aller mir bekannten Zeiger-Funkuhren: Wenn die Batterie eingelegt wird, stellen sie sich erstmal auf 12:00 - und von da aus wird dann die aktuelle Zeit eingestellt.

Stromlose Schrittmotoren haben kein Haltemoment und können sich durch einen Windhauch verstellen. Die alte Position ist daher ungewiß. Daher nach Reset:

  • Referenztaster anfahren
  • Uhrzeit ermitteln
  • Uhrzeit anzeigen

danke für die vielen guten Ideen!

das mit dem Reset finde ich ist ein gute Ansatz, hast du eine Idee wie sich das umsetzten lässt, da der motor die dem Getriebe ja kein feedback bekommt, und ich den daher schlecht auf 00:00 oder 12:00 zurücksetzen kann. gibt es einen Befehl der sagt gehe ich Ausgangsstellung zurück?

agmue:
Stromlose Schrittmotoren haben kein Haltemoment und können sich durch einen Windhauch verstellen. Die alte Position ist daher ungewiß. Daher nach Reset:

  • Referenztaster anfahren
  • Uhrzeit ermitteln
  • Uhrzeit anzeigen

Stromlose Schrittmotoren haben kein Haltemoment

Das würde ich nicht so sagen.
Schrittmotore haben ein kleines Haltemoment.
So wie ich das verstanden habe hat der TO einen Motor für Stunden und Minutenzeiger. Darum ist ein Getriebe dazwischen.
Wenn die Zeiger so schwer sein sollten daß sie von alleine drehen kann man die Zeiger so formen daß ein Gegengewicht eingebaut werden kann bzw auf der Achse.

Es gibt RTC mit batteriegepufferten Speicher. zB DS1307 oder DS3232 Ich habe den 3232 noch nie auf einem RTC Modul gefunden. Man könnte den DS3231 von der Platine abzulöten und einen 3232 drauflöten.
Andererseits wenn Du ein DCF77 Modul brauchst Du keine so genaue RTC wie die 3232.

Das RAM auf dem 1307 bzw 3232 kann unendlich oft beschrieben oder gelesen werden.

Grüße Uwe

mio313:
das mit dem Reset finde ich ist ein gute Ansatz, hast du eine Idee wie sich das umsetzten lässt, da der motor die dem Getriebe ja kein feedback bekommt, und ich den daher schlecht auf 00:00 oder 12:00 zurücksetzen kann. gibt es einen Befehl der sagt gehe ich Ausgangsstellung zurück?

Einen Befehl gibt es da wohl nicht. Aber solange man nicht weis, welche HW Du einsetzt, kann man keine fundierten Tips geben. Poste mal einen Link auf die verwendete HW, oder ein Foto und technische Daten vom Stepper - und welches Board Du einsetzt.

uwefed:
Schrittmotore haben ein kleines Haltemoment.

Kommt auch drauf an, ob sie mit Microsteps betrieben werden. In den Zwischenpositionen haben sie absolut kein eigenes Haltemoment, nur an den Rastpunkten.

uwefed:
Schrittmotore haben ein kleines Haltemoment.

Auf das ich mich aber nicht verlassen wollte.

mio313:
... hast du eine Idee wie sich das umsetzten lässt, ...

Ja, das ist Standard, mit einem Taster, der bei einer bestimmten Position ein Signal abgibt. Anstelle eines mechanischen Tasters nehme ich gerne Reflexlichtschranken oder dergleichen, also berührungslos. Der Referenztaster ist mit einem digitalen Eingang des µCs verbunden und kann irgendwo innerhalb der 360 Grad angebracht sein, es muß nicht 12 Uhr sein.

hätt ich auch so gemacht, Lichtschranken oder LDR

ist es nach dem einschalten "dunkel" ist einer der beiden Zeiger schon am Ausgangspunkt, aber das kann man mit Programmlogik schön abfangen.

mio313:
Die Uhr soll Minuten und stunden anzeigen. daher macht der Motor jede Minute eine Bewegung und überschreibt die variabel mminute. jetzt ist es wenn der Strom Verbindung mal abricht ist der Motor und das Getriebe hat auf z.B. auf 3 Sunden 20 Minuten steht dann fängt das Programm ja wieder bei 0 stunden 0 Minuten an. da ich aber später noch ein DCF 77 Empfangsmodul einbauen will das die Uhr immer richtig geht würde die Uhr intern mit 0 stunden 0 min rechnen und nach außen um 3 stunden 20 min falsch gehen.

Nimm eine RTC; die 3231 hätte einen Alarmspeicher.
In den schreibst Du bei jedem Schritt die Zeit, wo die Uhr steht (stehen soll).
Wenn der Saft wiederkommt, vergleichst Du - im setup() - die Zeit der RTC mit der Alarmzeit -> Die Abweichung ist Deine Schrittvorgabe.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.