Ausgang in Abhängigkeit von Zeit schalten

hallo zusammen,

ich weiß es ist ca der 1000 Thread zu dem Thema Zeitschaltuhr, aber trotz meiner Suche komme ich leider nicht weiter. Ich vermute es handelt sich um einen ganz doofe einfachen Fehler, aber da fehlt wir leider noch die Übersicht für.

Ausgangssituation ist ein Temperatur-, Feuchtigkeit- und Helligkeitslogger. Dieser soll quasi als "Lebenszeichen" mit jedem Durchgang zwei LED abwechselt an und aus schalten. Das Klappt auch alles. Damit Nachts das Teil nicht nervt sollen die LEDs dann aus gehen bzw. bleiben. Die Uhrzeit wird aus einer RTC bezogen.

Das aus schalten klappt aber irgendwie nicht so wirklich. Scheinbar ist es so, das es dann klappt wenn der Arduino Strom bekommt wenn die LEDs aus sein sollen, aber wenn er quasi in die "Auszeit" rein läuft klappt es nicht zuverlässig. Vielleicht kann einer von auch mal über den Code schauen und mir sagen wo ich den Deckfehler habe.

Vielen Dank vorab!

Jan

/*
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** SCK - pin 13
 ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN)
 * 
 * Sensor DHT22 an Pin2
 * Sensor DHT11 an Pin8 
 * 
 * Uhr: SCL an A5 und SDA an A4
 * 
 * Diagnose LED an 5 rot, 6 und 7
 * 7 Störung, Rest Laufindikatoren
 * LED wird in der Nacht abgeschaltet
 */

#include <SPI.h>
#include <SD.h>
#include "DHT.h"
#include <Wire.h>
#include "RTClib.h"

RTC_DS3231 rtc;

//Defintion wo und welcher Temperatursensor benutzt wird
DHT dht(2,DHT22);
DHT dht2(8,DHT11);;

const int chipSelect = 4;
//Counter für Anzahl der Durchläufe
int i=0;

//Helligkeitsensor
int lightPin = 0;

void setup() {
  // Open serial communications:
  Serial.begin(9600);
  delay(2000);

    //Sensor starten
  dht.begin();
  Serial.println("Sensor starten");

    //L-LED setup
  pinMode (7, OUTPUT); //Rot Störung
  pinMode (6, OUTPUT); //Gelb
  pinMode (5, OUTPUT); //Grün

  ////SD-Card in Betrieb nehmen/////////////
  Serial.print("Initializing SD card...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    digitalWrite(7,HIGH);
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");

  //Uhr initialisieren
  rtc.begin();
  
  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    digitalWrite(7,HIGH);
    delay(5000);
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }



}

void loop() {
  ///////////////Defintion der Variablen////////////////////////////////////
  delay(2000);
  String dataStringT;
  String dataStringH;
  float t=dht.readTemperature();
  long h=dht.readHumidity();
  float t2=dht2.readTemperature();
  long h2=dht2.readHumidity();
  dataStringT=String(t);
  dataStringH=String(h);
  int helligkeit=analogRead(lightPin);
  DateTime now = rtc.now();
  /////////////////////Datei Log als CSV //////////////////////////////////
  File dataFile = SD.open("datalog.csv", FILE_WRITE);
  //Durchläufe zählen und L-LED schalten
  i++;
  Serial.print("Durchlauf: ");
  Serial.println(i);

  //Uhrzeit bestimmen, LED zwischen 7 und 21Uhr anschalten
  long zeitvb = now.hour();
  bool indikator;
  if(zeitvb>=6&&zeitvb<21){
    Serial.println("Licht an");  
    
    if(i%2==0){
     digitalWrite(5,HIGH);
     digitalWrite(6,LOW);
     indikator=true;
              }     
    else{
     digitalWrite(5,LOW);
     digitalWrite(6,HIGH);
     indikator=true;
      }    
  }
  else{
    digitalWrite(5,LOW);
    digitalWrite(6,LOW);
    Serial.println("Licht aus");
    indikator=false;
    } 

  // if the file is available, write to it:
  if (dataFile) {
    //Uhrzeit auf SD-Karte schreiben
    dataFile.print(now.day());
    dataFile.print(".");
    dataFile.print(now.month());
    dataFile.print(".");
    dataFile.print(now.year());
    dataFile.print(" ");
    dataFile.print(now.hour(), DEC);
    dataFile.print(":");
    dataFile.print(now.minute(), DEC);
    dataFile.print(":");
    dataFile.print(now.second(), DEC);
    dataFile.print(" ; ");

    //Durchlaufsnummer auf SD-Karte schreiben
    dataFile.print("Durchlauf; ");
    dataFile.print(i);
    dataFile.print(" ; ");
    
    //Temperatur und Luftfeuchtigkeit auf SD-Karte schreiben
    dataFile.print("Temperatur DHT22; ");
    dataFile.print(dataStringT);
    dataFile.print(" ; ");
    dataFile.print("Temperatur DHT8; ");
    dataFile.print(String(t2));
    dataFile.print(" ; ");
    dataFile.print("Luftfeuchtigkeit DHT22; ");
    dataFile.print(dataStringH);
    dataFile.print(" ; ");
    dataFile.print("Luftfeuchtigkeit DHT11; ");
    dataFile.print(String(h2));
    dataFile.print(" ; ");
    dataFile.print("Helligkeit; ");
    dataFile.print(helligkeit);
    dataFile.print(" ; ");
    dataFile.println(indikator);
    
    //Datei schließen
    dataFile.close();
    
    // print to the serial port too:
    //Uhrzeit auf Serialport ausgeben
    Serial.print(now.day());
    Serial.print(".");
    Serial.print(now.month());
    Serial.print(".");
    Serial.print(now.year());
    Serial.print(" ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.println(now.second(), DEC);
    
    //Daten auf Serialport ausgeben
    Serial.print("Temperatur DHT22: ");
    Serial.print(dataStringT);
    Serial.println(" °C");
    Serial.print("Luftfeuchtigkeit DHT22: ");
    Serial.print(dataStringH);
    Serial.println(" %");
    //innen
    Serial.print("Temperatur DHT8: ");
    Serial.print(String(t2));
    Serial.println(" °C");
    Serial.print("Luftfeuchtigkeit DHT8: ");
    Serial.print(String(h2));
    Serial.println(" %");
    Serial.print("Helligkeit: ");
    Serial.println(helligkeit);

    //Leerzeile einfügen
    Serial.println("");
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.csv");
    digitalWrite(7,HIGH);
  }
  delay(60000);
  //delay(10000);
}

JK022:
Das aus schalten klappt aber irgendwie nicht so wirklich. Scheinbar ist es so, das es dann klappt wenn der Arduino Strom bekommt wenn die LEDs aus sein sollen, aber wenn er quasi in die "Auszeit" rein läuft klappt es nicht zuverlässig. Vielleicht kann einer von auch mal über den Code schauen und mir sagen wo ich den Deckfehler habe.

Was genau klappt, und was klappt nicht? Ich habe Deine Komponenten (Sensoren und SD-Reader) nicht zur Verfügung, um das selber rauszufinden.
Also ein bisschen genauer musst Du das Problem schon beschreiben.

LG Stefan

Also, Temperaturen, Helligkeit und Luftfeuchte werden geloggt, Uhrzeit wird ermittelt und die Stunde wird auf in die Variable "zeitvb" geschrieben.
Jedoch wird die Schleife: if(zeitvb>=6&&zeitvb<21){... weiterhin soweit ausgeführt das die LEds an bleiben.

Ich hoffe das hilft, was wäre ggf noch sinnvoll zu prüfen ?

Ich weiss auch nicht genau, aber drehe die Abfrage mal versuchsweise so um: if(zeitvb<21 && zeitvb>=6){...

Kann sein, dass der Vergleich nach dem log. AND nicht mehr ausgeführt wird wenn der erste Teil nicht erfüllt ist.
Allerdings ist mir auf die schnelle nicht klar, Warum die LEDs AN sind, die müssten dann eigentlich immer AUS bleiben.

LG Stefan

Kann sein, dass der Vergleich nach dem log. AND nicht mehr ausgeführt wird wenn der erste Teil nicht erfüllt ist.

Damit hast du vollkommen recht.

Ist aber ganz sicher nicht das Problem, da zeitvb eine einfache Variable ist.
Da sind keine (unerwünschten) Seiteneffekte zu erwarten.
Damit ist die Reihenfolge egal.

Es sieht so aus als wenn es so klappen würde.

Vielen Dank euch !!! Ich werde berichten ob es auch mit den Stunden klappt

EDIT: Sehr eigenartig, jetzt stützt der Arduino nach ein paar Durchläufen ab :confused:

JK022:
..., jetzt stützt der Arduino nach ein paar Durchläufen ab :confused:

Das ist unbedingt zu vermeiden. So stabil ist die PCB dann doch nicht, damit man damit was abstützen kann :slight_smile: