2017-05-13 1 views
-1

dies kann sehr konzeptionell sein, aber ich bin völlig aus Ideen zu diesem Thema. FYI Ich kodiere das in Arduino (C/C++).Guter Weg, um einen Wecker zu implementieren

Ich frage mich, was der beste Weg, um eine Alarmauslösung zu implementieren wäre.

Wie ich es jetzt habe, wandle ich die Zeit in Sekunden um und wandle die Alarmzeit in Sekunden um. Wenn die aktuelle Uhrzeit größer oder gleich der Alarmzeit ist, wird der Alarm ausgelöst.

Das funktioniert gut. Stellen Sie sich vor, ich setze die aktuelle Zeit auf 1 Uhr (3600 Sekunden) und die Weckzeit auf 2 Uhr (7200 Sekunden). Wenn die Gesamtzahl der Sekunden 7200 ist, wird der Alarm ausgelöst.

Mein Problem ist jedoch, dass wenn die aktuelle Zeit vor Mitternacht und die Alarmzeit nach Mitternacht eingestellt wird, der Alarm sofort ausgelöst wird.

In der Tat, stellen Sie sich vor, dass ich die aktuelle Zeit um 10 Uhr (ca. 70000 Sekunden) und die Weckzeit um 00:00:01 (1 Sekunde) einstellen. Die aktuelle Zeit ist größer als die Alarmzeit und wird sofort ausgelöst.

Irgendwelche Ideen, wie ich dies umgehen könnte, würden geschätzt.

+2

Haben Sie schon etwas versucht? Fragen nach _ "Irgendwelche Ideen?" _ Klingt zu breit, um hier gefragt zu werden. Dies kann zu einer endlosen Diskussion werden, die wir hier nicht wollen. Die Seite ist eher über prägnante FAQ wie Frage-Antwort-Paare. Vielleicht möchten Sie auch [hier] (http://stackoverflow.com/help/asking) lesen. –

+0

Nur ein Vorschlag, können Sie std :: time_t verwenden? – 7raiden7

+0

Fügen Sie für alle Zeiten die gesamten Sekunden des aktuellen Datums und der aktuellen Uhrzeit hinzu und fügen Sie der Alarmzeit weitere 86400 Sekunden hinzu, wenn diese um eine Uhrzeit höher als die aktuelle Uhrzeit eingestellt ist. –

Antwort

0

Während Sie das Problem einstellen, sollten Sie nicht prüfen, ob ein Wert größer als der andere ist, aber wenn die Laufzeit den Alarm überschritten hat. Angenommen, der Alarm befindet sich an Punkt a. Die Zeit war alt und jetzt ist es t. Was wir überprüfen müssen, ist, ob a zwischen t_alt und t ist. Das scheint leicht zu sagen, aber ein bisschen schwieriger zu tun.

Jeder Weg, subtrahiert von allen Werten t_old, haben wir t_old = 0 a-t_old und t-t_old. Also mit Usigned Arithmetik, wenn a-t_old ist < t-t_old es ist Ihr Fall (überprüfen Sie es, und wenn ich einen Fehler habe, informieren Sie mich).

+0

Danke für den Vorschlag, howecer Ich glaube nicht, dass das funktionieren wird. Angenommen, ich setze die aktuelle Uhrzeit um 18 Uhr (t_alt). Es ist jetzt 20 Uhr (t). Der Alarm ist auf 15 Uhr eingestellt (a). Mit der Formel gilt 15-18 <20-18. Dies sollte jedoch nicht passieren. In der Tat muss der Alarm 19 Stunden dauern, bis er 15 Uhr erreicht, aber die Bedingung wird ausgelöst –

+0

Jedes Mal, wenn Sie den Alarm überprüfen, setzen Sie t_old = t und t = now. Angenommen, Sie überprüfen alle 5 Minuten nach Alarmbedingungen, dann ist das letzte Mal, als Sie nachgesehen haben, 19:55 Uhr und jetzt 20:00 Uhr. Der Alarm wird um 15:00 Uhr eingestellt. Wir verwenden Integer-Vorzeichen ohne Vorzeichen und subtrahieren von 20:00 Uhr 19:55 Uhr und von 15:00 Uhr 19:55 Uhr (Sie sollten die Zeit in Sekunden vor der Hand umgewandelt haben). Das Ergebnis ist, dass 20:00 Uhr 00:05 und 15:00 Uhr wird, wenn die vorzeichenlose Arithmetik wird (24: 00 + 15: 00-19: 55 = 20: 55). Also haben wir jetzt, dass 20:55 nicht kleiner (oder gleich) ist als 00:05, also wurde der Alarm nicht so ausgelöst, wie er sein sollte. –

Verwandte Themen