Liebe Arduino Mitstreiter,
ich habe eine Zeitschaltuhr gebaut mit Hilfe einer Echtzeituhr und einem DCF77 Empfänger. Der Arduino soll je nach Uhrzeit etwas schalten. Da dies Hochgenau geschehen soll wird die Echtzeituhr in Regelmäßigen Abständen von einer Funkuhr neu geschrieben. Dies funktioniert weitestgehend wie gewünscht. Doch leider stürzt der Arduino regelmäßig ab. So das weder die angeschlossenen LED´s blinken noch die gewünschte Umschaltung funktioniert. Bei einem Test ist mir jetzt aufgefallen das dieses Verhalten nicht eintritt wenn die Funkuhr keinen Empfang hat. Somit die RTC nicht neu beschrieben wird. Das heißt also irgendetwas muss ich an meinem Code ändern. Eventuell könnt ihr mir ja weiterhelfen. Hier mein Programm:
#include <DCF77.h>
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#define DCF_PIN 2
#define DCF_INTERRUPT 0
time_t time;
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT, true);
int ledPinStatusDCF = 6; //DCF77 Statusanzeige
int ledPin1 = 12 ; //LED an, gleich Relais1 zieht an
int ledPin2 = 13 ; //LED an, gleich Relais2 zieht an
int Relais1 = 3 ; //Schaltet Radio
int Relais2 = 7 ; //Reserve Relais wird von Pin 7 geschaltet
//------Relais 1 Von Uhrzeit1 On bis Uhrzeit1 Off----------------------------------------
int OnStunde1 = 6;
int OnMinute1 = 0;
int OffStunde1 = 6;
int OffMinute1 = 5;
//------Relais 1 Von Uhrzeit2 On bis Uhrzeit2 Off
int OnStunde2 = 6;
int OnMinute2 = 30;
int OffStunde2 = 6;
int OffMinute2 = 35;
//------Relais 1 Von Uhrzeit3 On bis Uhrzeit3 Off
int OnStunde3 = 7;
int OnMinute3 = 0;
int OffStunde3 = 7;
int OffMinute3 = 5;
//------Relais 1 Von Uhrzeit4 On bis Uhrzeit4 Off
int OnStunde4 = 7;
int OnMinute4 = 30;
int OffStunde4 = 7;
int OffMinute4 = 35;
//------Relais 1 Von Uhrzeit5 On bis Uhrzeit5 Off
int OnStunde5 = 8;
int OnMinute5 = 0;
int OffStunde5 = 8;
int OffMinute5 = 5;
//------Relais 1 Von Uhrzeit6 On bis Uhrzeit6 Off
int OnStunde6 = 8;
int OnMinute6 = 30;
int OffStunde6 = 8;
int OffMinute6 = 35;
//------Relais 1 Von Uhrzeit7 On bis Uhrzeit7 Off
int OnStunde7 = 9;
int OnMinute7 = 0;
int OffStunde7 = 9;
int OffMinute7 = 5;
//------Relais 1 Von Uhrzeit8 On bis Uhrzeit8 Off
int OnStunde8 = 9;
int OnMinute8 = 30;
int OffStunde8 = 9;
int OffMinute8 = 35;
//------Relais 1 Von Uhrzeit9 On bis Uhrzeit9 Off
int OnStunde9 = 9;
int OnMinute9 = 30;
int OffStunde9 = 9;
int OffMinute9 = 35;
//--------------------Relais1-Ende------------------------------------
//------Relais 2 Von Uhrzeit1 On bis Uhrzeit1 Off
int OnStunde1Relais2 = 11;
int OnMinute1Relais2 = 0;
int OffStunde1Relais2 = 11;
int OffMinute1Relais2 = 2;
//------Relais 2 Von Uhrzeit2 On bis Uhrzeit 2 Off
int OnStunde2Relais2 = 11;
int OnMinute2Relais2 = 6;
int OffStunde2Relais2 = 11;
int OffMinute2Relais2 = 10;
//--------------------Relais2-Ende------------------------------------
void setup() {
pinMode(ledPinStatusDCF, OUTPUT);
pinMode(ledPin1, OUTPUT);
pinMode(Relais1, OUTPUT);
pinMode(Relais2, OUTPUT);
digitalWrite(Relais2, LOW);
//Serial.begin(9600);
DCF.Start();
setSyncProvider(RTC.get);
}
void loop() {
time_t DCFtime = DCF.getTime();
if (DCFtime!=0) {
tmElements_t tm;
breakTime(DCFtime, tm);
if (RTC.write(tm)) {
//Serial.println("RTC erfolgreich gesetzt!"); //DCF77 Empfang gut und RTC gesetzt -> LED leuchtet für 45 Sekunden
//digitalClockDisplay(DCFtime);
digitalWrite(ledPinStatusDCF, HIGH);
delay(55000);
digitalWrite(ledPinStatusDCF, LOW);
} else {
delay(500);
}
} else {
digitalWrite(ledPinStatusDCF, HIGH); //Fehler bei DCF77 Empfang -> LED blinkt
delay(250);
digitalWrite(ledPinStatusDCF, LOW);
delay(250);
}
time_t t = now();
int aktminute=minute(t); //aktuelle Minute setzen
int akthour=hour(t); //aktuelle Stunde setzen
if ((akthour == OnStunde1)&&(aktminute==OnMinute1))
{
digitalWrite(ledPin1, HIGH);
digitalWrite(Relais1, HIGH);
}
if ((akthour == OffStunde1)&&(aktminute==OffMinute1))
{
digitalWrite(ledPin1, LOW);
digitalWrite(Relais1, LOW);
}
if ((akthour == OnStunde2)&&(aktminute==OnMinute2))
{
digitalWrite(ledPin1, HIGH);
digitalWrite(Relais1, HIGH);
}
if ((akthour == OffStunde2)&&(aktminute==OffMinute2))
{
digitalWrite(ledPin1, LOW);
digitalWrite(Relais1, LOW);
}
if ((akthour == OnStunde3)&&(aktminute==OnMinute3))
{
digitalWrite(ledPin1, HIGH);
digitalWrite(Relais1, HIGH);
}
if ((akthour == OffStunde3)&&(aktminute==OffMinute3))
{
digitalWrite(ledPin1, LOW);
digitalWrite(Relais1, LOW);
}
if ((akthour == OnStunde4)&&(aktminute==OnMinute4))
{
digitalWrite(ledPin1, HIGH);
digitalWrite(Relais1, HIGH);
}
if ((akthour == OffStunde4)&&(aktminute==OffMinute4))
{
digitalWrite(ledPin1, LOW);
digitalWrite(Relais1, LOW);
}
if ((akthour == OnStunde5)&&(aktminute==OnMinute5))
{
digitalWrite(ledPin1, HIGH);
digitalWrite(Relais1, HIGH);
}
if ((akthour == OffStunde5)&&(aktminute==OffMinute5))
{
digitalWrite(ledPin1, LOW);
digitalWrite(Relais1, LOW);
}
if ((akthour == OnStunde6)&&(aktminute==OnMinute6))
{
digitalWrite(ledPin1, HIGH);
digitalWrite(Relais1, HIGH);
}
if ((akthour == OffStunde6)&&(aktminute==OffMinute6))
{
digitalWrite(ledPin1, LOW);
digitalWrite(Relais1, LOW);
}
if ((akthour == OnStunde7)&&(aktminute==OnMinute7))
{
digitalWrite(ledPin1, HIGH);
digitalWrite(Relais1, HIGH);
}
if ((akthour == OffStunde7)&&(aktminute==OffMinute7))
{
digitalWrite(ledPin1, LOW);
digitalWrite(Relais1, LOW);
}
if ((akthour == OnStunde8)&&(aktminute==OnMinute8))
{
digitalWrite(ledPin1, HIGH);
digitalWrite(Relais1, HIGH);
}
if ((akthour == OffStunde8)&&(aktminute==OffMinute8))
{
digitalWrite(ledPin1, LOW);
digitalWrite(Relais1, LOW);
}
if ((akthour == OnStunde9)&&(aktminute==OnMinute9))
{
digitalWrite(ledPin1, HIGH);
digitalWrite(Relais1, HIGH);
}
if ((akthour == OffStunde9)&&(aktminute==OffMinute9))
{
digitalWrite(ledPin1, LOW);
digitalWrite(Relais1, LOW);
}
if ((akthour == OnStunde1Relais2)&&(aktminute==OnMinute1Relais2))
{
digitalWrite(ledPin2, HIGH);
digitalWrite(Relais2, HIGH);
}
if ((akthour == OffStunde1Relais2)&&(aktminute==OffMinute1Relais2))
{
digitalWrite(ledPin2, LOW);
digitalWrite(Relais2, LOW);
}
if ((akthour == OnStunde2Relais2)&&(aktminute==OnMinute2Relais2))
{
digitalWrite(ledPin2, HIGH);
digitalWrite(Relais2, HIGH);
}
if ((akthour == OffStunde2Relais2)&&(aktminute==OffMinute2Relais2))
{
digitalWrite(ledPin2, LOW);
digitalWrite(Relais2, LOW);
}
}
//// Hilfsfunktion für serielle Ausgabe
//void digitalClockDisplay(time_t _time){
// tmElements_t tm;
// breakTime(_time, tm);
// Serial.println("");
// Serial.print("Zeit: "); Serial.print(tm.Hour);
// Serial.print(":"); printDigits(tm.Minute);
// Serial.print(":"); printDigits(tm.Second);
// Serial.print(" Datum: "); Serial.print(tm.Day);
// Serial.print("."); Serial.print(tm.Month);
// Serial.print("."); Serial.println(tm.Year+1970);
//}
//// Hilfsfunktion für Formatierung
//void printDigits(int digits){
// Serial.print(":");
// if(digits < 10)
// Serial.print('0');
// Serial.print(digits);
//}
Die LED an Pin 6 leuchtet 45 Sekunden sobald ein verwertbares Zeitsignal empfangen wird und die RTC gesetzt wird. Falls kein Zeitsignal empfangen wird und die RTC nicht gesetzt werden konnte, blinkt die LED im Viertelsekundentakt.
Viele Grüße,
DaHu