DCF77 Programm Problem

Guten Morgen,

ich habe eine LED Lampe die tageszeitabhänig gedimmt werden soll. Zur Zeiterfassung würde ich gerne den DCF77 verwenden.

Nun aber mein Problem: Wenn ich den DCF77 alleine verwende mit den Beispeilprogrammen funktioniert dieser enwandfrei. Integriere ich dieses Programm jedoch in mein Programm bekommt dieser keine Zeit mehr :-/

Ich weiß, dass der DCF77 an Pin 2 angeschlossen sein muss und diesen Interrupt verwendet - dementsprechend habe ich dort auch nichts angeschlossen.

Ansonsten sind noch ein 16x2 LCD und 2 PWM Ports angeschlossen.

/*
 * InternalClockSync.pde
 * example code illustrating time synced from a DCF77 receiver
 * Thijs Elenbaas, 2012
 * This example code is in the public domain.
 
  This example shows how to fetch a DCF77 time and synchronize
  the internal clock. In order for this example to give clear output,
  make sure that you disable logging  from the DCF library. You can 
  do this by commenting out   #define VERBOSE_DEBUG 1   in Utils.cpp. 
 */
#include <LiquidCrystal.h>
#include "DCF77.h"
#include "Time.h"

#define DCF_PIN 2	         // Connection pin to DCF 77 device
#define DCF_INTERRUPT 0		 // Interrupt number associated with pin

enum Helligkeit {Nacht, Daemmerung, Vormittag, Mittag, Nachmittag};

int blue =11;
int white =10;
char buffer[100];
bool time_set = false;
LiquidCrystal lcd(12, 13, 4,5,6,7);
time_t time;
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT);


class Lampe {
  public: 
  Lampe(){brightness_blue=0; brightness_white=0; State= Nacht;}
  void SetBlue(int b){brightness_blue=b;}
  void SetWhite(int w){brightness_white=w;}
  int GetBlue(){return brightness_blue;}
  int GetWhite(){return brightness_white;}
  Helligkeit GetState(){return State;}
  
  void init(){
    Helligkeit h;
    int b, w;
    switch(hour()){
 
    case 8: h=Daemmerung; break;
    case 9: h=Daemmerung; break;
    case 10: h=Vormittag; break;
    case 11: h=Vormittag; break;
    case 12: h= Mittag; break;
    case 13: h= Mittag; break;
    case 14: h= Nachmittag; break;
     case 15: h= Nachmittag; break;
    case 16: h= Daemmerung; break;
     case 17: h= Daemmerung; break;
    case 18: h= Nacht; break;
    default:h= Nacht; break;
    }
 
 switch(h)
    {
     case Nacht: b=1; w=0; break;
     case Daemmerung: b=40; w=40; break;
     case Vormittag: b=170; w=170; break;
     case Mittag: b=240; w=240; break;
     case Nachmittag: b=180; w=180; break;
     default: break;
    }
     
     analogWrite(white, w);
     analogWrite(blue, b);
     brightness_blue=b;
     brightness_white=w; 
     State= h;
 
  }
 //################################# 
  void switchLight(Helligkeit h) {
     int b=0,w=0, difference;
    switch(h)
    {
     case Nacht: b=1; w=0; break;
     case Daemmerung: b=40; w=40; break;
     case Vormittag: b=170; w=170; break;
     case Mittag: b=240; w=240; break;
     case Nachmittag: b=180; w=180; break;
     default: break;
    }
    
    difference= abs(brightness_blue-b);
    
    for (int i=0; i<difference; i++ )
     {
      
       if (h==Daemmerung && brightness_blue==1) 
       {brightness_white=1;
        analogWrite(white, brightness_white);
       }
       
       if(brightness_blue<b)
       {
       analogWrite(white, brightness_white++);
       analogWrite(blue, brightness_blue++);
       }
       
       if(brightness_blue>b)
       {
       analogWrite(white, brightness_white--);
       analogWrite(blue, brightness_blue--);
       }
       
       if (h==Nacht && brightness_blue==1)
      {
        brightness_white=0;
        analogWrite(white, brightness_white);
      }
       
       
      lcd.setCursor(0, 1);
      // print the number of seconds since reset:
      sprintf(buffer, "S: W:%03d B:%03d" ,brightness_white, brightness_blue);
      lcd.print(buffer);
      
      
      delay(3000);
     } 
  }
  
  void check(){
    
    Helligkeit h;
    switch(hour()){
    case 8: h=Daemmerung; break;
    case 10: h=Vormittag; break;
    case 12: h= Mittag; break;
    case 14: h= Nachmittag; break;
    case 16: h= Daemmerung; break;
    case 18: h= Nacht; break;
    
    default: h=State; break;
    }
    if(h!=State) switchLight(h);
  
  
  }
  
  private:
  int brightness_blue;
  int brightness_white;
  Helligkeit State;
  
  
};
 
 Lampe LED;

void setup() {
  setTime(7,50,55,20,3,2014);
   lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Stefans LED");
  Serial.begin(9600); 
  DCF.Start();
  LED.init();
}

void loop() {
  delay(1000);
//  LED.check();
  time_t DCFtime = DCF.getTime(); // Check if new DCF77 time is available
  if (DCFtime!=0)
  {
    Serial.println("Time is updated");
    setTime(DCFtime);
    lcd.setCursor(0, 0);
    lcd.print("Time updated");
    time_set=true;
  }	
   lcd.setCursor(0, 1);
  // print the current time
  sprintf(buffer, "Zeit: %2d:%02d:%02d" ,hour(), minute(), second());
  lcd.print(buffer);

  digitalClockDisplay();  
  
}

void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

Bemerkenswert ist auch noch: Bei unveränderter Hardware bekomme ich mit dem DCF77 Beispielprogramm die Zeit, mit meinem Programm bekomme ich keine Zeit.

Ich weiß wirklich nocht weiter.

Vielen Dank :slight_smile:

Integriere ich dieses Programm jedoch in mein Programm bekommt dieser keine Zeit mehr :-/ Ansonsten sind noch ein 16x2 LCD und 2 PWM Ports angeschlossen. Bemerkenswert ist auch noch: Bei unveränderter Hardware bekomme ich mit dem DCF77 Beispielprogramm die Zeit, mit meinem Programm bekomme ich keine Zeit.

Und was macht die Kombi aus deinem Programm und unveränderter Hardware ? Also ohne die PWM LED anzuschliessen ? DCF ist recht empfindlich, was elektrische Störungen angeht ... Evtl. den DCF Modul mit Antenne woanders hin...

Ich würde auf alle Fälle ein RTC einbauen und diesen mit der DFC77 synchronisieren. Das kannst Du auch in Momenten machen wo keine Stöhrungen zB von der Lampe oder vom PC-Monitor ecc vorhanden sind. Grüße Uwe

Auf die Idee mit dem PWM bin ich noch nicht gekommen, wird aber die Lösung sein:

Ich habe gerade das Signal mit eingeschaltetem PWM getestet und gemerkt, dass dieses gestört ist, mit pwm ausgeschaltet ist es perfekt.

Ich werde also mein Programm einfach ändern, dass die Zeit gesucht wird solange dass PWM signal aus ist :)

Vielen Dank :D

Ich bin nun auf ein weiteres Problem gestoßen - wie ich funde auch sehr komisch :frowning:

Es war tatsächlich so, dass PWM und LCD das Signal gestört haben.

Ich bekomme nun ein Signal wenn ich per USB Kabel am PC die Konsole aktiv habe. Wenn ich das Arduino alleine laufen lasse, also ohne Konsole bekommt es einfach kein Zeitsignal.

Woran könnte denn das liegen?

Ich würde mich über eine Idee wirklich freuen, ich verzweifle nämlich schon daran… Danke :slight_smile:

Ich bekomme nun ein Signal wenn ich per USB Kabel am PC die Konsole aktiv habe. Wenn ich das Arduino alleine laufen lasse, also ohne Konsole bekommt es einfach kein Zeitsignal.

Würde sagen an Stöhrungen der alternativen Stromversorgung. Auch eine fehlende Masseverbindung kann der Grund sein. grüße Uwe

Also ich denke Masse müsste passen - lcd sowie arduino funktionieren bis auf dcf ohne usb Kabel perfekt.

Kann es eventuell an fehlenden kondensatoren liegen? Ich hab 24 v auf einen lm2576 der am Ausgang nur 480 microfarrat hat. Evtl 10nF noch an den Ausgang schalten?

Chilledkroete236: Kann es eventuell an fehlenden kondensatoren liegen? Ich hab 24 v auf einen lm2576 der am Ausgang nur 480 microfarrat hat. Evtl 10nF noch an den Ausgang schalten?

Ja, ist möglich. Versuchs mal mit einer 9V Batterie ab Vin. Grüße Uwe

Der 2576 ist ein Schaltregler, der auf rund 50 KHz taktet. Dein DCF möchte gerne 77 KHz empfangen... der Schaltregler "verschiebt" so 2-3W rum, das Zeitsignal kommt mit ein paar µ oder Nanowatt an... na, klingelt's? ;) Nimm in diesem Fall ausnahmsweise die gute alte 317 "Heizung", das ist ein Linearregler, der alles was über 5V ist verheizt. Restspannung x den aufgenommenen Strom. Der muss also sicherlich einen kleinen Kühlkörper bekommen. Ich bin auch ein Fan der Schaltregler. Versuche zum einen den Schaltregler ruhig zu stellen, indem du ihm am Ausgang statt einem billigen China-Elko einen LowESR Typ verpasst. Bei Reichelt gibts die Panasonic Typen http://www.reichelt.de/Elkos-radial-105-C-1000-5000h/2/index.html?&ACTION=2&LA=2&GROUPID=4000 Dazu parallel dann nochmal einen Keramikkondensator 100n oder mehr. Die Richtung der Spule vom Schaltregler zur Antenne kann auch eine Rolle spielen. Auf alle Fälle, so weit weg, wie möglich. Läuft dein DCF Empfänger mit 3,3V oder 5V? Am Arduino hast du bereits mit einem Linearregler erzeugte 3,3V zur Verfügung. Wenn du bei einem Eigenbau nur mit nacktem Controller 3,3V erzeugen mußt, gibt es Linearregler, die das können. Wenns schnell gehen muß, kannst du auch die Flusspannung einer LED dafür missbrauchen :) Blau sollte so um die 3,3V haben. Experimentiere einfach mit ein paar Farben und Typen. Der DCF Empfänger braucht, soweit ich mich erinnere, unter 5 mA. Vorwiderstand für die LED auf 15-20 mA berechnet, dann kannst du eine ausreichend stabilisierte Spannung an der LED abgreifen. Da das gleiche Spiel. Kleiner Elko und KerKo parallel zu den 3,3V.

Gruß Gerald

Hallo, vielen dank für die Antworten :wink:

Ich hab den DCF77 von Conrad der von 2,5-15V betreiben werden kann.

Momentan bekommt der DCF77 die 5V vom Arduino, an denen auch der LCD Display dran hängt.

Die ganze Schaltung ist um eine LED Lampe herum, die mit 3 pc lüfter auf 12v gekühlt wird und zeitabhängig gesteuert werden soll.

Muss ich nun nur den DCF mit einer sauberen spannung ansteuern oder auch das Arduino selbst?

Prinzipiell nur den DCF, aber Prävention kann nicht schaden, falls das LCD "Störnebel" über die +5V rausschickt. Ich würde einen 100n KerKo direkt auf die Stiftleiste des Displays oder nahe den Stiften auf einem Backplane (weitere Leiterplatte) setzen.

Die einfachen DCF77 Decoder haben alle schon bei sehr geringen Störungen riesige Probleme. Meiner http://blog.blinkenlight.net/experiments/dcf77/dcf77-library/ kommt selbst bei >10 Bitfehlern pro Minute noch nicht aus dem Tritt. Allerdings brauchst Du dafür einen halbwegs aktuellen Compiler. Arduino hat leider immer noch einen 5 Jahre alten Compiler paketiert und der damit erzeugte Code ist zu langsam :( Sobald Du aber einen neueren Compiler installierst geht das sehr gut.

Nachtrag: für meinen Decoder brauchst Du allerdings einen "alten" Arduino, d.h. einen mit Quarz, der neue Uno hat nur einen billigen Resonator und das taugt nicht für sowas.

Oder eine neuere Variante mit Quarz. z.B. einen Freeduino: http://www.komputer.de/zen/index.php?main_page=product_info&cPath=21&products_id=190 (allerdings da nicht auf Lager)

Oder einen Iteaduino: http://www.exp-tech.de/Mainboards/Iteaduino-Leonardo.html

Oder einen Olimexino: http://www.exp-tech.de/Mainboards/Olimexino-328-Arduino-Like-Development-Board.html

Oh fein, die Lib ist fertig :) Ich habe noch einen Duemilanove, der hat einen Quarz. Ein Pollin DCF Modul habe ich mich auch schon auf Halde gelegt. Da werde ich bald mal schauen, ob ich das zum Laufen bekomme.

Gruß Gerald

Der Iteadduino hat aber keiner 328er drauf --> die Timer könnten Probleme machen. Die anderen beiden sollten OK sein. Oder natürlich ein Blinkenlighty ;)

Es gibt auch einen Iteadino mit Atmega328. Ist aber bei exp-tech nicht mehr auf Lager. Vielleicht woanders :)