Wie Empfangskontrolle für DCF77 auf LCD Display darstellen?

Wie kann man eine Empfangskontrolle für DCF77, neben Zeit und Datum, auf einem LCD Display darstellen?

Micky

Am einfachsten ist es wohl, sämtliche übertragene Prüfbits auszuwerten und die neu ermittelte Zeit mit der Zeit der letzten Minute zu vergleichen. Wenn das stimmig ist, ist auch Empfang da.
Du könntest auch testen, ob irgendwelche kurzen Peaks im Signalverlauf auftreten, je nach Filtermethode in der Software zeigen dir diese an, dass der Empfang schlecht ist.

Empfangskontrolle im Sinne, dass das Signal entschlüsselt wurde, oder dass überhaupt ein Signal da ist?

Das überhaupt ein Signal da ist. Wie bei den Funkuhren, wo zum Beispiel ein Funkturm angezeigt wird wenn die Uhr Empfang hat.

Micky

Einfach auf das Ausgangssignal des Empfängers triggern und das Symbol für 2 bis 3 Sekunden im Display belassen. Bei jedem neuen Impuls des DCF77 die 3 Sekunden neu starten.
Grüße Uwe

uwefed:
Einfach auf das Ausgangssignal des Empfängers triggern und das Symbol für 2 bis 3 Sekunden im Display belassen. Bei jedem neuen Impuls des DCF77 die 3 Sekunden neu starten.

Damit stellt man aber nur fest, dass etwas am Ausgang des DCF-Moduls passiert. Und das hat häufig nichts mit dem eigentlichen Funksignal zu tun, sondern mit daneben liegenden Schaltnetzteilen, Invertern von Kaltlichtkathoden etc..

Afair, kommt das DCF77 Signal regelmäßig (sekündlich?)
Wenn die empfangenen Signale regelmäßig angezeigt werden, ist die wahrscheinlichkeit hoch, dass es das DCF77 Signal ist.

Ob jetzt Störungen die Entschlüsselung behindern müßte man anders feststellen.
Ob überhaupt ein Signal ankommt sollte gut erkennbar sein.

Vielleicht helfen die Infos hier weiter:
http://arduino-hannover.de/2012/06/14/dcf77-empfanger-mit-arduino-betreiben/

Hier hatte ich ein ernstes Problem. Zunächst rauschten bei mir die 0 und 1 nur so durch. Also nicht 2 Pegeländerungen pro Sekunde sondern eher so 3-6. Des Rätsels Lösung: Ich hatte den Arduino über den USB Anschluss mit Strom versorgt, zwar über einen Hub mit eigenen Netzteil, aber letztendlich über das PC Netzteil. Offenbar sind in den 5V des PC Netzteils so starke Störungen, die den Empfang unmöglich machen. Nach dem ich das Arduino Netzteil eingesteckt hatte, hab ich wie erwartet die 2 Pegeländerungen pro Sekunde bekommen.

Enam:
Afair, kommt das DCF77 Signal regelmäßig (sekündlich?)

Ja, fast. Der Impuls für die 59. Sekunde fehlt.
Besserungsvorschlag.
Wenn nach ca 2 Sekunden ein Impuls kommt und kein oder max 1 Impuls dazwischen ist dann ist der Empfang gut.
Grüße Uwe

Ist ja alles toll. Wie bitte programmiert man nun sowas?

Micky

Das war aber nicht deine ursprüngliche Frage...

Hat der link dich weiterbringen können?

Was genau möchtest du wie und wann darstellen?
Wie soll das auf dem LCD aussehen?

Was hast du schon, was brauchst du noch?

MfG
Enam

Ist habe eine funktionierende DCF77 Uhr. Nur würde ich halt ein Zeichen auf dem Display haben wollen was anzeigt das Empfang da ist.

Ich nehme dieses Programm.

/**
* Example sketch for the Funkuhr Arduino library
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Für I2C LCD Display

 LiquidCrystal_I2C lcd(0x27,16,2);  // I2C LCD Adresse auf 0x20 gesetzt, 16 Zeichen / 2 Zeilen LCD

//#define DS1307_I2C_ADDRESS 0x68                          // I2C Adresse
#include "Funkuhr.h"

Funkuhr dcf(0, 2, 13, false);
struct Dcf77Time dt = { 0 };

uint8_t curSec;


void dumpTime(void)
{	
Serial.println("DCF77 Time");

// Print date
lcd.print(" ");
lcd.setCursor(3, 0);
if(dt.day < 10)
lcd.print("0");
lcd.print(dt.day, DEC);
lcd.print(".");

if(dt.month < 10)
lcd.print("0");
lcd.print(dt.month, DEC);
lcd.print(".");

if(dt.year == 0)
{
lcd.print("000");
}
else
{
lcd.print("20");
}	

lcd.print(dt.year, DEC);

if(dcf.synced())
{
lcd.print(" ");
}
else
{
Serial.println(" ");
Serial.print("~");
}

// Print Time
lcd.setCursor(4, 1);
if (dt.hour < 10)
lcd.print("0");

lcd.print(dt.hour, DEC);
lcd.print(":");

if (dt.min < 10)
lcd.print("0");

lcd.print(dt.min, DEC);
lcd.print(":");

if (dt.sec < 10)
lcd.print("0");

lcd.print(dt.sec, DEC);

Serial.println(" ");
}


void setup(void)
{
// LCD I2C Initilaisieren und Hintergrundbeleuchtung aktivieren
   lcd.init();
   lcd.backlight();                   
  
  Wire.begin();                                      // I2C-Bus einrichten
  
  lcd.init();                                        // LCD-Anzeige initialisieren
  lcd.clear();
  
  Serial.begin(9600);
dcf.init();
}


void loop(void)
{
dcf.getTime(dt);

if(dt.sec != curSec)
{
dumpTime();
}

curSec = dt.sec;
}

Die DCF77 Uhr ist von Conrad. Das ganze läuft mit einem UNO.

Micky

Nun funktioniert es. Wird immer 0 und 1 im Wechsel dargestellt.

/**
* Example sketch for the Funkuhr Arduino library
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Für I2C LCD Display

//Für Empfanganzeige
#define DCF77PIN 2
unsigned char signal = 0;
unsigned char buffer;

LiquidCrystal_I2C lcd(0x27,16,2);  // I2C LCD Adresse auf 0x20 gesetzt, 16 Zeichen / 2 Zeilen LCD

#include "Funkuhr.h"

Funkuhr dcf(0, 2, 13, false);
struct Dcf77Time dt = { 0 };

uint8_t curSec;

void dumpTime(void)
{	
Serial.println("DCF77 Time");

// Print date
lcd.print(" ");
lcd.setCursor(3, 0);
if(dt.day < 10)
lcd.print("0");
lcd.print(dt.day, DEC);
lcd.print(".");

if(dt.month < 10)
lcd.print("0");
lcd.print(dt.month, DEC);
lcd.print(".");

if(dt.year == 0)
{
lcd.print("000");
}
else
{
lcd.print("20");
}	

lcd.print(dt.year, DEC);

if(dcf.synced())
{
lcd.print(" ");
}
else
{
Serial.println(" ");
Serial.print("~");
}

// Print Time
lcd.setCursor(4, 1);
if (dt.hour < 10)
lcd.print("0");

lcd.print(dt.hour, DEC);
lcd.print(":");

if (dt.min < 10)
lcd.print("0");

lcd.print(dt.min, DEC);
lcd.print(":");

if (dt.sec < 10)
lcd.print("0");

lcd.print(dt.sec, DEC);

Serial.println(" ");
}

void setup(void)
{
  //Für Empfanganzeige
  pinMode(DCF77PIN, INPUT);


// LCD I2C Initilaisieren und Hintergrundbeleuchtung aktivieren
   lcd.init();
   lcd.backlight();                   
  
  Wire.begin();                                      // I2C-Bus einrichten
  
  lcd.init();                                        // LCD-Anzeige initialisieren
  lcd.clear();
  
  Serial.begin(9600);
dcf.init();
}


void loop(void)
{
 //Für Empfanganzeige
 signal = digitalRead(DCF77PIN);
 if (buffer != signal) {
 lcd.setCursor(0, 1);
 lcd.print(signal);
 buffer = signal;
 }
  
dcf.getTime(dt);

if(dt.sec != curSec)
{
dumpTime();
}

curSec = dt.sec;
}

Micky

Wie kann ich eigentlich andere Zeichen als 0 oder 1 verwenden?

Micky

lcd.print(signal);
if(signal == true) lcd.print("Signal");
else lcd.print("Kein Signal");

Funktioniert soweit, nur sobald man eine Empfangskontrolle mit einbaut, neigt die DCF77 zum nachgehen und hat einen schlechteren Empfang.

Woran kann denn das nun wieder liegen?

Micky

Bei meiner DCF77 Lösung The Clock | Blinkenlight gehe ich so vor, daß ich das Signal lokal synthetisiere und das Ergebnis mit dem empfangenen Signal vergleiche. Das Unterprogramm dazu ist "get_prediction_match()". Die Implementation dazu liegt im Namensraum "DCF77_Second_Decoder".

Wenn mehr als die Hälfte der Bits stimmen, dann ist davon auszugehen, daß ein Signal da ist. Gleichzeitig hat man damit auch eine Einschätzung wie gut die Empfangsqualität ist. Wobei das bei meiner Uhr ziemlich egal ist. Die wurde ja extra dafür entwickelt mit sehr geringem Singalrauschabstand noch fertig zu werden.