Mit Taster Betriebsstunden zurücksetzen

Hallo Zusammen,

ich würde gerne meinen Betriebsstundenzähler mit einem Taster zurücksetzen. Soweit kein Problem.

Wie bekomme ich es aber hin, dass der Zähler erst zurücksetzt wenn ich den Taster 5s lang gedrückt halte? Stehe gerade auf dem Schlauch und bin für jede Hilfe dankbar! :roll_eyes:

Grüße

bool FiveSecondsDetected;
long StartValueMs;

if (! digitalRead(DEIN_PIN_FUER_DEN_TASTER) // Invertierte Logik, interner Pullup
{
  FiveSecondsDetected = false;
  StartValueMs = millis();
  while ((! digitalRead(DEIN_PIN_FUER_DEN_TASTER) && (!FiveSecondsDetected))
  {
      if ((millis() - StartValueMs) >= (5 * 6000))
      {
          FiveSecondsDetected = true;
      }

      // Oder unübersichtlich das if gleich ersetzen durch 
      //
      // FiveSecondsDetected =  ( (millis() - StartValueMs) >= (5 * 6000) );
      //
   }
}

if (FiveSecondsDetected)
{
   // Tue was du für richtig hälts 
   // z.B. Betriebsstundenzähler zurücksetzen
}

Ulli

Was ist der Betriebsstundenzähler beim Arduino?
grüße Uwe

Ich hatte aufgrund eines Projekts die Aufgabe mehrere Betriebsstundenzähler mit LCD-Anzeige mit Arduino zu programmieren...

@Ulli: Vielen Dank dafür!

Ich möchte jetzt noch meine Zähler bei Spannungs/Stromausfall ins EEPROM schreiben. Solange ins EEPROM geschrieben wird möchte ich die Spannung mit einem Elko aufrechterhalten.

Habe aber so meine Schwierigkeiten mit EEPROM und unsigned long variablen...

Gibt es auch irgendeine Möglichkeit alles was auf dem LCD zu sehen ist bei Spannungsabfall abzuspeichern und danach wenn Spannung wieder da ist wieder auf das Display zu schreiben?

Die EEPROM Lib ist doch einfach.

#include <avr/eeprom.h>

typedef struct _MY_EEPROM
{
char MY_ID[4]; // eindeutige ID
char LCD_Line1[21]; // LCD Zeile 1
char LCD_Line2[21]; // LCd Zeile 2
/*
.
. Sonstige Daten
.
*/
} MY_EEPROM;

MY_EEPROM EepromBuffer;

//---------------------------------------------------------------------------

void ReadEEPROM()
{
eeprom_read_block((void *) &EepromBuffer,0,sizeof(_MY_EEPROM));
}

//---------------------------------------------------------------------------

void WriteEEPROM()
{
eeprom_write_block((void *) &EepromBuffer,0,sizeof(_MY_EEPROM));
}

//---------------------------------------------------------------------------

In die Bytes MY_ID schreibst du eine Kennung damit du
beim Einschalten erkennen kannst ob schon mal jemand das
EEPROM mit deinen Daten beschrieben hat.
Wenn ja sind die anderen Daten gültig und können benutzt und
veränder werden und wieder weggeschrieben werden.

Nur so als Bleistift :slight_smile:

Ulli

Okay diese Lib habe ich noch nie gesehen.

Dann versuche ich mal mein Glück! Danke!

Wenn Du zB eine RTC DS1307 mit 56 Byte RAM nimmst dann kannst Du kontinuirlich die Betriebsstunden reinschreiben ohne auf die MAx Anzahl der Schreibzyklen achten zu müssen und ohne vorkehrungen treffen zu müssen die Daten im letzten Abdrücker ins EEprom schreiben zu müssen bevor der Strom ausgeht. Gleiches gilt für ein FRAM von RAMTEC. Grüße Uwe

Also ich habe eine Anwendung die schreibt alle 3 Stunden statistik Werte in das EEPROM. Wenn ich von den 100000 Schreibzyklen ausgehen reicht das 34 Jahre. Es kommt halt immer darauf an. Wenn er wirklich eine Powerdownlogik drann hängt und das Ding alle Jubeljahre(tage) mal einen Stromausfall hat, dann ist das warscheinlich völlig unkritisch. Jeden Tag 2 Stromausfälle wären dann schon fast 137 Jahre !

Ulli

Ja das reicht mir locker ;) Stromausfall kommt ja wirklich nur relativ selten vor...

hi,

Stromausfall kommt ja wirklich nur relativ selten vor...

und genau das ist das problem dabei...

Du kannst Dir sicher sein, daß es genau dann NICHT funktioniert.

wenn's nicht SOOO genau sein muß, dann nimm, wie uwe schreibt, eine RTC (womit Du auch gleich eine viel genauere zeit hast), schreib' in den speicher der RTC jede minute die zeit rein, lese es zur sicherheit auch gleich wieder aus und zeige das für 5 sekunden am display an. es ist sicherer und Du kannst was vorführen...

gruß stefan

Und dann ist genau wenn es wichtig ist die Pufferbatterie leer :o

Ulli

beeble2: Und dann ist genau wenn es wichtig ist die Pufferbatterie leer :o

Wenn das wirklich so kritisch ist, dann könnte man die Stromversorgung der RTC über den Arduino abschaltbar machen. Man schaltet für einen Moment die Spannung ab und schaut, ob die Uhr die Daten nicht vergessen hat. Vielleicht gibt es noch einen eleganteren Weg.

Ich sehe überhaupt nicht wo das Problem mit dem EEPROM ist. Wenn man abschätzen kann wie oft man es schreiben muss, dann ist doch alles klar. Und die Logik die den Stromausfall erkennt und via Interrupt das Sichern einleitet ist ja im Netz ausgiebig beschrieben und einfach.

Ulli

Mit dem EEPROM gibt es auch überhaupt kein Problem ;)