Benutzer-Werkzeuge

Webseiten-Werkzeuge


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:

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