Guten Abend,
ich versuche gerade mit dem Arduino UNO einen Betriebsstundenzähler zu
programmieren.
Sinn ist es - immer wenn eine Lampe über ein Relais angesteuert wird,
wird die Zeit gezählt, und solange wie sie auch leuchtet.
Programmiertechnisch erstmal kein Problem.
ABER?!?!?!?!
Ich möchte die Zeiten natürlich auf die SD Karte speichern, wenn der
Strom weg ist soll er ja nicht von vorn anfangen.
kurz geschrieben...
.
.
signed long gezählte Zeit;
.
gezählte Zeit++;
.
myFile.write(gezählte Zeit); //Schreibe auf SD
.
.
Wenn ich jetzt die gezählte und gespeicherte Zeit wieder ausgebe dann
macht er dass nur bis 255, also 255 Stunden.
Mathematisch habe ich es auch versucht mit der "float" Variable aber ich
muss bis zu 6000h Zählen können. Außerdem ist es wichtig das er schon
genau Zählt, ich könnte auch aller 6h Stunden einmal zählen, das ist mir
zu ungenau fall doch mal Stromausfall oder sowas ist. :)
Habt ihr ein Tipp wie ich das umsetzen könnte?
Martin T. schrieb:> Ich möchte die Zeiten natürlich auf die SD Karte speichern, wenn der> Strom weg ist soll er ja nicht von vorn anfangen.
Wenn es einzig und alleine nur darum geht, dann wäre aber das EEPROM das
dafür geeignete Mittel der Wahl. Genau dazu ist es gedacht, sich Werte
so zu speichern, dass sie einen Stromausfall überleben.
> myFile.write(gezählte Zeit); //Schreibe auf SD> Wenn ich jetzt die gezählte und gespeicherte Zeit wieder ausgebe dann> macht er dass nur bis 255, also 255 Stunden.
Dann würde ich mir an deiner Stelle mal ansehen, ob es überhaupt eine
write Funktion gibt, die einen signed long speichern kann. Deiner
Beschreibung nach könnte man vermuten, dass es so eine gar nicht gibt
und ein write immer nur 1 Byte schreibt.
> Mathematisch habe ich es auch versucht mit der "float" Variable
Ganz schlechte Idee. floats willst du nicht verwenden. Schon gar nicht,
wenn die zu speichernde Größe ihrer Natur nach gar kein float ist.
> Habt ihr ein Tipp wie ich das umsetzen könnte?
Sieh dir den write Aufruf an.
Und dann steck deine Karte mal in einen PC und sieh nach, was überhaupt
auf der Karte gelandet ist. Möglichkeiten gibt es viele, was da schief
gehen kann.
Stimmt, normaler weise macht man das mit tft.print.
Aber dann kommt beim lesen mehrere Zahlen und nicht die Stunden. :(
Habe es jetzt erstmal meine float in die INT Variable geändert.
Mit dem EEProm ist das selbe, auch da nur bis 255. Ich weiß dass, das
normal ist, nur wie kann ich das ganze umrechnen. Also
Programmtechnisch?
Martin T. schrieb:> Stimmt, normaler weise macht man das mit tft.print.> Aber dann kommt beim lesen mehrere Zahlen und nicht die Stunden. :(
Zeig doch mal Code.
Ich programmier nicht mit dem Arduino Framework und weiss noch nicht
einmal welche Klasse du benutzt. Schreibst du in Textform aufs File oder
binär ..... Fragen über Fragen.
Ist halt immer derselbe Käse mit den Leuten, die ihre Programmiersprache
nicht gelernt haben.
> Mit dem EEProm ist das selbe, auch da nur bis 255. Ich weiß dass, das> normal ist, nur wie kann ich das ganze umrechnen. Also> Programmtechnisch?
Mit den richtigen Funktionen brauchst du da überhaupt nichts umrechnen.
eeprom_read_block bzw. eeprom_write_block ist dein Freund
Habe es jetzt mal ausprobiert, fehler beim kompilieren. :(
Ich bin halt nur Hobbyprogrammierer, so tief stecke ich in der Materie
nicht drin, geht schon gar nicht wegen Beruf und Kind. ;)
Trotzdem stark, dass einem hier immer so schnell geholfen wird auch wenn
es für die SuperPros nervig ist. :D
Martin T. schrieb:> //Schreibe in EEPROM> EEPROM.write(addr, time, timeEEPROM, sizeof(time));
Das ist nicht das was ich benutzt habe.
Du musst schon ein wenig genauer lesen!
EEPROM.write ist nicht dasselbe wie eeprom_write_block.
> Karl H. schrieb:> Das ist nicht das was ich benutzt habe.> Du musst schon ein wenig genauer lesen!>> EEPROM.write ist nicht dasselbe wie eeprom_write_block.
Auch da zeigt er mir fehler an.
Habe es auch mal so probiert.
EEPROM.write.Block( &time, &timeEEPROM, sizeof( time ));
Ich weiß nicht weiter.
Hallo
Schreib doch die stunden in mehrere bytes,undrechne das ganze dann
zusammen, keine ahnung ob du die stunden auf eine lcd anzeigen möchtest
oder auf der sc karte loggen?
z.b. 100 h
Byte1: 100
Byte2: 0
z.b. 300 h
Byte1: 0
Byte2: 3
z.b. 999 h
Byte1: 99
Byte2: 9
Total = byte1 + (byte2 x 100)