DCF77 Modul in Arduino Code einbinden nur wie?

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Antworten
Benutzeravatar
Andreas_P
Beiträge: 1400
Registriert: Mo 12. Aug 2013, 11:35
Wohnort: Lohr am Main
Kontaktdaten:

Re: DCF77 Modul in Arduino Code einbinden nur wie?

Beitrag von Andreas_P »

DCF Modul und Rheinturm-Uhr Schaltung funktionieren.
Auf dem Arduino Uno habe ich nurnoch die Analogports A3 bis A5 frei.
Benutzeravatar
Hightech
Beiträge: 11307
Registriert: So 11. Aug 2013, 18:37

Re: DCF77 Modul in Arduino Code einbinden nur wie?

Beitrag von Hightech »

Welchen Port du nutzt ist ja egal, so lange es nicht Komplikationen mit den beiden Codes gibt.
Also tut die DCF77 und die Uhr auf der selben Hardware funktionieren, nur nicht beide Programme gleichzeitig?
Benutzeravatar
Andreas_P
Beiträge: 1400
Registriert: Mo 12. Aug 2013, 11:35
Wohnort: Lohr am Main
Kontaktdaten:

Re: DCF77 Modul in Arduino Code einbinden nur wie?

Beitrag von Andreas_P »

Genau beides funktioniert auf den gleichen Arduino.
Für das DCF77 benutze ich ein Testprogramm das ich weiter oben schon einmal gepostet hatte. Dort ist auch der Code für die Uhr ohne DCF77 Modul vorhanden.
Beide habe ich unabhängig voneinander laufen lassen. Beide Programme funktionieren, sowie die Hardware.
Morgen mal den Pin2 für das DCF77 Modul auf dem Analog Pin A3 umschreiben.

Update: Vorhin festgestellt das ich morgen nochmal mit dem Code von vorne anfangen darf. :(
Benutzeravatar
Andreas_P
Beiträge: 1400
Registriert: Mo 12. Aug 2013, 11:35
Wohnort: Lohr am Main
Kontaktdaten:

Re: DCF77 Modul in Arduino Code einbinden nur wie?

Beitrag von Andreas_P »

Ich habe heute Vormittag versucht den Arduino Code von der Rheinturmfunkuhr mit Arduino http://www.hjberndt.de/soft/rtctftdcf.html
auf dem Code der Rheinturmuhr mit Arduino http://www.hjberndt.de/soft/rtc.html anzupassen.

Das ist mein Arduino Code.

Code: Alles auswählen

//DCF77
#include <DCF77.h>  
#include <TimeLib.h> 

#define DCF_PIN 2  
#define DCF_INTERRUPT 0   

//time_t time;
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT);
#define A0 14 //ANALOG 0
#define A1 15
#define A2 16
#define INTERVAL 1000

//PINS SEKUNDEN MINUTEN STUNDEN
byte oneSecond[] = {0,1,2,3,4,5,6,7,8}; //No Serial on 0/1
byte tenSecond[] = {9,10,11,12,13};     //
byte theSwitch[] = {14,15,16};          //SEKUNDE MINUTE STUNDE
int s10=0,s1=0; //ONESECOND TENSECOND BAND
int m10=2,m1=4;
int h10=1,h1=9;
#define STIME 60
int sync=STIME; //SyncSignTime

unsigned long t,t0; //TIMEINIT

void INTITIME(void){t0=millis();}
unsigned long TIMEREAD(void){return millis()-t0;}

void setup()
{int i;
 for(i=0; i<sizeof(oneSecond);i++)pinMode(oneSecond[i],OUTPUT);
 for(i=0; i<sizeof(tenSecond);i++)pinMode(tenSecond[i],OUTPUT);
 for(i=0; i<sizeof(theSwitch);i++)pinMode(theSwitch[i],OUTPUT);
 digitalWrite(A0, LOW);
 digitalWrite(A1, LOW);
 digitalWrite(A2, LOW);
}

void loop()
{int i;
 t=TIMEREAD();
 do
 {for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond[i],s1<=i?LOW:HIGH);  //EINERBAND SEKUNDEN
  for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond[i],s10<=i?LOW:HIGH); //ZEHNERBAND SEKUNDEN 
  digitalWrite(A0, HIGH);//Masse an Sekunden
  delay(1);             //SHOWTIME SEKUNDEN
  digitalWrite(A0, LOW);
  for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond[i],m1<=i?LOW:HIGH);  //EINERBAND MINUTEN
  for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond[i],m10<=i?LOW:HIGH); //ZEHNERBAND MINUTEN 
  digitalWrite(A1, HIGH);//Masse an MINUTEN
  delay(1);             //SHOWTIME MINUTEN
  digitalWrite(A1, LOW);
  for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond[i],h1<=i?LOW:HIGH);  //EINERBAND STUNDEN
  for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond[i],h10<=i?LOW:HIGH); //ZEHNERBAND STUNDEN
  digitalWrite(A2, HIGH);//Masse an STUNDEN
  delay(1);             //SHOWTIME STUNDEN
  digitalWrite(A2, LOW);
 }while(TIMEREAD()<(t+INTERVAL));
 //---------------------------------
 sync++; 
 time_t DCFtime = DCF.getTime();
 if (DCFtime!=0)
 {char n='0';
  tmElements_t tm;   
  breakTime(DCFtime, tm);
  //sprintf(s,"%02d:%02d:%02d",tm.Hour,tm.Minute,tm.Second);
  //Serial.println(s);
  h10=s[0]-n;  h01=s[1]-n;
  //m10=s[3]-n;  m01=s[4]-n;
  //s10=s[6]-n;  s01=s[7]-n;
  //tft.setCursor(3, 4);
  //sprintf(s,"%02d.%02d.%02d",tm.Day,tm.Month,
  //        tm.Year+1970-2000);
  //tft.print(s);
  sync=0;
 }
 else
 {s1++;                   //s++;
  if(s01>=10){s01=0;s10++;} 
  if(s10>=6){s10=0;m01++;} //m++;
  if(m01>=10){m01=0;m10++;}
  if(m10>=6){m10=0;h01++;} //h++;
  if(h01>=10){h01=0;h10++;}
  if(h10>=2 && h01>=4){h10=0;h01=0;}
}
 //waiting ...
 while(TIMEREAD()<(t+interval));
 //one second
 interval=analogRead(A0)==0?100:1000;
}
 
// s1++;                   //s++;
// if(s1>=10){s1=0;s10++;} 
// if(s10>=6){s10=0;m1++;} //m1++;
// if(m1>=10){m1=0;m10++;}
// if(m10>=6){m10=0;h1++;} //h1++;
// if(h1>=10){h1=0;h10++;}
// if(h10>=2 && h1>=4){h10=0;h1=0;}
//}

Habe leider keinen Plan mehr was ich im Code verändern muss, da mit es funktioniert.
Profipruckel
Beiträge: 1506
Registriert: Di 13. Aug 2013, 19:10
Wohnort: Niedersachsen Süd-Ost

Re: DCF77 Modul in Arduino Code einbinden nur wie?

Beitrag von Profipruckel »

Andreas_P hat geschrieben: Sa 8. Mai 2021, 21:49 Auf dem Arduino Uno habe ich nurnoch die Analogports A3 bis A5 frei.
Dann bemühe den Lötkolben und schaffe Pin2 frei.
Andreas_P hat geschrieben: Sa 8. Mai 2021, 14:24 Ich habe es mal so versucht.

Code: Alles auswählen

#define DCF_PIN A3
#define DCF_INTERRUPT 0
Ich bin nicht sicher, ob die Zuweisung "A3" zulässig ist, für digitalen Betrieb sind die Ports A0..5 als 14..19 ansprechbar, "#define DCF_PIN 17".

Aber, ich lese da Interrupt
https://www.arduino.cc/reference/de/lan ... interrupt/ :
Benutzbare Digitalpins für Interrupts Uno, Nano, Mini, andere 328-basierte 2, 3

Ich interpretiere das so, dass Du zwingend 2 oder 3 benutzen musst.

Es sollte doch machbar sein, in den Einsprung der DCF-Decodierung ein
Serial.print ("Routine erreicht ") reizubasteln und zu gucken?

Ich bin nicht der große Programmierkünstler, aber wenn bei mir etwas nicht laufen will, mache ich das so: Ich stricke Ausgaben dazwischen und gucke, wie weit ich komme. Anstatt seriell kann man auch ins Display schreiben, so man hat oder eine LED anknipsen.
Benutzeravatar
Andreas_P
Beiträge: 1400
Registriert: Mo 12. Aug 2013, 11:35
Wohnort: Lohr am Main
Kontaktdaten:

Re: DCF77 Modul in Arduino Code einbinden nur wie?

Beitrag von Andreas_P »

Als Eingangspin für das Funkuhrmodul habe ich als DCF_Pin 2 in verwendung.
Folgender Fehler wird von der IDE ausgegeben.

2021-05-09_19h06_00.jpg
Benutzeravatar
Sunset
Beiträge: 1498
Registriert: Fr 6. Dez 2013, 15:19

Re: DCF77 Modul in Arduino Code einbinden nur wie?

Beitrag von Sunset »

Andreas_P hat geschrieben: So 9. Mai 2021, 19:32 Folgender Fehler wird von der IDE ausgegeben.

Der Compiler sagt Dir, Deine Variable s, die Du als Array s[0] und s[1] benutzt, ist nicht definiert. Er kennt weder s noch s[0] oder s[1].
Benutzeravatar
Andreas_P
Beiträge: 1400
Registriert: Mo 12. Aug 2013, 11:35
Wohnort: Lohr am Main
Kontaktdaten:

Re: DCF77 Modul in Arduino Code einbinden nur wie?

Beitrag von Andreas_P »

So der nächste Versuch, leider bin ich kein Fachinformatiker oder Diplom-Informatiker.
Der Digitalpin des Ardruinos ist der Eingang für das DCF Modul.
Diesmal meldet Compiler keine Fehler, aber die Uhrzeit von dem DCF Modul wird nicht
über die LEDs ausgegeben. Irgendwo wird was nicht richtig verwurstet aber nur wo?

Code: Alles auswählen

//DCF77
#include <DCF77.h>  
#include <TimeLib.h> 

#define DCF_PIN 2  
#define DCF_INTERRUPT 0   

//time_t time;
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT);

#define A0 14 //ANALOG 0
#define A1 15
#define A2 16
#define INTERVAL 1000

//PINS SEKUNDEN MINUTEN STUNDEN
byte oneSecond[] = {0,1,3,4,5,6,7,8}; //No Serial on 0/1
byte tenSecond[] = {9,10,11,12,13};     //
byte theSwitch[] = {14,15,16};          //SEKUNDE MINUTE STUNDE
int s10=0,s1=0; //ONESECOND TENSECOND BAND
int m10=0,m1=0;
int h10=0,h1=0;
#define STIME 60
int sync=STIME; //SyncSignTime

unsigned long t,t0,interval=1000; //TIMEINIT 
unsigned long TIMEREAD(void){return millis()-t0;}

void setup()
{int i;
 for(i=0; i<sizeof(oneSecond);i++)pinMode(oneSecond[i],OUTPUT);
 for(i=0; i<sizeof(tenSecond);i++)pinMode(tenSecond[i],OUTPUT);
 for(i=0; i<sizeof(theSwitch);i++)pinMode(theSwitch[i],OUTPUT);
 digitalWrite(A0, LOW);
 digitalWrite(A1, LOW);
 digitalWrite(A2, LOW);
 DCF.Start();
  t0=millis();
}

void loop()
{int i;
 t=TIMEREAD();
 do
 {for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond[i],s1<=i?LOW:HIGH);  //EINERBAND SEKUNDEN
  for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond[i],s10<=i?LOW:HIGH); //ZEHNERBAND SEKUNDEN 
  digitalWrite(A0, HIGH);//Masse an Sekunden
  delay(1);             //SHOWTIME SEKUNDEN
  digitalWrite(A0, LOW);
  for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond[i],m1<=i?LOW:HIGH);  //EINERBAND MINUTEN
  for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond[i],m10<=i?LOW:HIGH); //ZEHNERBAND MINUTEN 
  digitalWrite(A1, HIGH);//Masse an MINUTEN
  delay(1);             //SHOWTIME MINUTEN
  digitalWrite(A1, LOW);
  for(i=0;i<sizeof(oneSecond);i++)digitalWrite(oneSecond[i],h1<=i?LOW:HIGH);  //EINERBAND STUNDEN
  for(i=0;i<sizeof(tenSecond);i++)digitalWrite(tenSecond[i],h10<=i?LOW:HIGH); //ZEHNERBAND STUNDEN
  digitalWrite(A2, HIGH);//Masse an STUNDEN
  delay(1);             //SHOWTIME STUNDEN
  digitalWrite(A2, LOW);
 }while(TIMEREAD()<(t+INTERVAL));
 //---------------------------------


sync++; 
 time_t DCFtime = DCF.getTime();
 if (DCFtime!=0)
 {char n='0';
  tmElements_t tm;   
  breakTime(DCFtime, tm);
  sync=0;
 }
 s1++;                   //s++;
 if(s1>=10){s1=0;s10++;} 
 if(s10>=6){s10=0;m1++;} //m1++;
 if(m1>=10){m1=0;m10++;}
 if(m10>=6){m10=0;h1++;} //h1++;
 if(h1>=10){h1=0;h10++;}
 if(h10>=2 && h1>=4){h10=0;h1=0;}
}

Benutzeravatar
Hightech
Beiträge: 11307
Registriert: So 11. Aug 2013, 18:37

Re: DCF77 Modul in Arduino Code einbinden nur wie?

Beitrag von Hightech »

Naja, so grundsätzlich muss man den Code schon verstehen, sonst wird das nix.
Soweit ich das erkannt habe, wird die Rheinturmuhr aus der TIMEREAD() Funktion mit der "Uhrzeit" versorgt, und zwar wir die über die Zeitbasis millis() bebildet, was eigentlich nur ein hochlaufender Zähler ist in Millisekunden.
Die DCF-Uhr gibt die Zeit in die Variable "DCFtime"
Das heißt ja, man muss die Variable DCFtime an die Rheinturmuhr weitergeben.
Leider ist die Rheinturmuhr keine Funktion, an die man schlicht die Uhrzeit geben kann.
Man muss die DCFtime in millis umrechnen und dann in die Funktion TIMEREAD einbauen.
So, das wenn die Rheinturmuhr die Funktion TIMEREAD() aufruft, dort die DCFtime ausgelesen wird und in der richtigen Form übergeben wird.
Antworten