arduino:schlafphasenwecker:programmversion_0.1
Schlafphasenwecker - Programmversion 0.1
Achtung
Dies ist eine alte Programmversion.
Die erste Programmversion fokussiert auf die Uhr des Schlafphasenweckers. So lange der Teensy mit dem Computer verbunden ist und noch kein gültiges DCF77-Signal empfangen wurde, wird die RTC mit dem Zeitsignal des Computers gestellt. Sobald ein gültiges DCF77-Signal vorliegt, wird dieses verwendet, um die RTC zu stellen. Die Zeit seit der letzten erfolgreichen Synchronisation wird berechnet.
Hilfreiche Links:
- Time Library: http://www.pjrc.com/teensy/td_libs_Time.html
- Timestamp Generator: http://www.timestampgenerator.com/1357041600/
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, wo das Problem liegt. Mit dem Programm DCFSignal kann man an der seriellen Schnittstelle das Ausgangssignal des DCF-Moduls beobachten.
// Bibliotheken einbinden
#include <TimeLib.h>
#include "DCF77.h" // Bibliothek für das DCF77-Modul
// 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, DCF_INTERRUPT, false);
// Definiert die Variablen
bool DCFTimeFound = false; // wurde ein gueltiges Signal gefunden
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, OUTPUT); // On-board LED
pinMode(DCF_PIN, INPUT_PULLUP); // DFC77-Modul
// set the Time library to use Teensy 3.0's RTC to keep time
setSyncProvider(getTeensy3Time);
Serial.begin(115200);
while (!Serial); // Wait for Arduino Serial Monitor to open
delay(100);
if (timeStatus()!= timeSet) {
Serial.println("Unable to sync with the RTC");
} else {
Serial.println("RTC has set the system time");
}
// Startet die Abfrage des DCF77-Moduls
DCF.Start();
Serial.println("Waiting for DCF77 time ... ");
Serial.println("It will take at least 2 minutes until a first update can be processed.");
}
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(); // Check if new DCF77 time is available
// 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); // set the RTC
setTime(t);
}
}
// Wenn ein Zeitsignal vom DCF77-Modul verfügbar ist, setze die RTC auf diese Zeit
if (DCFtime > DefaultTime) {
t = DCFtime;
Serial.println("RTC has been updated to DCF77 time");
Teensy3Clock.set(t); // set the RTC
setTime(t);
DCFTimeFound = true;
digitalWrite(PIN_LED, HIGH);
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 "T" // Header tag for serial time sync message
unsigned long processSyncMessage() {
unsigned long pctime = 0L;
if(Serial.find(TIME_HEADER)) {
pctime = Serial.parseInt();
return pctime;
if( pctime < DefaultTime) { // check the value is a valid time (greater than Nov 1 2016)
pctime = 0L; // return 0 to indicate that the time is not valid
}
}
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('0');
Serial.print(digits);
}
void printDCFsyncTime() {
if (DCFTimeFound == false){
Serial.print(" no DCF77 sync since ");
Serial.print(noDCFsignal);
Serial.print(" sec.");
}
else {
Serial.print(" last DCF77 sync ");
Serial.print(lastDCFsignal);
Serial.print(" sec. ago");
}
}
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.
arduino/schlafphasenwecker/programmversion_0.1.txt · Zuletzt geändert: 18.05.2023 12:34 von 127.0.0.1