Hallo Forum,
mein Code bereitet mir gerade echte Sorgen, denn es kommen derzeit einige Fehler zustande, die ich nicht beurteilen kann!
Anscheinend ist der Code schon zu intensiv: (wenn ich die Arrays bei 3 Inhalten durchlaufen lasse klappt alles)-Fehler anscheinend in der Uhrzeit-siehe Output.
hier einmal der Code:
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
int zwischenspeicher = 0;
int zeitsteuerung[10][3] = { //Position im Statusarray, Anzeit,Auszeit
{ 0,10,20}, //Tageslicht von 10 bis 20 Uhr ;0 entspricht der Position im Statusarray
{ 3,10,12}, //Heizlampen von 10 bis 12
{ 4,10,12},
{ 3,16,17}, //Heizlampen von 16 bis 17
{ 4,16,17},
{ 5,20,22}, //IKEA von 20 bis 22
{ 9,20,22}, //Deckenbeleuchtung 20 bis 22
{10,20,22},
{ 7,21, 5}, //IR von 21 bis 5 Uhr
{ 8,21, 5}
}; //
int anzahl_intervalle = 10;
int geraeteStatus[11][3] = { //Pin; ob HIGH(0) oder LOW(1) Geraet anschaltet, Status 0 => off und 1 => on
{35,1,0}, //Tageslicht
{12,0,0}, //Höhle unten
{11,0,0}, //Höhle oben
{33,1,0}, //Heizlampe 1
{37,1,0}, //Heizlampe 2
{31,1,0}, //IKEA Aussen LEDs
{39,1,0}, //Beregnungsanlage
{ 5,0,0}, //IR 1
{ 6,0,0}, //IR 2
{ 8,0,0}, //Decke 1
{ 9,0,0}, //Decke 2
};
int anzahl_Geraete = 11;
void setup () {
Serial.begin(9600);
Wire.begin();
RTC.begin();
if (! RTC.isrunning())
{
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime("Jul 22 2012", "17:58:00"));
}
//Geraete als Output definieren
for(int i = 0; i<anzahl_Geraete;i++)
{
pinMode(geraeteStatus[i][0],OUTPUT);
}
}
void loop () {
uhrzeit();
statusauswerten();
}
void statusauswerten()
{
for(int i = 0; i<anzahl_Geraete; i++) //Geht alles Geräte durch
{
if(geraeteStatus[i][1] == 0) //Wenn es sich um ein PWM-Gerät handelt, HIGH => On
{
if(geraeteStatus[i][2] == 1)
{
digitalWrite(geraeteStatus[i][0],HIGH); //AN bei Geraeten mit HIGH =>On
}
else
{
digitalWrite(geraeteStatus[i][0],LOW); //AUS bei Geraeten mit LOW =>Off
}
}
else
{
if(geraeteStatus[i][2] == 1) //Relais, dadurch sind die Geräte bei nicht an =>off
{
digitalWrite(geraeteStatus[i][0],LOW); //AN bei Geraeten mit LOW =>On
}
else
{
digitalWrite(geraeteStatus[i][0],HIGH); //AUS bei Geraeten mit HIGH =>Off
}
}
}
}
void uhrzeit()
{
DateTime now = RTC.now(); //Bekomme die Uhrzeit
if(zwischenspeicher != now.minute())
{
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
zwischenspeicher = now.minute();
}
/*
* Zeitsteurerung
*/
for (int i = 0; i<anzahl_intervalle; i++) //Gehe alle Zeitintervalle durch und setze ggf den Status im Statusarray
{
int statusposition = zeitsteuerung[i][0];
if((now.hour() >= zeitsteuerung[i][1]) && (now.hour() < zeitsteuerung [i][2]))
{
if(geraeteStatus[statusposition][2]==0) //Sollte sich der Status ändern gib eine Nachricht von dir
{
Serial.print("Pin: ");
Serial.print(geraeteStatus[statusposition][0]);
Serial.println(" angeschaltet");
}
geraeteStatus[statusposition][2] = 1;
}
else
{
if(geraeteStatus[statusposition][2]==1)
{
Serial.print("Pin: ");
Serial.print(geraeteStatus[statusposition][0]);
Serial.println(" ausgeschaltet");
}
geraeteStatus[statusposition][2] = 0;
}
}
}
Hier die Ausgabe über den Monitor
152:23:0Pin: 35 ausgeschaltet
19:48:29Pin: 35 angeschaltet
152:23:0Pin: 35 ausgeschaltet
19:48:29Pin: 35 angeschaltet
Pin: 35 ausgeschaltet
Pin: 35 angeschaltet
152:23:0Pin: 35 ausgeschaltet
19:48:29Pin: 35 angeschaltet
Pin: 35 ausgeschaltet
Pin: 35 angeschaltet
Pin: 35 ausgeschaltet
Pin: 35 angeschaltet
165:165:85Pin: 35 ausgeschaltet
19:48:30Pin: 35 angeschaltet
152:23:0Pin: 35 ausgeschaltet
19:48:30Pin: 35 angeschaltet
152:23:0Pin: 35 ausgeschaltet
19:48:30Pin: 35 angeschaltet
152:23:0Pin: 35 ausgeschaltet
19:48:30Pin: 35 angeschaltet
152:23:0Pin: 35 ausgeschaltet
19:48:30Pin: 35 angeschaltet
Wie man sieht wird die Uhrzeit zwischendurch falsch berechnet, dadurch wird die Zeit auch x mal pro Sekunde ausgegeben, obwohl sie nur einmal die Minute ausgegeben werden sollte. hat jemand eine Idee???
mfg
Balli