arduino:schlafphasenwecker:programmversion_0.1
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
arduino:schlafphasenwecker:programmversion_0.1 [27.11.2016 15:40] – Frickelpiet | arduino:schlafphasenwecker:programmversion_0.1 [18.05.2023 12:34] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Schlafphasenwecker - Programmversion 0.1 ====== | ====== Schlafphasenwecker - Programmversion 0.1 ====== | ||
+ | <box 30% green right|**Achtung**> | ||
Hilfreiche Links: | Hilfreiche Links: | ||
* Time Library: http:// | * Time Library: http:// | ||
+ | * http:// | ||
* Timestamp Generator: http:// | * Timestamp Generator: http:// | ||
+ | * https:// | ||
+ | |||
+ | Bekannte Probleme: | ||
+ | * Beim Aufspielen eines neuen Sketches wird nicht immer die Zeit synchronisiert. | ||
+ | * Es ist außerdem nicht sinnvoll, dass auf den seriellen Monitor gewartet wird. Perspektivisch wird der Wecker ohne Verbindung zum Computer betrieben. | ||
+ | * Manchmal scheint das DCF-Modul kein verwertbares Signal auszugeben. Wenn man ihn dann bewegt, an den Käbelchen wackelt, mit dem FInger über die Bauteile schreicht, geht er dann wieder. Ich muss noch herausfinden, | ||
+ | |||
+ | < | ||
+ | // Bibliotheken einbinden | ||
+ | #include < | ||
+ | #include " | ||
+ | |||
+ | |||
+ | // Definiert die Pins | ||
+ | #define DCF_PIN 2 // Connection pin to DCF 77 device | ||
+ | #define DCF_INTERRUPT 2 // Interrupt number associated with pin | ||
+ | #define PIN_LED 13 | ||
+ | |||
+ | |||
+ | // Definiert irgendwas mit dem DCF77 | ||
+ | DCF77 DCF = DCF77(DCF_PIN, | ||
+ | |||
+ | |||
+ | |||
+ | // Definiert die Variablen | ||
+ | bool DCFTimeFound = false; | ||
+ | |||
+ | time_t DCFtime = 0; | ||
+ | time_t t = 0; | ||
+ | |||
+ | const unsigned long DefaultTime = 1477958400; // Nov 1 2016 | ||
+ | unsigned long lastDCFsignal; | ||
+ | unsigned long noDCFsignal; | ||
+ | unsigned long currentDCFsignal; | ||
+ | |||
+ | |||
+ | // Definiert die Tracking-Variablen für die IF-Abfragen | ||
+ | unsigned long previousMillisSetRTC = 0; | ||
+ | unsigned long previousMillisSerialPrint = 0; | ||
+ | |||
+ | |||
+ | // Definiert die Intervalle für die IF-Abfragen | ||
+ | int intervalSetRTC = 1000; // Delay für Holen der Zeit | ||
+ | int intervalSerialPrint = 1000; // Delay für serielle Ausgabe | ||
+ | |||
+ | |||
+ | void setup() | ||
+ | // Initalisiert die Pins | ||
+ | pinMode(PIN_LED, | ||
+ | pinMode(DCF_PIN, | ||
+ | | ||
+ | | ||
+ | // set the Time library to use Teensy 3.0's RTC to keep time | ||
+ | setSyncProvider(getTeensy3Time); | ||
+ | |||
+ | |||
+ | Serial.begin(115200); | ||
+ | |||
+ | |||
+ | while (!Serial); | ||
+ | delay(100); | ||
+ | if (timeStatus()!= timeSet) { | ||
+ | Serial.println(" | ||
+ | } else { | ||
+ | Serial.println(" | ||
+ | } | ||
+ | |||
+ | | ||
+ | // Startet die Abfrage des DCF77-Moduls | ||
+ | DCF.Start(); | ||
+ | Serial.println(" | ||
+ | Serial.println(" | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | void loop() { | ||
+ | // Aktuelle Zeit abfragen | ||
+ | unsigned long currentMillis = millis(); | ||
+ | |||
+ | |||
+ | // Stelle die Real Time Clock (RTC) auf die aktuelle Zeit | ||
+ | if ((unsigned long)(currentMillis - previousMillisSetRTC) >= intervalSetRTC) { | ||
+ | |||
+ | DCFtime = DCF.getTime(); | ||
+ | |||
+ | // Wenn die serielle Schnittstelle verfügbar ist, setze die RTC auf diese Zeit | ||
+ | if (Serial.available() && DCFtime < DefaultTime) { | ||
+ | t = processSyncMessage(); | ||
+ | if (t != 0) { | ||
+ | Teensy3Clock.set(t); | ||
+ | setTime(t); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Wenn ein Zeitsignal vom DCF77-Modul verfügbar ist, setze die RTC auf diese Zeit | ||
+ | if (DCFtime > DefaultTime) { | ||
+ | t = DCFtime; | ||
+ | Serial.println(" | ||
+ | Teensy3Clock.set(t); | ||
+ | setTime(t); | ||
+ | DCFTimeFound = true; | ||
+ | digitalWrite(PIN_LED, | ||
+ | currentDCFsignal = millis(); | ||
+ | } | ||
+ | |||
+ | // Berechne die Zeit (in Sekunden) die seit dem Empfang des letzten gültigen DCF-Signals vergangen ist | ||
+ | if (DCFTimeFound == false) { | ||
+ | noDCFsignal = millis() /1000; | ||
+ | } | ||
+ | else { | ||
+ | lastDCFsignal = (millis() - currentDCFsignal) / 1000; | ||
+ | } | ||
+ | |||
+ | //Speichere die aktuelle Zeit in die zughörige Variable | ||
+ | previousMillisSetRTC = currentMillis; | ||
+ | } | ||
+ | |||
+ | |||
+ | // Stetze die RTC auf die Zeit der seriellen Schnittstelle | ||
+ | if ((unsigned long)(currentMillis - previousMillisSerialPrint) >= intervalSerialPrint) { | ||
+ | | ||
+ | // Gibt die aktuelle Zeit aus | ||
+ | Serial.print(hour()); | ||
+ | printDigits(minute()); | ||
+ | printDigits(second()); | ||
+ | Serial.print(" | ||
+ | Serial.print(day()); | ||
+ | Serial.print(" | ||
+ | Serial.print(month()); | ||
+ | Serial.print(" | ||
+ | Serial.print(year()); | ||
+ | printDCFsyncTime(); | ||
+ | Serial.println(); | ||
+ | |||
+ | //Speichere die aktuelle Zeit in die zughörige Variable | ||
+ | previousMillisSerialPrint = currentMillis; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | time_t getTeensy3Time() | ||
+ | { | ||
+ | return Teensy3Clock.get(); | ||
+ | } | ||
+ | |||
+ | |||
+ | /* code to process time sync messages from the serial port */ | ||
+ | #define TIME_HEADER | ||
+ | |||
+ | unsigned long processSyncMessage() { | ||
+ | unsigned long pctime = 0L; | ||
+ | |||
+ | if(Serial.find(TIME_HEADER)) { | ||
+ | | ||
+ | | ||
+ | if( pctime < DefaultTime) { // check the value is a valid time (greater than Nov 1 2016) | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | return pctime; | ||
+ | } | ||
+ | |||
+ | |||
+ | void printDigits(int digits) { | ||
+ | // utility function for digital clock display: prints preceding colon and leading 0 | ||
+ | Serial.print(":" | ||
+ | if(digits < 10) | ||
+ | Serial.print(' | ||
+ | Serial.print(digits); | ||
+ | } | ||
+ | |||
+ | void printDCFsyncTime() { | ||
+ | if (DCFTimeFound == false){ | ||
+ | Serial.print(" | ||
+ | Serial.print(noDCFsignal); | ||
+ | Serial.print(" | ||
+ | } | ||
+ | else { | ||
+ | Serial.print(" | ||
+ | Serial.print(lastDCFsignal); | ||
+ | Serial.print(" | ||
+ | } | ||
+ | } | ||
+ | </ | ||
- | http:// | + | Der Sketch verwendet 29.104 Bytes (2%) des Programmspeicherplatzes. Das Maximum sind 1.048.576 Bytes. |
+ | Globale Variablen verwenden 5.896 Bytes (2%) des dynamischen Speichers, 256.248 Bytes für lokale Variablen verbleiben. Das Maximum sind 262.144 Bytes. | ||
- | Tags: #Arduino | + | {{tag>Arduino Schlafphasenwecker |
arduino/schlafphasenwecker/programmversion_0.1.1480257629.txt.gz · Zuletzt geändert: 18.05.2023 12:16 (Externe Bearbeitung)