INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
DCF77 Empfänger
16.07.2016, 15:35
Beitrag #9
RE: DCF77 Empfänger
Nur als Ergänzung der Möglichkeiten:
Ein GPS Empfänger, und sei er noch so billig, schickt nicht nur die (billig=ungenau) GPS Position über UART zum Arduino sondern auch eine exakte (Welt-)Uhrzeit.

Selbst im Haus ist der Empfang von 2-3 Satteliten gewährleistet, wenn auch mit sehr schwachem Signal.
Jetzt nur noch die benötigte Zeitinformation aus den Daten herausfiltern.
Fällt der Empfang aus, kriegt man 0:00:00:000.

Dann muss man die Zeit eben ohne Information laufen lassen.

Binatone
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.07.2016, 18:07
Beitrag #10
RE: DCF77 Empfänger
(16.07.2016 17:05)Lötzinnerhitzer schrieb:  ich hole mir die "Zeit" über Lan bzw. WLan von einem NTP-Server Wink

diese möglichkeit hab ich auch schon gelesen und habe auch schon daran gedacht!

hat jemand eine gute erklärung dazu wie das ganze Wlan und Uhrzeit abfragen läuft?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.07.2016, 12:51
Beitrag #11
RE: DCF77 Empfänger
Hallo,

ich habe mich auch schon jahrelang mit diesem DCF-Zeug rumgeärgert.
Mal ging alles, dann wieder nicht. Dann geht das Datum nicht richtig. Es braucht ewig zum Synchronisieren. Oder es geht erst gar nicht. Egal wie die Antenne ausgerichtet ist.

Früher mit BASCOM, jetzt mit ARDUINO. Angry

Hab keinen Bock mehr drauf und nehme RTC DS3231. Ist supergenau, keine messbare Abweichungen seit einem halben Jahr. Einmal dir richtige Zeit reinprogrammiert und fertig. Sommerzeit-Umschaltung geht auch mit Code.

FERTISCH!

Grüße, Andy
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.07.2016, 14:19 (Dieser Beitrag wurde zuletzt bearbeitet: 19.07.2016 10:53 von ardu_arne.)
Beitrag #12
RE: DCF77 Empfänger
DCF77 ist leider oft nicht störungsfrei zu empfangen. Wichtig ist, das Empfangsmodul möglichst weit von allen störenden Geräten fern zu halten. Manchmal reichen 2m Abstand nicht aus und man braucht je nach Umgebung mehr.

Hast du dir auf dieser Seite die DCF77 Library mal angeschaut. Die scheint mir etwas Fehlertoleranter bei Empfangsproblemen zu sein.

Du weißt, dass dein DCF-Empfangsmodul DCF1 nur maximal 3,5V verträgt und deshalb mit 3,3V zu versorgen ist?

Deinen Sketch aus Beitrag #1 habe ich mal auf das für den Anfang wichtigste eingekürzt.
Code:
/*===============================================================================​​​=
  Einfaches Programm zum Enlesen von digitalen Signalen eines DCF77 Empfängers
  Ausgabe der Impulse auf eine LED
================================================================================​​​==*/


#define DCF77Pin 53                                               // An deisen Pin wird der DCF77 Empfänger angeschlossen
#define LEDPin 13                                                 // Eingelesene Impulse des Empfängers werden hier ausgegeben
byte DCF77Pegel = 0;                                              // Zwischenspeicher


void setup() {
  pinMode(DCF77Pin, INPUT);                                       // DCF77PIN für Eingabe setzen
  pinMode(LEDPin, OUTPUT);                                        // LEDPin für Ausgabe setzen
}

void loop() {
  DCF77Pegel = digitalRead(DCF77Pin);                             // Wert am DCF77Pin einlesen und in DCF77Pegel speichern
  digitalWrite(LEDPin, DCF77Pegel);                               // Eingelesenen Pegel auf LEPin ausgeben (irgendwas muss halt am Arduino blinken)
}

Mit diesem Code soll nur noch die LED blinken um die Empfangsqualität zu beurteilen.
An der Art wie die LED blinkt kannst du beurteilen ob der Empfang sauber ist.
Die LED muss für 100ms leuchten und 900ms aus sein oder für 200ms leuchten und 800ms aus sein.
Nach der 59. Sekunde bleibt die LED für eine Sekunde ganz aus.
In diesem Blinken der LED darf über mehrere Minuten kein Flackern und keine Aussetzer drin sein sonst ist der Empfang nicht gut.

Im Beitrag Beispiel NTP und DHCP ist beschrieben wie man sich die NTP-Zeit in den Arduino holt. An Stelle des Ethernet-Moduls wäre dann für dein Bedarf ein WLAN-Modul einzubinden.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.07.2016, 17:11
Beitrag #13
RE: DCF77 Empfänger
(18.07.2016 14:19)ardu_arne schrieb:  Hast du dir auf dieser Seite die DCF77 Library mal angeschaut. Die scheint mir etwas Fehlertoleranter bei Empfangsproblemen zu sein.

Da bin ich mit der konfiguration nicht zurecht gekommen :-(

nehmen wir dan das an: https://blog.blinkenlight.net/experiment...ple-clock/

Code:
const uint8_t dcf77_analog_sample_pin = 53;
const uint8_t dcf77_sample_pin = A5;  // A5 == d19
const uint8_t dcf77_inverted_samples = 1;
const uint8_t dcf77_analog_samples = 1;

const uint8_t dcf77_monitor_pin = A4;  // A4 == d18

reichts dan wen ich dcf77_analog_sample_pin auf 53 setze?

(18.07.2016 14:19)ardu_arne schrieb:  Du weißt, dass dein DCF-Empfangsmodul DCF1 nur maximal 3,5V verträgt und deshalb mit 3,3V zu versorgen ist?

jop ist an 3,3v am Arduino angeschlossen

(18.07.2016 14:19)ardu_arne schrieb:  Deinen Sketch aus Beitrag #1 habe ich mal auf das für den Anfang wichtigste eingekürzt.

Danke. Test ich gleich noch.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.07.2016, 11:03
Beitrag #14
RE: DCF77 Empfänger
Hallo,
wie ich eben gesehen habe, funktionieren die Librarys und Beispielsketche von "Blinkenlight " wohl nur auf Arduinos mit einem Quarzoszillator. Da du vermutlich einen MEGA mit Keramikresonator hast kannst du die also nicht nutzen und musst auf andere Librarys und Beispiele ausweichen.

Das Testprogramm für eine erste optische Kontrolle der Empfangsqualität sollte aber trotzdem funktionieren.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.07.2016, 12:34
Beitrag #15
RE: DCF77 Empfänger
(18.07.2016 12:51)DL1AKP schrieb:  Hab keinen Bock mehr drauf und nehme RTC DS3231. Ist supergenau, keine messbare Abweichungen seit einem halben Jahr. Einmal dir richtige Zeit reinprogrammiert und fertig. Sommerzeit-Umschaltung geht auch mit Code.

Das sehe ich genau so.

Aber es ist dennoch großartig, wenn sich jemand mit dem Problem auseinander setzt.

Hoffe nur, das es auch ein fertiges Projekt (mit DCF77) wird.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.07.2016, 12:11
Beitrag #16
RE: DCF77 Empfänger
Hy,

ich schließe mich hier auch mal an was das mit dem in den Wahnsinn treiben angeht..

HAtte dann aber mal den hier irgendwo gefunden und umgeschrieben, ausgegeben wird die zeit per LCD über i2c.

Evtl kannst den code zerpflücken und für dich hernehmen.

Code:
#define DCF77PIN 2                     // Input for the DCF receiver
#define BLINKPIN 13                    // LED indicator output
#define DCF_split_millis 140           // Number of milliseconds before we assume a logic 1
#define DCF_sync_millis 1200           // No signal at second 59

// Definitions for the timer interrupt 2 handler
// The Arduino runs at 16 Mhz, we use a prescaler of 64 -> We need to
// initialize the counter with 6. This way, we have 1000 interrupts per second.
// We use tick_counter to count the interrupts.
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#include <Wire.h>
#define INIT_TIMER_COUNT 6
#define RESET_TIMER2 TCNT2 = INIT_TIMER_COUNT
int tick_counter = 0;

                                        // DCF time format struct
struct DCF77Buffer {
  unsigned long long prefix    :21;
  unsigned long long Min    :7;    // minutes
  unsigned long long P1        :1;    // parity minutes
  unsigned long long Hour    :6;    // hours
  unsigned long long P2        :1;    // parity hours
  unsigned long long Day    :6;    // day
  unsigned long long Weekday    :3;    // day of week
  unsigned long long Month    :5;    // month
  unsigned long long Year    :8;    // year (5 -> 2005)
  unsigned long long P3        :1;    // parity
};

                                          // Parity struct
struct {
  unsigned char parity_flag    :1;
  unsigned char parity_min    :1;
  unsigned char parity_hour    :1;
  unsigned char parity_date    :1;
} flags;

                                          // Clock variables
volatile unsigned char DCFSignalState = 0;  
unsigned char previousSignalState;
int previousFlankTime;
int bufferPosition;
unsigned long long dcf_rx_buffer;

                                          // Time variables
volatile unsigned char ss;
volatile unsigned char mm;
volatile unsigned char hh;
volatile unsigned char day;
volatile unsigned char mon;
volatile unsigned int year;

unsigned char previousSecond;

                                          // Initialize the DCF77 routines: initialize the variables,
                                          // configure the interrupt behaviour.
void DCF77Init() {
  previousSignalState=0;
  previousFlankTime=0;
  bufferPosition=0;
  dcf_rx_buffer=0;
  ss=mm=hh=day=mon=year=0;
  pinMode(DCF77PIN, INPUT);
                                          //Timer2 Settings: Timer Prescaler /64,
  TCCR2B |= (1<<CS22);                    // turn on CS22 bit
  TCCR2B &= ~((1<<CS21) | (1<<CS20));     // turn off CS21 and CS20 bits  
                                          // Use normal mode
  TCCR2A &= ~((1<<WGM21) | (1<<WGM20));   // turn off WGM21 and WGM20 bits
  TCCR2B &= ~(1<<WGM22);                  // turn off WGM22
                                          // Use internal clock - external clock not used in Arduino
  ASSR |= (0<<AS2);
  TIMSK2 |= (1<<TOIE2) | (0<<OCIE2A);     //Timer2 Overflow Interrupt Enable  
  RESET_TIMER2;
  attachInterrupt(0, int0handler, CHANGE);
}

// Append a signal to the dcf_rx_buffer. Argument can be 1 or 0. An internal
// counter shifts the writing position within the buffer. If position > 59,
// a new minute begins -> time to call finalizeBuffer().
void appendSignal(unsigned char signal) {
  dcf_rx_buffer = dcf_rx_buffer | ((unsigned long long) signal << bufferPosition);
  // Update the parity bits. First: Reset when minute, hour or date starts.
  if (bufferPosition ==  21 || bufferPosition ==  29 || bufferPosition ==  36) {
    flags.parity_flag = 0;
  }
  // save the parity when the corresponding segment ends
  if (bufferPosition ==  28) {flags.parity_min = flags.parity_flag;};
  if (bufferPosition ==  35) {flags.parity_hour = flags.parity_flag;};
  if (bufferPosition ==  58) {flags.parity_date = flags.parity_flag;};
  // When we received a 1, toggle the parity flag
  if (signal == 1) {
    flags.parity_flag = flags.parity_flag ^ 1;
  }
  bufferPosition++;
  if (bufferPosition > 59) {
    finalizeBuffer();
  }
}

// Evaluates the information stored in the buffer. This is where the DCF77
// signal is decoded and the internal clock is updated.
void finalizeBuffer(void) {
  if (bufferPosition == 59) {
    struct DCF77Buffer *rx_buffer;
    rx_buffer = (struct DCF77Buffer *)(unsigned long long)&dcf_rx_buffer;
    if (flags.parity_min == rx_buffer->P1  &&
        flags.parity_hour == rx_buffer->P2  &&
        flags.parity_date == rx_buffer->P3)
    {
      //convert the received bits from BCD
      mm = rx_buffer->Min-((rx_buffer->Min/16)*6);
      hh = rx_buffer->Hour-((rx_buffer->Hour/16)*6);
      day= rx_buffer->Day-((rx_buffer->Day/16)*6);
      mon= rx_buffer->Month-((rx_buffer->Month/16)*6);
      year= 2000 + rx_buffer->Year-((rx_buffer->Year/16)*6);
    }
  }
  // reset stuff
  ss = 0;
  bufferPosition = 0;
  dcf_rx_buffer=0;
}

// Evaluates the signal as it is received. Decides whether we received
// a "1" or a "0" based on the
void scanSignal(void){
    if (DCFSignalState == 1) {
      int thisFlankTime=millis();
      if (thisFlankTime - previousFlankTime > DCF_sync_millis) {
        finalizeBuffer();
      }
      previousFlankTime=thisFlankTime;
    }
    else {
      /* or a falling flank */
      int difference=millis() - previousFlankTime;
      if (difference < DCF_split_millis) {
        appendSignal(0);
      }
      else {
        appendSignal(1);
      }
    }
}

// The interrupt routine for counting seconds - increment hh:mm:ss.
ISR(TIMER2_OVF_vect) {
  RESET_TIMER2;
  tick_counter += 1;
  if (tick_counter == 1000) {
    ss++;
    if (ss==60) {
      ss=0;
      mm++;
      if (mm==60) {
        mm=0;
        hh++;
        if (hh==24)
          hh=0;
      }
    }
    tick_counter = 0;
  }
};

// Interrupthandler for INT0 - called when the signal on Pin 2 changes.
void int0handler() {
  // check the value again - since it takes some time to
  // activate the interrupt routine, we get a clear signal.
  DCFSignalState = digitalRead(DCF77PIN);
}



// Dump the time to the serial LCD

void DumpTime(void){
  
/*  if (year == 0) {
   lcd.print(bufferPosition);
    lcd.setCursor(0,1);
    lcd.print("  ");
    lcd.setCursor( 0, 0);
  } else {
    lcd.print("  ");
    lcd.setCursor( 0, 0);
    if (day < 10) {
      lcd.print(" ");
      lcd.setCursor( 0,0);
    }
}*/

// de dagen wegschijven naar het display
  if (day == 0) {
    lcd.setCursor( 0,1);
    lcd.print("00");

// tussen streepje plaatsen op display
    lcd.setCursor(2,1);
    lcd.print("-");
    }else{
      if (day <= 9){
        lcd.setCursor( 0,1);
        lcd.print("0");
        lcd.setCursor( 1,1);
        lcd.print(day, DEC);
      }else{
        lcd.setCursor( 0,1);
        lcd.print(day, DEC);
      }
      
// tussen streepje plaatsen op display
  lcd.setCursor(2,1);
  lcd.print("-");
  }  
  
// de maanden wegschijven naar het display
    if (mon == 0) {
    lcd.setCursor(3,1);
    lcd.print("00");

// tussen streepje plaatsen op display    
    lcd.setCursor(5,1);
    lcd.print("-");
  }else{
      if (mon <= 9){
        lcd.setCursor( 3,1);
        lcd.print("0");
        lcd.setCursor( 4,1);
        lcd.print(mon, DEC);
      }else{
        lcd.setCursor( 3,1);
        lcd.print(mon, DEC);
      }
      
// tussen streepje plaatsen op display
  lcd.setCursor(5,1);
  lcd.print("-");
  }

// de jaren wegschijven naar het display
  if (year == 0) {
    lcd.setCursor(6,1);
    lcd.print("0000");
  }else{
  lcd.setCursor(6,1);
  lcd.print(year, DEC);
  }


// de uren weergeven op het display
  if (hh == 0) {
    lcd.setCursor( 12, 1);
    lcd.print("00");
  }
    lcd.setCursor( 12, 1);
  if (hh <= 9) {
    lcd.print("0");
    lcd.setCursor( 13, 1);
    lcd.print(hh, DEC);
  }else{
    lcd.setCursor( 12, 1);
    lcd.print(hh, DEC);
  }

// per seconde de : laten knipperen  
  if ((ss % 2) == 0) {
    lcd.setCursor( 14, 1);
    lcd.print(":");
  } else {
    lcd.print(" ");
  }
  
// de minuten weergeven op het display  
  if (mm == 0) {
    lcd.setCursor( 15, 1);
    lcd.print("00");
  }
    lcd.setCursor( 15, 1);
  if (mm <= 9) {
    lcd.print("0");
    lcd.setCursor( 16, 1);
    lcd.print(mm, DEC);
  }else{
    lcd.setCursor( 15, 1);
    lcd.print(mm, DEC);
  }
  
// per seconde de : laten knipperen  
  if ((ss % 2) == 0) {
    lcd.setCursor( 17, 1);
    lcd.print(":");
  } else {
    lcd.print(" ");
  }
  

// secondes weergeven op display
  if (ss == 0) {
    lcd.setCursor( 18, 1);
    lcd.print("00");
  }
    lcd.setCursor( 18, 1);
  if (ss <= 9) {
    lcd.print("0");
    lcd.setCursor( 19, 1);
    lcd.print(ss, DEC);
  }else{
    lcd.setCursor( 18, 1);
    lcd.print(ss, DEC);
  }

// alles weergeven in arduino programma op pc
  Serial.print(day,DEC);
  Serial.print("-");
  Serial.print(mon,DEC);
  Serial.print("-");
  Serial.print(year,DEC);
  
  Serial.print("   ");    
  
  Serial.print(hh,DEC);
  Serial.print(":");  
  Serial.print(mm,DEC);
  Serial.print(":");  
  Serial.print(ss,DEC);
  
  Serial.print("   ");  
  
  Serial.println(digitalRead(DCF77PIN));
}

// Standard Arduino methods below.
void setup(void) {
  // We need to start serial here again,
  // for Arduino 007 (new serial code)
  Serial.begin(9600);
  lcd.begin (20,4);
  lcd.backlight();
  DCF77Init();
  lcd.setCursor(0,0);
  lcd.print("   DCF77 Funkuhr");
  pinMode(BLINKPIN, OUTPUT);
}

void loop(void) {
    
  if (ss != previousSecond) {
    DumpTime();
    previousSecond = ss;
  }
  if (DCFSignalState != previousSignalState) {
    scanSignal();
    
    if (DCFSignalState) {
      digitalWrite(BLINKPIN, HIGH);
    } else {
      digitalWrite(BLINKPIN, LOW);
    }
    previousSignalState = DCFSignalState;
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Empfänger RF 433 peterfried 6 368 10.06.2016 23:01
Letzter Beitrag: hotsystems
  AKtuelle Uhrzeit bekommen, RTC oder DFC-Empfänger Cray-1 34 15.583 11.02.2016 23:49
Letzter Beitrag: hotsystems
  DMX Empfänger BennIY 12 2.211 24.09.2015 19:51
Letzter Beitrag: BennIY
  Hilfe bei RC-Empfänger Signale auswerten und verarbeiten Pat12-6 7 1.679 19.03.2015 20:17
Letzter Beitrag: Eichner
Wink Bitte helft mir: RC Empfänger auslesen und an Motortreiber weitergeben. christian@schiltkamp.info 7 3.943 15.03.2015 17:54
Letzter Beitrag: Pat12-6
  RC-Empfänger auslesen und Motoren steuern Pat12-6 0 973 14.03.2015 10:29
Letzter Beitrag: Pat12-6
  Auto Level Quadrocopter (Modellbau Empfänger) Neumi 12 1.702 20.01.2015 13:47
Letzter Beitrag: Eichner
  IR SENDER & EMPFÄNGER Marc2014 13 3.471 02.10.2014 11:36
Letzter Beitrag: Marc2014
  RC-Empfänger-Signal auswerten DerFranke 6 3.446 18.09.2014 21:06
Letzter Beitrag: scritch
  IR Sende / Empfänger Klasse - wo hier deponieren? Hobel 0 1.651 15.09.2013 13:00
Letzter Beitrag: Hobel

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste