//Simpler DCF-Dekoder ohne Bibliotheken und Fehlerkompensation //H.-J. Berndt auf www.hjberndt.de //Für den Hobby- und Bastelkeller //Zeigt im Serial-Monitor wie die Daten einlaufen //nach < zwei Minuten stimmt die Zeit bei sauberem Signal #define DCF77PIN 2 //Egal welcher Pin char *Tag[] = {"Basteltag", "Montag", "Dienstag","Mittwoch", "Donnerstag","Freitag","Samstag","Sonntag"}; int tUp,tDown,T,ti,tp,b,i,buffer[60],tag; char s[80],datum[20]="--.--.----",zeit[10]="00:00"; void setup() {Serial.begin(9600); pinMode(DCF77PIN, INPUT); pinMode(13, OUTPUT); while(!digitalRead(DCF77PIN)); //wait for __/ } void loop() {tUp = millis(); //pos. Flanke digitalWrite(13, HIGH); //Echo while(digitalRead(DCF77PIN)); //wait for \__ tDown = millis(); //neg. Flanke digitalWrite(13, LOW); //Echo while(!digitalRead(DCF77PIN)); //wait for __/ T = millis(); //Eine Periode um //Sekunde ist vorbei ti = tDown - tUp; //Impulsdauer 100/200 tp = T - tDown; //Impulspause 900/800 T = T - tUp; //Periodendauer 1000 if(T > 750 && T < 1250) //Bit isolieren {b=(tp > 750 && tp < 850) ? 1:0; //0 oder 1 via tp if(i>=0 && i<60)buffer[i++]=b; //bit ablegen //AusgabeBuffer(); Serial.println(AusgabeSekunde()); } if (T >1500)//59.-0. Sekunde --> Minute vorbei {Datum();Zeit(); AusgabeZeit(); i=0; } } char *AusgabeSekunde() {char t[80]; sprintf(t,"%s - %s:%02d",datum,zeit,i); return t; } void AusgabeBuffer() { sprintf(s, "%01d%01d.%01d%01d.20%01d%01d - %01d%01d:%01d%01d:%02d %d", buffer[40]+buffer[41]*2, //Tag Zehner buffer[36]+buffer[37]*2+buffer[38]*4+buffer[39]*8, buffer[49], //Monat Zehner buffer[45]+buffer[46]*2+buffer[47]*4+buffer[48]*8, //Jahr Zehner buffer[54]+buffer[55]*2+buffer[56]*4+buffer[57]*8, buffer[50]+buffer[51]*2+buffer[52]*4+buffer[53]*8, buffer[33]+buffer[34]*2, //Stunde Zehner buffer[29]+buffer[30]*2+buffer[31]*4+buffer[32]*8, buffer[25]+buffer[26]*2+buffer[27]*4, //Minute Zehner buffer[21]+buffer[22]*2+buffer[23]*4+buffer[24]*8, i,b); //Sekunde Serial.println(s); } void Datum() {sprintf(datum,"%02d.%02d.20%02d", (buffer[40]+buffer[41]*2)*10+ //Tag Zehner buffer[36]+buffer[37]*2+buffer[38]*4+buffer[39]*8, (buffer[49]*10)+ //Monat Zehner buffer[45]+buffer[46]*2+buffer[47]*4+buffer[48]*8, (buffer[54]+buffer[55]*2+buffer[56]*4+buffer[57]*8)*10+ buffer[50]+buffer[51]*2+buffer[52]*4+buffer[53]*8); tag = buffer[42]+buffer[43]*2+buffer[44]*4; } void Zeit() {sprintf(zeit,"%02d:%02d", (buffer[33]+buffer[34]*2)*10+ //Stunde Zehner buffer[29]+buffer[30]*2+buffer[31]*4+buffer[32]*8, (buffer[25]+buffer[26]*2+buffer[27]*4)*10+ //Minute Zehner buffer[21]+buffer[22]*2+buffer[23]*4+buffer[24]*8); } void AusgabeZeit() {sprintf(s,"\n %s, der %s um %s Uhr.\n",Tag[tag],datum,zeit); Serial.println(s); }