DCF77 DCF1 Arduino Pollin : Und die Zeit tickt
DCF77 DCF1 Arduino Pollin : Und die Zeit tickt
Obwohl schon oft beschrieben, möchte ich heute dennoch auf den Zeitzeichensender DCF77 eingehen.
Für unseren Versuchsaufbau benötigen wir folgende Bauteile :
- einen Arduino Mikrocontroller (DUE, MEGA o.ä.)
- ein DCF-Empfangsmodul (DCF1 von Pollin Elektronics GmbH Best.Nr.: 810 054)
Wir legen direkt los und schließen das Modul wie folgt an :
Achtung !
Es gibt zwei Versionen des Moduls, kontrolliert die Pinbelegung im Datenblatt/Beipackzettel.
DCF1 / Pollin | Arduino |
3.3 V/5V | 3.3 V/5V |
GND | GND |
Data | PIN 2 |
PON | GND |
Mit diesem Progrämmchen könnt Ihr eure Schaltung testen. Es wertet nicht die Zeit aus, sondern prüft die Richtigkeit der eingehenden Impulse.
/* DCFSignalQuality * Ralf Bohnen, 2013 * This example code is in the public domain. */ #define DCF77PIN 2 void setup() { Serial.begin(9600); pinMode(DCF77PIN, INPUT); Serial.println("Beginne DCF77 Messung, bitte warten :"); //Ein schlechter Empfang bedeutet nicht das wir kein Empfang haben, nur das es länger dauern würde //das Signal auszuwerten. Serial.println("KEIN SIGNAL <- | <- MISERABEL <- | SCHLECHT <- | GUT | -> SCHLECHT | -> MISERABEL ->"); } void loop() { //Führe eine Messung über 10 Impulse aus, ein Impuls dauert genau eine Sekunde int q = DCF77signalQuality(10); //Wenn kein Wechsel zwischen HIGH und LOW am Anschluss erkannt wurde //bedeutet das in 99,99% aller Fälle das der DCF Empfänger nicht arbeitet //denn bei extrem schlechten Empfang hat man Wechsel, nur kann man sie nicht auswerten. if (!q) { Serial.print("# (Schaltung pruefen!)"); } for (int i = 0; i < q; i++) { Serial.print(">"); } Serial.println(""); } int DCF77signalQuality(int pulses) { int prevSensorValue = 0; unsigned long loopTime = 10000; //Impuls Länge genau eine Sekunde //Da wir ja mitten in einem Impuls einsteigen könnten, verwerfen wir den ersten. int rounds = -1; unsigned long gagingStart = 0; unsigned long waitingPeriod = 0; int overallChange = 0; int change = 0; while (true) { //Unsere Schleife soll das Eingangssignal (LOW oder HIGH) 10 mal pro //Sekunde messen um das sicherzustellen, messen wir dessen Ausführungszeit. gagingStart = micros(); int sensorValue = digitalRead(DCF77PIN); //Wenn von LOW nach HIGH gewechselt wird beginnt ein neuer Impuls if (sensorValue == 1 && prevSensorValue == 0) { rounds++; if (rounds > 0 && rounds < pulses + 1) { overallChange += change; } if (rounds == pulses) { return overallChange / pulses; } change = 0; } prevSensorValue = sensorValue; change++; //Ein Wechsel zwichen LOW und HIGH müsste genau alle 100 Durchläufe stattfinden //wird er größer haben wir kein Empfang //300 habe ich als guten Wert ermittelt, ein höherer Wert würde die Aussage festigen //erhöht dann aber die Zeit. if (change > 300) { return 0; } //Berechnen und anpassen der Ausführungszeit waitingPeriod = loopTime - (micros() - gagingStart); delayMicroseconds(waitingPeriod); } }
Nach dem wir unsere Schaltung auf Funktion geprüft haben, machen wir uns daran, die übermittelten Daten auszuwerten und uns das Datum und die Uhrzeit anzeigen zu lassen.
Auf der nächsten Seite befassen wir uns damit wie das Ganze nun funktioniert.Wenn man einmal dahinter gestiegen ist, ist es sehr einfach.
Stellt euch vor, in der Nähe von Frankfurt, genau in Mainhausen steht ein Funksender der ca. 2000 km weit sendet.