// RPi3 DCF77 Second/Minute Monitor // 24.01.2018. Author: YT2FSG - Goran Stankovic dipl.ing.el. // email: goranstank@gmail.com, web: http://www.qsl.net/yt2fsg // // gcc -Wall -o dcf774 dcf77.c -l wiringPi // sudo ./dcf77 // // "0" = 7...13 // "1" = 17...23 // sec = 90...105 // sync= 195...205 #define _GNU_SOURCE #include #include #include #include #include #include #include #include #define TRUE (1==1) #define FALSE (!TRUE) #define CHAN_CONFIG_SINGLE 8 #define CHAN_CONFIG_DIFF 0 char vr[80]={0}; char min, hour, day, d_v, mon, year, p1, p2, p3, zon, zlb; char *d_vv[8]={" ","Pon","Uto","Sre","Cet","Pet","Sub","Ned"}; char *zl[2] ={"Zimsko","Letnje"}; char *utc[4] ={"UTC ","UTC+1","UTC+2","UTC+3"}; char *amon[2]={"Second","Minute"}; char *usage = "Usage: dcf77 [-s] [-m]"; // -s = sekund monitor // -m = minut monitor int moni=0; char parity(int start, int end) { int i; char par=0; for (i=start; i<=end; i++) { par = par ^ vr[i]; } return par; } void decode(void) { zlb = vr[16]; zon = vr[18]+vr[17]*2; min = vr[21]+vr[22]*2+vr[23]*4+vr[24]*8+vr[25]*10+vr[26]*20+vr[27]*40; hour= vr[29]+vr[30]*2+vr[31]*4+vr[32]*8+vr[33]*10+vr[34]*20; day = vr[36]+vr[37]*2+vr[38]*4+vr[39]*8+vr[40]*10+vr[41]*20; d_v = vr[42]+vr[43]*2+vr[44]*4; mon = vr[45]+vr[46]*2+vr[47]*4+vr[48]*8+vr[49]*10; year= vr[50]+vr[51]*2+vr[52]*4+vr[53]*8+vr[54]*10+vr[55]*20+vr[56]*40+vr[57]*80; } int main (int argc, char *argv []) { if (argc < 2) { fprintf (stderr, "%s\n", usage) ; return 1 ; } if((strcasecmp (argv [1], "-s") == 0) ){ moni = 1;} else if (strcasecmp (argv [1], "-m") == 0){ moni = 2;} else { moni = 2; } wiringPiSetup () ; pinMode (0, INPUT) ; // BCM 17 = GPIO 0 = pin 11 unsigned char sec=0, nf=0, pf=0; int in, cp=0, cn=0; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - printf("*** RPi3 DCF77 - %s Monitor ***\n",amon[moni-1]); printf("by: YT2FSG - Goran Stankovic dipl.ing.el. (goranstank@gmail.com)\n\n"); if (moni==1) { printf(" 0 100 200 300 400 500 600 700 800 900 1000 ms\n"); printf(" | | | | | | | | | | | | | | | | | | | | | \n"); } else if (moni==2) { printf("0 10 20 30 40 50 58 \n"); printf("| | | | | | | | | | | | | \n"); printf(" |1122||Minut 1| Sat 2| Dan |d||Mes.|Godina 3 \n"); printf("M--------------RAZZAS1248124P124812P1248121241248112481248P \n"); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - while (1) { in = digitalRead(0); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (in==0) { if (moni==1) { if (nf==0) { nf=1; printf("\n%02d : ", sec); sec++; } printf("*"); pf=0; } else if (moni==2) { if (cp > 170) { if (sec==59) { decode(); printf(" %02d.%02d.20%d. %02d:%02d:00 %s - %s %s \n",day,mon,year,hour,min, d_vv[d_v], zl[zlb], utc[zon]); } else { printf("\n"); } sec=0; } } cp=0; cn++; if (cn>100) { cn=0; printf("\n"); } } else { if (moni==1) { printf("-"); if ((cp+cn) > 98) { if (pf==0) { pf=1; printf("\nSync "); sec++; } if (cp > 150) { sec=0; } } nf=0; } else if (moni==2) { if ((cn > 7)&&(cn < 13)) { vr[sec]=0; sec++; printf("-"); } else if ((cn > 17)&&(cn < 23)) { vr[sec]=1; sec++; printf("*"); } } cn=0; cp++; if (cp>200) { cp=0; printf("\n"); } } delay(10); //10ms } return 0; }