Forum: Mikrocontroller und Digitale Elektronik Betriebsstundenzähler für Terrarium UV Lampen - Arduino


von Nitram E. (slexx)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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
von Nitram E. (slexx)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

Wieso eigentlich signed?
Können deine Betreibsstunden auch negativ sein?

von Nitram E. (slexx)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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

von Nitram E. (slexx)


Lesenswert?

> 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.

von Swisser (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.