Forum: PC-Programmierung Problem mit Variable in C


von Christian B. (sourcecode)


Lesenswert?

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

von greg (Gast)


Lesenswert?

Vergleiche die einzelnen Elemente einfach separat:
1
if (tm.Hour = 12 && tm.Minute = 0 && tm.Second = 0) {
2
  ...
3
}

von Ingo (Gast)


Lesenswert?

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

von Ingo (Gast)


Lesenswert?

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

von greg (Gast)


Lesenswert?

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.

von Ingo (Gast)


Lesenswert?

greg schrieb:
> Polling ist sowieso eine sehr
> schlechte Idee.
Nicht wenn es in einer ISR stattfindet! Das ist das nämlich die Beste 
Idee!

von Lenny D. (le-do)


Lesenswert?

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.

von Ingo (Gast)


Lesenswert?

greg schrieb:
> Das ist doch eine andere Baustelle
Und warum dies? Das ist genau die Baustelle in die er als nächstes 
gerät...

von Dirk B. (dirkb2)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?


von Christian B. (sourcecode)


Lesenswert?

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