Hallo, ich bastel gerade etwas mit einem RTC und einem Arduino rum. Die Beispiel Codes funktionieren auch soweit. Jetzt wollte ich mir ein kleines Alarmprogramm schreiben, welches bei einer bestimmten Uhrzeit, eine Aktion ausführt (LED einschalten z.B.) Die Ausgabe in dem Beispielcode sieht wie folgt aus: tmElements_t tm; if (RTC.read(tm)) { Serial.print("Time = "); print2digits(tm.Hour); Serial.write(':'); print2digits(tm.Minute); Serial.write(':'); print2digits(tm.Second); Ich wollte jetzt die komplette Uhrzeit (tm.Hour:tm.Minute:tm.Second) in eine Variable schreiben, so das ich sie abfragen kann ... if (Time == 12:00:00){ Alarm } Kriege vom Compiler aber immer eine Fehlermeldung: error: invalid conversion from 'const char*' to 'char' Kenne mich damit leider noch nicht so richtig aus. Kann mir jemand sagen, wie ich die drei Elemente Hour, Minute und Second in einer Variable schreiben kann ?. Vielen Dank im voraus. Lieben Gruß Christian
Vergleiche die einzelnen Elemente einfach separat:
1 | if (tm.Hour = 12 && tm.Minute = 0 && tm.Second = 0) { |
2 | ... |
3 | } |
Christian B. schrieb: > error: invalid conversion from 'const char*' to 'char' Du willst eine Variable (Time) mit einer Zeichenkette (String) vergleichen. Das geht nicht! Eher so:
1 | static uint8_t Lock = 0; |
2 | ...
|
3 | ...
|
4 | |
5 | if ((tm.Hour == 12) && (tm.Minute == 0) && (tm.Second == 0) && !Lock)){ |
6 | Lock = 1; |
7 | mach etwas nur einmal; |
8 | }else if (tm.Second != 0){ |
9 | Lock = 0; |
10 | }
|
So müsste es besser gehen
greg schrieb: > if (tm.Hour = 12 && tm.Minute = 0 && tm.Second = 0) { > ... > } Man bedenke das dieser Aufruf durchaus öfter vorkommt, wenn das Programm hier weniger als 1s für den Durchlauf benötigt! Ingo
Ingo schrieb: > greg schrieb: >> if (tm.Hour = 12 && tm.Minute = 0 && tm.Second = 0) { >> ... >> } > Man bedenke das dieser Aufruf durchaus öfter vorkommt, wenn das Programm > hier weniger als 1s für den Durchlauf benötigt! > Das ist doch eine andere Baustelle. Polling ist sowieso eine sehr schlechte Idee.
greg schrieb: > Polling ist sowieso eine sehr > schlechte Idee. Nicht wenn es in einer ISR stattfindet! Das ist das nämlich die Beste Idee!
Das Konstrukt 12:00:00 funktioniert nicht, wie oben erklärt (ich wusste gar nicht dass man einen string überhaupt ohne Anführungszeichen deklarieren kann) Es gibt das Standardformat Unix Time Stamp, das sind glaube ich die Millisekunden seit 1980 oder so, passt in einen long. Wenn du kleinere Zahlen benötigt bastel dein eigenes Format, entweder auch fortlaufend zB in Sekunden oder mit versetzten Stellen, also bei 12:00:00 entweder: 120000, das ist eindeutig, passt in uint32, hat aber Lücken in den Zahlen. A la Unix timestamp könntest du aber auch variablesek = 12*(24*60)+00*60+00 = 34560 (keine Gewähr im Kopf berechnet ;) ) somit müssten 24h sogar in 16 bit passen. Ich weiß nicht bei welcher Methode vergleiche und Manipulationen einfacher sind, Größer kleiner ist gleich geht beides normal, das erstellen der Zahl könnte per macro oder Funktion passieren. Auch eine rück Konvertierung sollte einfach gehen.
greg schrieb: > Das ist doch eine andere Baustelle Und warum dies? Das ist genau die Baustelle in die er als nächstes gerät...
Lenny D. schrieb: > Das Konstrukt 12:00:00 funktioniert nicht, wie oben erklärt (ich wusste > gar nicht dass man einen string überhaupt ohne Anführungszeichen > deklarieren kann) Das hängt von der Programmiersprache ab. Lenny D. schrieb: > Es gibt das Standardformat Unix Time Stamp, das sind glaube ich die > Millisekunden seit 1980 oder so, Die Anzahl der Sekunden seit dem 01.01.1970 Bei Microsoft zählt es erst seit 1980
Dirk B. schrieb: > Bei Microsoft zählt es erst seit 1980 Oder seit 1601: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724284%28v=vs.85%29.aspx
Hallo, danke für all' Eure antworten. Habe jetzt mal Ingos Vorschlag als erstes Versucht und klappt auch soweit. Vor dem !Lock fehlte wohl noch eine öffnende Klammer. if ((tm.Hour == 12) && (tm.Minute == 0) && (tm.Second == 0) && (!Lock)){ Ingo schrieb: > static uint8_t Lock = 0; > ... > ... > > if ((tm.Hour == 12) && (tm.Minute == 0) && (tm.Second == 0) && !Lock)){ > Lock = 1; > mach etwas nur einmal; > }else if (tm.Second != 0){ > Lock = 0; > } Vielen Dank. Gruß Christian
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.