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.
:
Bearbeitet durch User
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
1 | signed long time; |
2 | signed long timeEEPROM EEMEM; |
3 | |
4 | |
5 | // von time zur 'Variablen' ins EEPROM schreiben
|
6 | eeprom_write_block( &time, &timeEEPROM, sizeof( time ) ); |
7 | |
8 | ....
|
9 | |
10 | // von der 'Variablen' im EEPROM den Wert nach time holen
|
11 | eeprom_read_block( &time, &timeEEPROM, sizeof( time ) ); |
:
Bearbeitet durch User
Wieso eigentlich signed? Können deine Betreibsstunden auch negativ sein?
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
1 | #include <EEPROM.h> |
2 | |
3 | signed long time; |
4 | signed long time_auslesen; |
5 | signed long timeEEPROM; |
6 | |
7 | int addr = 0; |
8 | |
9 | void setup() |
10 | {
|
11 | Serial.begin(9600); |
12 | }
|
13 | |
14 | void loop() |
15 | {
|
16 | //Schreibe in EEPROM
|
17 | EEPROM.write(addr, time, timeEEPROM, sizeof(time)); |
18 | |
19 | //LESE AUS EEPROM
|
20 | time_auslesen = EEPROM.read(addr); |
21 | Serial.println(time_auslesen); |
22 | |
23 | time++ |
24 | delay(1000); |
25 | }
|
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
und da
1 | signed long timeEEPROM; |
hatte ich auch einen Zusatz zur Variablen, die dem Compiler mitteilt, dass diese im EEPROM residieren soll! https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM
> 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)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.