Go Down

Topic: Ausführung Fehlerhaft/Fehler bei der Zeit (Read 717 times) previous topic - next topic

Ballibum

Jul 22, 2012, 07:57 pm Last Edit: Jul 23, 2012, 06:48 am by Ballibum Reason: 1
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:
Code: [Select]
// 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
Code: [Select]

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

Ballibum

#1
Jul 23, 2012, 06:44 am Last Edit: Jul 23, 2012, 06:52 am by Ballibum Reason: 1
Hi,
vielleicht sollte ich zum Output noch etwas sagen:
Und zwar kommen die "komischen"Uhrzeiten wie 152:23 immer in Abwechslung zu einer exakten Uhrzeit, dadurch werden meine Pins natürlich fehlerhaft geschaltet,d.h. innerhalb einer Sekunde mehrfach An und Aus. Von der Logik her sollte es eigentlich exakt sein. Ist der Arduino wirklich schon an seinen Grenzen angelangt?

mfg
Balli

Vielleicht noch einmal was verwendet wird:

Arduino Mega 2560
Ethernet Shield - im Code noch nicht berücksichtigt
433Mhz - im Code noch nicht Berücksichtigt
Relaiskarte http://www.exp-tech.de/Shields/product-200-201-202.html
Real Time Clock Module http://www.exp-tech.de/Shields/Seeed-Studio-Grove---Real-Time-Clock-Module--RTC-.html

mkl0815

Das Ganze klingt erstmal nach dem RTC-Modul. Ich vermute mal, die Zeit wird zu schnell hintereinander ausgelesen, aber das ist nur eine Vermutung.
Bau doch mal einen Test-Sketch in dem Du nur die Uhrzeit in der Loop aus der RTC liest. Somit kannst Du andere Teile des Codes als Fehlerquelle ausschliessen.



Ballibum

Wenn ich nur die Zeit auslese klappt es, aber auch nur wenn ich einen eigenständigen Sketch schreibe, wenn ich bei dem hier alles auskommentiere ändert sich nichts.

Go Up