DCF77 auslesen

Hallo Udo,

also ich habe noch ein kleines SD-Kartenmodul, auf das ich die Daten theoretisch aufzeichnen könnte. Müsste halt wissen, ob das für weitere Probleme sorgen würde, aber auf diese Weise könnte ich Dir gefühlt zwei Jahre aufzeichnen.

Was ich nicht verstehe ist, was Du hiermit meinst:

Kannst Du mal zehn Minuten mit meinem Sketch und korrekter Pinbelegung aufzeichnen?

Du hast ne super coole Website, aber vielleicht bin ich einfach nur zu doof, herauszufinden, was ich als Pinbelegung noch alles setzen muss, damit bei Deinem Scope-Sketch was rauskommt.

Speziell:

Code Zeilen 20 - 28:

const uint8_t dcf77_analog_sample_pin = 5;
const uint8_t dcf77_sample_pin = A5;  // == D19 for standard Arduinos
const uint8_t dcf77_inverted_samples = 1;
const uint8_t dcf77_analog_samples = 1;
 
const uint8_t dcf77_monitor_pin = A4; // == D18 for standard Arduinos
 
const uint8_t lower_output_pin = 2;
const uint8_t upper_output_pin = 17;

Mir ist nur klar, dass ich das invertierte Signal vom Conrad-Modul an Pin 2 habe. Ich habe auch kein LED Shield. Daher... Hast Du bitte noch mal einen Link zu einer detaillierteren Anschluss-Dokumentation?

Liebe Grüße
Tim

TConnect:
Du hast ne super coole Website, aber vielleicht bin ich einfach nur zu doof, herauszufinden, was ich als Pinbelegung noch alles setzen muss, damit bei Deinem Scope-Sketch was rauskommt.

Hast Du immer noch Probleme mit Deinem DCF-Modul vom Conrad?

Ist Dein USB-Kabel mitlerweise lang genug, um mit meinem vorherigen Test-Sketch ein vernünftiges Signal zu bekommen?

Hier hätte ich noch einen weiteren "DCF77-Test-Sketch mit Dekodierung von Zeittelegrammen".

Die Signalaufbereitung ist nicht besonders intelligent, aber wenn das Signal ausreichend gut ist, sollte es problemlos funktionieren, wenigstens alle paar Minuten einmal 59 Bits erfolgreich auszulesen und daraus ein vollständiges Zeittelegramm mit Zeit und Datum zu dekodieren.

Im Code brauchst Du nur oben im Quelltext nur einstellen, an welchem PIN das Modul hängt (Conrad-Modul mit PullUp-Widerstand) und ob das Signal invertiert ist oder nicht. Vielleicht probierst Du mal aus, was Du damit bekommst:

#define DCFPIN 8
#define INVERTEDSIGNAL false

#define PULSE_ERRORLIMIT 40  // 40 ms seems to be a suitable value
#define PULSE_SHORTSECOND (1000-PULSE_ERRORLIMIT)
#define PULSE_LONGSECOND  (1000+PULSE_ERRORLIMIT)
#define PULSE_MINUTEMARK  (2000-PULSE_ERRORLIMIT)

// 8 Bytes = 64 Bits to store all 59 DCF bits in a minute
uint8_t dcfBits[8];  
byte dcfBitcount;

boolean parityOK(byte startbit, byte paritybit)
{ // test parity bit in the range startbit ... paritybit-1
  byte p=0;
  for (int i=startbit; i<=paritybit;i++) p+= bitRead(dcfBits[i/8],i%8);
  if (p%2 == 0) return true; // even parity detected
  else return false;
}

byte dcfDecodeBCD(byte startbit, byte numbits)
{ // return BCD encoded byte-value beginning at startbit
  byte b=0;
  for (int i=startbit;i<startbit+numbits;i++) bitWrite(b,i-startbit, bitRead(dcfBits[i/8],i%8));
  return b;
}

boolean dcfDecodeTime()
{
  int hour, minute, day, month, year;
  byte resultCode, parityError=0;
  // print bits of time code to serial
  for (int i=0;i<dcfBitcount;i++) Serial.print(bitRead(dcfBits[i/8],i%8));
  Serial.print('\t');Serial.println(dcfBitcount);
  if(!parityOK(21,28)) bitSet(parityError,0); // parity error minute
  if(!parityOK(29,35)) bitSet(parityError,1); // parity error hour
  if(!parityOK(36,58)) bitSet(parityError,2); // parity error date
  hour   = 10*dcfDecodeBCD(33,2);  // tens of hours, 2 bit 
  hour  += dcfDecodeBCD(29,4);     // single hours, 4 bit 
  minute = 10*dcfDecodeBCD(25,3);  // tens of minutes, 3 bit
  minute += dcfDecodeBCD(21,4);    // single minutes, 4 bit

  day = 10*dcfDecodeBCD(40,2);     // day of month (tens), 2 bit
  day += dcfDecodeBCD(36,4);       // day of month (single), 4 bit
  month = 10*dcfDecodeBCD(49,1);   // tens of month, 1 bit
  month += dcfDecodeBCD(45,4);     // single digit of month, 4 bit
  year = 10*dcfDecodeBCD(54,4);    // tens of year, 4 bit
  year += dcfDecodeBCD(50,4);      // single digit of year, 4 bit
  if (dcfBitcount!=59)
  {
    Serial.println("Error: Time code must contain 59 bits!");
  }
  else if (parityError)
  {
    Serial.println("Error: Wrong parity bit detected!");
  }
  else
  {
    Serial.print(hour);Serial.print(':');
    Serial.print(minute);Serial.print(":00  ");
    Serial.print(day);Serial.print('/');
    Serial.print(month);Serial.print('/');
    Serial.println(year);
    dcfBitcount=0;
    return true;
  }
  dcfBitcount=0;
  return false;
}


boolean dcfHandleBit(uint16_t hiTime, uint16_t pulseTime)
{
  if (dcfBitcount<60)
  {
    if (hiTime<150) bitClear(dcfBits[dcfBitcount/8],dcfBitcount%8);
    else  bitSet(dcfBits[dcfBitcount/8],dcfBitcount%8);
    dcfBitcount++;  
  }
  if (pulseTime>=PULSE_MINUTEMARK) return dcfDecodeTime();
  return false;
}

boolean dcfUpdate()
{
  static boolean lastState;
  static unsigned long lastChangeTime;
  static uint16_t hiMillis,loMillis;
  static byte cnt;
  boolean state= digitalRead(DCFPIN);
  if (INVERTEDSIGNAL) state=!state;
  if (state!=lastState)
  {
    long timeDiff=millis()-lastChangeTime;
    lastState=state;
    lastChangeTime+= timeDiff;
    if (state)
    {
      cnt++;
      loMillis+= timeDiff;
      uint16_t pulsetime=hiMillis+loMillis;
      if ((pulsetime>=PULSE_SHORTSECOND && pulsetime<=PULSE_LONGSECOND)|| pulsetime>=PULSE_MINUTEMARK) 
      {
        Serial.print(cnt);Serial.print('\t');
        Serial.print(hiMillis);Serial.print('\t');
        Serial.print(loMillis);Serial.print('\t');
        Serial.print(pulsetime);Serial.print('\t');
        Serial.println();
        boolean result=dcfHandleBit(hiMillis, pulsetime);
        hiMillis=0;
        loMillis=0;
        cnt=0;
        return result;
      }
    }
    else hiMillis+= timeDiff;
  }
  return false;
}




void setup() {
  Serial.begin(9600);
  Serial.println("DCF77 test sketch by 'jurs'");
  pinMode(DCFPIN, INPUT);
}

void loop() {
  if (dcfUpdate()) Serial.println("SUCCESS!");
}

Es braucht kein Arduino-Board mit Schwingquarz, sondern es tut jedes beliebige Arduino-Board. Das sollte also eher 'anfängergeeignet' sein als das was Udo als Code anbietet. Aber eine Zeit bekommst Du nur, wenn das Signal aus Deinem DCF-Modul "angemessen gut" ist.

Poste ggf. mal die Programmausgabe auf Serial, wenn es nicht funktioniert!

Danke Jurs, das mache ich heute Abend. Ich habe mir noch ein USB-Verlängerungskabel besorgt, das ich zur Not auch dafür nutzen kann, den Aufbau genau mittig im Wohnimmer zu platzieren und dann nun wirklich so weit es geht von störenden Einflüssen entfernt zu sein.

TConnect:
Danke Jurs, das mache ich heute Abend. Ich habe mir noch ein USB-Verlängerungskabel besorgt

Ach so, noch ein Wort zum USB-Kabel: Der USB-Bus selbst ist eine hochfrequente Störquelle und das USB-Kabel ein Sender für Störimpulse. Bessere USB-Kabel haben daher immer einen Ferritkern als Mantelstromfilter, um die Störabstrahlung des USB-Kabels zu vermindern.

Sowas wie:

Solche Filter gibt es auch zum nachträglichen Aufklipsen auf das Kabel.

Hat Dein USB-Kabel so einen Ferritkern als Mantelstromfilter dran?

Es wäre nicht nur wichtig, mit dem USB-Kabel weit weg von Störquellen wie Monitor und PC zu kommen, sondern auch ein störungsarmes USB-Kabel mit Mantelstromfilter zu verwenden, wenn Du Empfangsprobleme hast.

Ich habe mal probehalber Resonator Unterstützung in meine Library eingebaut. Ist aber noch experimentell und "autotune" funktioniert nicht richtig. Will hier trotzdem jemand mal ausprobieren ob das wenigstens im Prinzip klappt? Wer würde freiwillig Tester spielen wollen?

Ich bin gerne bereit, das auf verschiedenen Boards zu testen. Da ich drei Conrad-Module habe, die auch alle mit Pin-Headern ausgestattet sind, kann ich gerne mal eine kleine Testreihe machen. Ich denke, dass ich dazu aber erst am Donnerstagabend Zeit habe.

Kannst Du mir noch auf die Sprünge helfen mit meiner Rückfrage bzgl. der Konfiguration aus Deinem Sketch?

Grüße Tim

Hallo Jurs,

yes! Es hat einige Erfolge dabei!!!

Schau mal:

1 144 854 998 
1 227 1776 2003 
01 2
Error: Time code must contain 59 bits!
1 121 882 1003 
1 119 882 1001 
1 112 882 994 
1 218 787 1005 
1 113 885 998 
1 215 784 999 
1 118 890 1008 
1 109 887 996 
1 216 782 998 
1 215 786 1001 
1 210 788 998 
1 220 778 998 
1 221 780 1001 
1 122 878 1000 
1 216 783 999 
1 123 881 1004 
1 116 886 1002 
1 219 777 996 
1 120 878 998 
1 134 869 1003 
1 214 784 998 
1 124 878 1002 
1 118 884 1002 
1 114 885 999 
1 220 784 1004 
1 211 784 995 
1 131 870 1001 
1 118 883 1001 
1 115 883 998 
1 122 879 1001 
1 213 788 1001 
1 121 875 996 
1 126 877 1003 
1 119 878 997 
1 221 781 1002 
1 121 881 1002 
1 222 779 1001 
1 111 891 1002 
1 115 884 999 
1 117 880 997 
1 121 880 1001 
1 120 879 999 
1 219 787 1006 
1 207 791 998 
1 115 883 998 
1 223 781 1004 
1 229 766 995 
1 226 776 1002 
1 117 879 996 
1 117 888 1005 
1 218 782 1000 
1 115 885 1000 
1 217 781 998 
1 127 870 997 
1 218 789 1007 
1 119 878 997 
1 115 885 1000 
1 131 870 1001 
1 221 1777 1998 
00010100111110100100100011000010001010000011011100101010001 59
22:18:00  1/7/15
SUCCESS!
1 120 881 1001 
1 120 884 1004 
1 213 784 997 
1 125 877 1002 
1 223 773 996 
1 223 780 1003 
1 212 788 1000 
1 225 780 1005 
1 111 883 994 
1 131 873 1004 
1 111 885 996 
1 120 881 1001 
1 126 875 1001 
1 127 874 1001 
1 212 788 1000 
1 116 880 996 
1 120 882 1002 
1 217 786 1003 
2 117 883 1000 
1 115 885 1000 
1 215 783 998 
1 217 782 999 
1 121 880 1001 
1 122 881 1003 
1 214 785 999 
1 225 774 999 
1 119 880 999 
1 119 885 1004 
1 215 785 1000 
1 111 888 999 
1 208 792 1000 
1 116 883 999 
1 122 879 1001 
1 123 873 996 
1 226 777 1003 
1 114 886 1000 
1 224 775 999 
1 120 883 1003 
1 119 872 991 
1 136 871 1007 
1 120 879 999 
1 124 880 1004 
1 209 787 996 
1 221 782 1003 
1 118 883 1001 
1 215 787 1002 
1 214 781 995 
1 219 783 1002 
1 119 883 1002 
1 115 883 998 
1 220 778 998 
1 120 880 1000 
1 220 783 1003 
1 120 881 1001 
1 216 785 1001 
1 111 889 1000 
1 113 885 998 
1 116 890 1006 
1 214 1783 1997 
00101111000000100100110011001010001010000011011100101010001 59
22:19:00  1/7/15
SUCCESS!
1 118 880 998 
1 115 883 998 
1 119 885 1004 
1 111 885 996 
1 122 881 1003 
1 113 882 995 
1 223 778 1001 
1 222 782 1004 
1 112 889 1001 
1 216 782 998 
1 214 786 1000 
1 215 784 999 
1 217 784 1001 
3 227 773 1000 
1 119 880 999 
1 127 876 1003 
1 117 881 998 
1 217 784 1001 
1 116 882 998 
1 120 883 1003 
1 217 782 999 
1 119 882 1001 
1 119 882 1001 
1 120 881 1001 
1 117 882 999 
1 121 879 1000 
1 217 782 999 
1 119 880 999 
1 225 774 999 
1 121 880 1001 
1 224 778 1002 
1 119 880 999 
1 128 877 1005 
4 396 1603 1999 
0000001101111100010010000010101001 34
Error: Time code must contain 59 bits!
1 119 877 996 
1 215 790 1005 
1 119 876 995 
1 122 881 1003 
1 119 882 1001 
1 124 878 1002 
1 108 887 995 
1 219 783 1002 
1 214 785 999 
1 122 880 1002 
1 215 784 999 
1 219 780 999 
1 221 782 1003 
1 127 874 1001 
1 114 881 995 
1 223 778 1001 
1 123 879 1002 
1 215 786 1001 
1 117 884 1001 
1 215 783 998 
1 114 888 1002 
1 114 882 996 
1 121 880 1001 
1 214 1792 2006 
010000011011100101010001 24
Error: Time code must contain 59 bits!
1 115 881 996 
1 116 887 1003 
1 209 791 1000 
1 115 881 996 
1 123 883 1006 
1 213 783 996 
1 215 788 1003 
1 219 776 995 
1 217 785 1002 
1 218 781 999 
1 223 778 1001 
1 125 875 1000 
1 121 876 997 
1 223 783 1006 
1 112 889 1001 
1 107 892 999 
1 113 886 999 
1 219 781 1000 
1 117 880 997 
1 122 881 1003 
1 215 787 1002 
1 208 787 995 
1 120 880 1000 
1 127 876 1003 
1 117 884 1001 
1 118 882 1000 
1 211 787 998 
1 116 887 1003 
1 116 885 1001 
1 119 879 998 
1 213 784 997 
1 121 882 1003 
1 112 889 1001 
1 122 878 1000 
1 208 792 1000 
1 123 873 996 
1 221 784 1005 
1 110 889 999 
1 120 880 1000 
1 116 884 1000 
1 115 885 1000 
1 123 880 1003 
1 209 790 999 
1 211 791 1002 
1 113 881 994 
1 226 774 1000 
1 229 775 1004 
1 212 790 1002 
1 112 883 995 
1 117 887 1004 
1 218 782 1000 
1 119 883 1002 
1 209 788 997 
1 122 878 1000 
1 218 778 996 
1 122 883 1005 
1 116 885 1001 
1 121 876 997 
1 213 1790 2003 
00100111111001000100110000100010001010000011011100101010001 59
22:21:00  1/7/15
SUCCESS!
1 117 881 998 
1 117 882 999 
1 122 879 1001 
1 217 785 1002 
1 123 876 999 
1 117 885 1002 
1 216 782 998 
1 115 882 997 
1 132 871 1003 
1 209 791 1000 
1 116 882 998 
1 227 776 1003 
1 214 781 995 
1 122 879 1001 
1 133 873 1006 
1 110 887 997 
1 114 892 1006 
1 210 784 994 
1 126 874 1000 
1 126 874 1000 
1 221 776 997 
1 132 872 1004 
1 212 792 1004 
1 115 882 997 
1 116 883 999 
1 116 889 1005 
1 210 788 998 
1 116 884 1000 
1 117 885 1002 
1 115 881 996 
1 221 781 1002 
1 121 877 998 
1 127 874 1001 
1 119 882 1001 
1 217 783 1000 
1 128 874 1002 
1 216 782 998 
1 115 885 1000 
1 117 880 997 
1 127 877 1004 
1 116 882 998 
1 123 877 1000 
1 215 789 1004 
1 220 780 1000 
1 117 879 996 
1 225 775 1000 
1 223 780 1003 
1 232 769 1001 
1 113 885 998 
1 120 881 1001 
1 232 770 1002 
1 115 888 1003 
1 208 785 993 
1 123 881 1004 
1 210 791 1001 
1 111 886 997 
1 121 880 1001 
1 119 880 999 
1 219 1782 2001 
00010010010110000100101000100010001010000011011100101010001 59
22:22:00  1/7/15
SUCCESS!
1 135 863 998 
1 124 884 1008 
1 213 783 996 
1 214 786 1000 
1 210 791 1001 
1 216 782 998 
1 218 782 1000 
1 217 787 1004 
1 208 791 999 
1 213 785 998 
1 125 877 1002 
1 113 881 994 
1 221 781 1002 
1 220 779 999 
1 224 778 1002 
1 119 880 999 
1 132 868 1000 
1 218 785 1003 
1 123 878 1001 
1 114 883 997 
1 224 775 999 
1 222 781 1003 
1 212 787 999 
1 122 878 1000 
1 115 886 1001 
1 115 887 1002 
1 209 792 1001 
1 115 880 995 
1 220 783 1003 
1 123 877 1000 
1 216 782 998 
1 116 891 1007 
1 119 878 997 
1 119 879 998 
1 222 780 1002 
1 118 878 996 
1 213 788 1001 
1 123 878 1001 
1 125 874 999 
1 123 877 1000 
1 117 882 999 
1 142 860 1002 
1 216 786 1002 
1 216 787 1003 
1 115 883 998 
1 215 787 1002 
1 213 782 995 
1 223 781 1004 
1 118 880 998 
1 116 885 1001 
1 221 782 1003 
1 106 889 995 
1 219 781 1000 
1 132 873 1005 
1 216 782 998 
1 115 879 994 
1 134 872 1006 
1 112 886 998 
1 213 1789 2002 
00111111110011100100111000101010001010000011011100101010001 59
22:23:00  1/7/15
SUCCESS!
1 120 880 1000 
1 216 785 1001 
1 211 788 999 
1 214 786 1000 
1 120 881 1001 
1 115 885 1000 
1 217 783 1000 
1 211 788 999 
1 218 785 1003 
1 110 891 1001 
1 208 789 997 
1 122 875 997 
1 220 773 993 
1 221 785 1006 
1 230 774 1004 
1 123 878 1001 
1 118 883 1001 
1 209 789 998 
1 115 889 1004 
1 117 880 997 
1 217 784 1001 
1 116 880 996 
1 115 888 1003 
1 213 788 1001 
1 109 890 999 
1 117 883 1000 
1 219 783 1002 
1 121 876 997 
1 118 883 1001 
1 118 883 1001 
1 218 784 1002 
1 117 880 997 
1 122 881 1003 
1 119 879 998 
1 211 788 999 
1 119 884 1003 
2 223 772 995 
1 120 885 1005 
1 116 883 999 
1 127 879 1006 
1 112 882 994 
1 117 883 1000 
1 215 784 999 
1 225 780 1005 
1 110 889 999 
1 216 786 1002 
1 225 772 997 
1 217 781 998 
1 126 876 1002 
1 115 881 996 
1 226 780 1006 
1 115 879 994 
1 218 787 1005 
1 119 878 997 
1 222 779 1001 
1 120 882 1002 
1 115 883 998 
1 121 878 999 
1 218 1787 2005 
01110011101011100100100100100010001010000011011100101010001 59
22:24:00  1/7/15
SUCCESS!

Umgebung:
UNO R3 mit Quarz,
Conrad-Modul korrekt mit Pullup Widerstand

@TConnect: die Pinbelegung steht hier:

const uint8_t dcf77_analog_sample_pin = 5;
const uint8_t dcf77_sample_pin = A5;  // == D19 for standard Arduinos
const uint8_t dcf77_inverted_samples = 1;
const uint8_t dcf77_analog_samples = 1;

D.h. Du willst vermutlich das so:

const uint8_t dcf77_analog_sample_pin = 5;
const uint8_t dcf77_sample_pin = A5;  // == D19 for standard Arduinos
const uint8_t dcf77_inverted_samples =0;
const uint8_t dcf77_analog_samples = 0;

oder so

const uint8_t dcf77_analog_sample_pin = 5;
const uint8_t dcf77_sample_pin = A5;  // == D19 for standard Arduinos
const uint8_t dcf77_inverted_samples = 1;
const uint8_t dcf77_analog_samples = 0;

setzen. Das Modul wird an D19 bzw. A5 angeschlossen. Ist beides der gleiche Pin. An Pin 2 wird das nicht funktionieren. Du kannst auch const uint8_t dcf77_sample_pin = 2 setzen. Dann musst Du aber die "Lichteffekte" entfernen. Wenn Du das nicht tust wird nur Müll rauskommen. Schliess es einfach an Pin 19 (analog 5) an und gut.

TConnect:
yes! Es hat einige Erfolge dabei!!!

Gratulation!

Da hast Du heute aber auch mal ein ausnehmend gutes DCF-Signal auf Deinem Empfänger, damit sollte wirklich JEDER DCF-Code die Zeit decodieren können, auch die Library von Thijs Elenbaas.

Und was willst Du damit jetzt anfangen?
Wie Du gesehen hast, unterliegt das DCF-Signal Schwankungen. Unabhängig von den Störungen bei Dir im Haus kann der Empfang je nach Jahres- oder Tageszeit, Sonnenaktivität und Wetter in Deutschland beeinträchtigt sein. Um stets zuverlässig und zu jedem Zeitpunkt eine korrekte Zeit zu haben, müßtest Du die DCF-Zeit in einer Echtzeituhr einspeichern und kannst von dort die jeweils aktuelle Zeit jederzeit auslesen.

jurs:
Und was willst Du damit jetzt anfangen?

Tja ich bin ja immer noch an meiner Wortuhr dran, die ich aus dem 3D Drucker holen wollte. Ich möchte ein Exemplar (von derzeit insgesamt drei angedachten Exemplaren) auch verschenken, und zwar nach Wien. Bin mal gespannt, ob dort die Zeit auch vernünftig empfangen werden kann.

Daniel hat mir noch den Tipp gegeben, die Zeit vielleicht auch per WLAN-Modul aus dem Internet zu holen, was auch sehr reizvoll ist. Aber da mir das Projekt ja nicht wegrennt und ich das alles immer dann mache, wenn ich Zeit habe, wollte ich überhaupt erst einmal das DCF Modul sauber ansprechen und verwertbare Daten erhalten (Na ja der Weg ist das ziel, nämlich das Lernen). Sonst hätte ich mir die drei Module letztlich auch schenken können.

Udo, ich habe noch nicht so recht verstanden, was die verschiedenen Konfigurations-Variabeln bedeuten. Da ich ja kein Shield von Dir habe, wären alle LED-basierten dinge für mich nicht relevant. Ich schließe das Modul einfach mal so an, wie Du es geschrieben hast und schaue, was dann passiert :slight_smile:

Liebe Grüße

TConnect:
Daniel hat mir noch den Tipp gegeben, die Zeit vielleicht auch per WLAN-Modul aus dem Internet zu holen, was auch sehr reizvoll ist. Aber da mir das Projekt ja nicht wegrennt und ich das alles immer dann mache, wenn ich Zeit habe, wollte ich überhaupt erst einmal das DCF Modul sauber ansprechen und verwertbare Daten erhalten (Na ja der Weg ist das ziel, nämlich das Lernen). Sonst hätte ich mir die drei Module letztlich auch schenken können.

Ja, in den "normal funkverseuchten modernen Haushalten" mit DCF-Empfangsproblemen ist als eine der vielen Funkseuchen praktisch immer auch WLAN dabei. Oft sogar diverse SSIDs an einem Ort. Für mindestens eines dieser WLAN-Signale dürfte der Hausherr das WLAN-Passwort kennen, weil er selbst das WLAN betreibt, das da in der Gegend herumfunkt.

Dafür wären inzwischen die neuen ESP8266 WLAN-Module eine Alternative, die über eBay von Chinaversendern teils nur ca. 4 Euro kosten: Im Internet arbeiten diverse NTP-Zeitserver, auch von der PTB in Braunschweig, von denen man eine hochgenaue Zeit über das Internet erhalten kann.

Momentan ist funktionierender NTP-Code für ESP8266 Module zwar noch Mangelware, aber den könnte man sicher leicht ausarbeiten.

Also mein Hardwarevorschlag für eine Uhrenanwendung im Haus

  • DCF77-Modul plus RTC-Modul DS3231 ==> bei gutem DCF-Empfang
    Alternative:
  • WLAN-Modul ESP8266 plus RTC-Modul DS3231 ==> bei gutem WLAN-Empfang

Die von Chinaversendern für teils nur 4 Euro verkauften WLAN-Module sind ja auch preislich inzwischen viel interessanter als alle DCF-Module, die es überhaupt noch zu kaufen gibt. Das einzige, das an den ESP8266 Modulen für Arduino-Bastler nachteilig ist, ist die Betriebsspannung von 3.3V, mit der nur wenige Arduino-Boards arbeiten. Dei meisten Arduino-Boards arbeiten mit 5V und erfordern in dem Fall eine entsprechende Schaltung bzw. Vorsichtsmaßnahmen, um zu verhindern, dass 5V Signale auf das WLAN-Modul aufgeschaltet werden. Aber irgendwas ist ja immer.

Im Freien und mit Einschränkungen auch in Fensternähe wäre übrigens auch GPS eine Alternative: Auch GPS-Satelliten senden ein Zeitsignal. Und in fast allen Fällen braucht man für moderne GPS-Module noch nicht mal eine extra RTC, denn diese Module haben eine RTC meist schon eingebaut, oft sogar bereits mit Backup-Batterie auf der Platine.

Ein DCF77 Modul benötigt deutlich weniger Strom als ein ESP8266. Und weil das Modul nicht am Internet hängt kann da auch keiner Schadcode einschleppen. Nur so zum nachdenken.

Was die Störfestigkeit angeht - wie gesagt einfach einen Arduino mit Quarz nehmen und gut.

Ab nächstem Monat wird meine Library auch den Due unterstützen. Der hat immer noch einen Quarz.

Hey ihr,

ich habe die ganzen Bauteile schon hier liegen. Eine RTC von Adafruit, dann noch ESP Module und natürlich noch die DCF Module einmal von Conrad und von Pollin (By the way: Zwei Pollin-Module sind kostengünstig abzugeben. Wer Interesse hat, der kann mir ja eine PN schicken. Sie sind noch originalverpackt).

Die nächsten Schritte wären dann, für Udo mal einige Messungen zu machen und vielleicht auch die Raumsituation zu beschreiben. Ich möchte ja auch noch mal rausfinden, wie das Signal empfangen wird, wenn man ein 5V Netzteil angeschlossen hat und ggf. eben ein 1,3 Zoll OLED in Verbindung mit einem SD-Cardreader, um die Logdateien zu speichern. Udo, unterstützt Deine Libary sowas, oder muss ich ggf. die Write-Befehle auf die SD-Card Ausgabe umschreiben?

Liebe Grüße
Tim

Hängt von der Definition von "Unterstützen" ab. Meine Library dekodiert DCF77 Signale. Was Du damit machst ist der Library egal.

Ja, natürlich. Ich hatte an den DCF77_Scope gedacht. Aber egal. Hier sind mal wie versprochen die Messergebnisse mit meinem UNO R3 mit Quarz im Anhang.

UNO_R3_mit_Quarz_CONRAD_DCF-Modul.txt (331 KB)

Ups, sorry für die sehr späte Antwort. An dem Log kann man zweierlei sehen:

  1. Das Signal ist eher wenig gestört. Nicht das Geringste Problem für meine Library.
  2. Du hast KEINEN Quarz. Bzw. der Uno R3 hat einen Quart für die serielle Schnittstelle, aber der eigentliche Prozessor hängt an einem Resonator. --> Das Design ist Mist, das können einige Klone besser. Für meine Library ist das unbrauchbar.

Hallo,
ich hänge mich hier mal mit dran weil ich gelegentlich auch das Thema DCF77 verfolge.
In dem Zusammenhang bin ich auch über die "DCF77 Library" auf https://blog.blinkenlight.net/ gestoßen.

Dort ist sicherlich alles sehr ausführlich erklärt, aber leider nur auf englisch und deshalb habe ich Probleme damit die Daten aus den Beispielen "DCF77_Scope" und "Superfilter" zu deuten.

Vielleicht kennt hier jemand die Library gut genug um mir auf deutsch ein paar Fragen zu beantworten.

1. Was kann man alles bezüglich der Qualität des empfangenen Signals und der Qualität des Arduinotaktes aus folgenden Zeilen entnehmen?

Decoded time: 16-09-25 7 14:01:05 CEST ..
5   16.09.25(7,0)14:02:04 MESZ 1,1 4 p(8375-424:255) s(197-0:27) m(118-74:7) h(92-48:7) wd(44-22:4) D(110-88:3) M(88-66:3) Y(88-66:3) 44,1,1,50
[1]      1401, +---------+---------+------4XXXXXXXXXXXXXXXXXXXXX4+---------+---------+---------+---------+---------
[2]      1401, +---------+---------+---------1XXXXXXXXXXXXXXXXXX4+---------+---------+---------+---------+---------

Im besonderen geht es um die rot markierten Teile.
5 16.09.25(7,0)14:02:04 MESZ 1,1 4 p(8375-424:255) s(197-0:27) m(118-74:7) h(92-48:7) wd(44-22:4) D(110-88:3) M(88-66:3) Y(88-66:3) 44,1,1,50
[1] 1401, +---------+---------+------4XXXXXXXXXXXXXXXXXXXXX4+---------+---------+---------+---------+---------
[2] 1401, +---------+---------+---------1XXXXXXXXXXXXXXXXXX4+---------+---------+---------+---------+---------

2. Was kann man zusätzlich bezüglich der Qualität des empfangenen Signals und der Qualität des Arduinotaktes aus dem angehängten Mitschnitt von 30 Minuten "Superfilter" entnehmen?

3. Was kann man am empfangenen DCF-Signal evtl. noch optimieren.

Gruß, Peter

30_Minuten_Superfilter.txt (728 KB)

Hallo,

ich schieße mal ins blaue.
Die Streubreite der X'se ist der Indikator für die Empfangsqualität. Je schmaler und dauerhaft schmal umso besser.
Das wandern der Senkrechten der X'se ist ein Indikator das der Takt wegläuft. Resonator statt Quarz. Wenn man die 3000 Zeilen schnell hoch und runter scrollt sieht man das sehr schön. Ich meine das Logfile vom Vorposter.
Laut deinen Logfile driftet der Takt deutlich weniger. Fast gar nicht. Ob du einen Quarz hast demzufolge weis ich nicht. Für mich sieht das optimal aus.

So würde ich das als Laie deuten.

Optimierung kann man mit dem Aufstellungsort des Empfängers. Auch Winkel im Raum. Möglichst wenig Störquellen in der Nähe. Ob das praktisch umsetzbar ist steht auf einem anderen Blatt. Ich habe einen Raum in der Bude da gibts einfach kein DCF Signal.

Moin,
und danke @Doc_Arduino für die Deutung der Ausgabe.

Meine Vermutungen gehen dabei weitgehend in die gleiche Richtung.

Noch ein paar Fakten:
Der "Superfilter" Sketch lief auf einem Arduino mit 16MHz Quarz.

Auf der Senderseite wird die Amplitute des Trägersignals jede Sekunde (außer 59.) auf 25% abgesenkt.
Wird eine "0" übertragen dauert die Absenkung 100ms.
Wird eine "1" übertragen dauert die Absenkung 200ms.

Mein Empfänger macht daraus etwas anderes.
Eine empfangene "0" dauert ca. 100...130ms.
Eine empfangene "1" dauert ca. 200...230ms.
Der Abstand von Sekunde zu Sekunde dauert 1s +/-ca.7ms. Da ist also ein Jitter drin.

Ich deute das so, dass der Empfang an sich recht gut ist. Aber der Decoder der die Absenkung der Amplitude auswertet nicht der beste ist.

Meine Vermutungen zur Ausgabe von "Superfilter":
Die Zeilen mit den "-+------4XX" stellen jeweils eine Sekunde abgeleitet aus dem Takt des Arduino dar.
Die "X" bedeuten dass der Empfänger eine Signal empfangen hat. Für je 10ms wird ein "X" ausgegeben.
Idealerweise stehen da also 10X für eine empfangene "0" und 20X für eine empfangene "1".
Bei mir sind es oft mehr als 10 oder 20X weil die Impulse aus dem Empfänger >100ms oder >200ms dauern.
Oft steht vor und/oder hinter den "X" noch Ziffern. Die kann ich noch nicht deuten.
Dann wird jede Sekunde unterschiedlich in zwei Zeilen ausgegeben. Was das bedeutet weiß ich auch noch nicht.

Wie Doc_Arduino schon erkannt hat, wandert der Beginn der "X"se innerhalb der halben Stunde immer weiter nach links. Zu Anfang beginnt das "X" bei ca. 500ms, am Ende bei ca. 200ms.
Ich würde das so deuten, dass eine Uhr die auf dem Arduino mit dem Quarztakt läuft nach 30 Minuten ca. 300ms nach gehen würde weil der Quartz nur mit 15,9xxxMhz statt 16,0Mhz schwingt.

Mal angenommen, wir haben alles richtig angenommen.
Bleiben noch die Ziffern vor und hinter den "X"en und die Bedeutung
von p, s, m, h, wd, D, M, Y. Das sieht irgendwie nach Sekunde, Minute, Stunde, Tag, Monat, Jahr aus.

Gruß Peter

Was bedeuten die die Ziffern (!!!) [-+],1,2,3,4,5,6,7,8,9,X beim Scope? Naja, das Testprogramm liest 1 mal pro "lokaler" Millisekunde das Modul aus. Oder 10 mal pro 10 Millisekunden. Die Summer der 10 Ergebnisse gibt dann eine Ziffer von 0 - X (in einem Zahlensystem mit Basis 11). D.h. X bedeutet 10 mal eine 1 in 10 Millisekunden gelesen. Anstelle von 0 gebe ich - oder + aus damit es übersichtlicher wird. D.h. jede normalerweise ein - aber alle 10 ms ein +. Das Ergebnis ist ein "ASCII Art" Oszilloskop. Damit kann man sehen wie gut die Empfangsqualität ist. Man kann auch sehen ob die lokale Millisekunde auch wirklich eine Millisekunde lang ist. Wenn nicht läuft das Signal zur Seite weg. Daß man mehr als 10 bzw. 20 X für bekommt obwohl der Träger immer 100-200ms moduliert wird liegt normalerweise daran, daß billige DCF Module relativ niedrige Empfangsbandbreite haben. Für naive Dekoder ist das gut weil dann weniger Rauschen im Signal ist. Für meine Dekoder ist das eher nachteilig weil er einen "optimalen Filterkern" hat. D.h. der Tiefpass führt dazu, daß der Filterkern "verschmiert" und nicht mehr optimal ist. Allerdings ist das Signal fast überall in Deutschland so gut, daß der Effekt nicht weiter auffällt.

Ich hoffe das erklärt das Format der Logdateien.