Zeitsignale von DCF77 mit Arduino analysieren

Als erstes Experiment für den Empfang von DCF77 Signalen beschreibe ich die Darstellung der Empfangenen Logik-Signale auf dem Seriellen Monitor der Arduino Entwicklungsumgebung. Das einzige Bauteil welches neben einem Arduino benötigt wird ist ein DCF77 Empfangsbaustein, wie er bei zahlreichen Elektronik-Versendern angeboten wird. Die Preise erstrecken sich ca. von 7 Euro bis 15 Euro. Die Preisunterschiede machen sich vermutlich auch in der Empfindlichkeit der einzelnen Module bemerkbar. Das kann ich aber nur vermuten, denn getestet habe keinen kommerziellen Baustein.

Für meine Experimente habe ich eine Platine genutzt, welche ich vor etlichen Jahren einmal für erste Empfangsversuche des Zeitzeichensenders DCF77 genutzt habe. Die Platine wurde seinerzeit unter dem sinnigen Namen AS77 vom AATiS angeboten. Sie kommt nun bei meinen Experimenten wieder zu Ehren.

Die digitalen Signale der Empfangsmodule sollten über einem hochohmigen Widerstand (19kOhm) an den Arduino herangeführt werden. Bei meiner Platine erübrigte sich dies, weil der Widerstand schon aur der Platine vorhanden war. Der Anschluss an den Arduino erfolgt an einen der digitalen Eingänge. Ich habe den Pin 2 verwendet. Die Ausgabe der empfangenen Impulse erfolgt auf einer LED, das Auge experimentiert ja schließlich mit :-). Ich habe der Einfachheit halber gleich die auf dem Arduino vorhandene LED am PIN 13 genommen.

screenshot_erster_testIm Übrigen werden die empfangenen Logik-Signale auf den seriellen Monitor der Arduino Entwicklungsumgebung ausgegeben. Der nebenstehende Screenshot zeigt sehr schön die Länge der Impulse von 100ms bzw. 200ms. Auch die letzte Sekunde einer Minute (lange Sequenz mit Nullen) ist sehr schön zu erkennen. Hierüber kann man den Beginn einer neuen Minute detektieren. Wer sich die Arbeit machen möchte, kann anhand dieser Aufzeichnungen schon die im DCF77-Signal enthaltenen Informationen manuell dekodieren.

Aber die Experimente sollen ja weiter gehen. Ich werde noch weitere Möglichkeiten der Dekodierung beschreiben. Nachfolgend das Listing des Sketches, welcher auf den Arduino geladen werden sollte.

/*================================================================================
  Einfaches Programm zum Enlesen von digitalen Signalen eines DCF77 Empfängers
  Ausgabe der Impulse auf eine LED
  Ausgabe des eingelesenen Logik-Pegels auf den Seriellen Monitor der Arduino IDE
==================================================================================*/


#define DCF77Pin 2                                                // An deisen Pin wird der DCF77 Empfänger angeschlossen
#define LEDPin 13                                                 // Eingelesene Impulse des Empfängers werden hier ausgegeben
int vorheriger_DCF_Wert = 0;                                      // Zwischenspeicher für vorherigen Impulswert (dient zur Flankenerkennung)

void setup() {
  Serial.begin(9600);
  pinMode(DCF77Pin, INPUT);                                       // DCF77PIN für Eingabe setzen
  pinMode(LEDPin, OUTPUT);                                        // LEDPin für Ausgabe setzen
  Serial.println("0,0s   0,1s      0,2s      0,3s      0,4s      0,5s      0,6s      0,7s      0,8s      0,9s      1,0s       1,1s       1,2s");
}

void loop() {
  int DCF77Pegel = digitalRead(DCF77Pin);                         // Wert am DCF77Pin einlesen und in DCF77Pegel speichern
  if (DCF77Pegel == 1 && vorheriger_DCF_Wert == 0) {              // prüfen ob der aktuelle Wert = 1 ist und der vorherige 0 war
    Serial.println("");                                           // wenn dem so ist, dann wurde eine ansteigende Flanke erkannt
  }                                                               // und eine neue Sekunde beginnt, Ausgabe in neuer Zeile fortsetzen
  digitalWrite(LEDPin, DCF77Pegel);                               // Eingelesenen Pegel auf LEPin ausgeben (irgendwas muss halt am Arduino blinken)
  Serial.print(DCF77Pegel);                                       // aktuellen Pegelwert auf seriellen Monitor ausgeben
  vorheriger_DCF_Wert = DCF77Pegel;                               // aktellen Pegel zwischenspeichern
  delay(10);                                                      // 10 millisekunden warten, somt 100 Meßwerte je Sekunde
}

 

Der Sketch kann hier geladen werden.

 

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.