Warum funktioniert die If- Abfrage in dem Programm nicht

hi

Wie schon gesagt frage ich mich warum in meinen Programm unten die If-Abfrage nicht funktioniert entweder er schaltet die Ausgänge durch gehend ein oder Aus. Das Programm soll ein Aquarium mit Relais einschalten bei gewissen Uhrzeiten.

#include <TimeLib.h>

//Time

//Anschlüsse
#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>
#include <SevSeg.h>
SevSeg sevseg;
tmElements_t tm;
#define Phase 50
#define Neutral 51
const char *monthName[12] = {
 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

void setup() {
byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
setSyncProvider(RTC.get);
  // configure relais PinMode
pinMode (Phase, OUTPUT);  
pinMode (Neutral, OUTPUT);
digitalWrite (Phase, LOW);
digitalWrite (Neutral, LOW);
  bool parse=false;
 bool config=false;
  if (getDate(__DATE__) && getTime(__TIME__)) {
   parse = true;
   // and configure the RTC with this info
   if (RTC.write(tm)) {
     config = true;
   }
  }   
 Serial.begin(9600);
 while (!Serial) ; // wait for Arduino Serial Monitor
 delay(200);
 if (parse && config) {
   Serial.print("DS1307 configured Time=");
   Serial.print(__TIME__);
   Serial.print(", Date=");
   Serial.println(__DATE__);
 } else if (parse) {
   Serial.println("DS1307 Communication Error :-{");
   Serial.println("Please check your circuitry");
 } else {
   Serial.print("Could not parse info from the compiler, Time=\"");
   Serial.print(__TIME__);
   Serial.print("\", Date=\"");
   Serial.print(__DATE__);
   Serial.println("\"");
 }
}

bool getTime(const char *str)
{
 int Hour, Min, Sec;

 if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
 tm.Hour = Hour;
 tm.Minute = Min;
 tm.Second = Sec;
 return true;
}

bool getDate(const char *str)
{
 char Month[12];
 int Day, Year;
 uint8_t monthIndex;

 if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
 for (monthIndex = 0; monthIndex < 12; monthIndex++) {
   if (strcmp(Month, monthName[monthIndex]) == 0) break;
 }
 if (monthIndex >= 12) return false;
 tm.Day = Day;
 tm.Month = monthIndex + 1;
 tm.Year = CalendarYrToTm(Year);
 return true;
}

void loop() {
 //setTime(5,35,34,5,8,2019);
 time_t t = now();
 tm.Hour = hour();
 if (tm.Hour <= 6 && tm.Hour >= 12 && tm.Hour <= 15 && tm.Hour >= 19){
   digitalWrite (Phase, HIGH);
  digitalWrite (Neutral, HIGH);
 } else {
     digitalWrite (Phase, LOW);
     digitalWrite (Neutral, LOW);    
           }  
 sevseg.setNumber(tm.Hour);
 sevseg.refreshDisplay();
 sevseg.setBrightness(50);
}

ohne den Sketch zu analysieren:
Rechne die Zeit in Minuten oder Sekunden um und mach mit diesen die Kontrolle.

ZB 10:30 sind 630 Minuten.

Wie kann
tm.Hour <= 6 && tm.Hour >= 12 && tm.Hour <= 15 && tm.Hour >= 19

Die Variable gleichzeitig kleiner 6 UND größer 12 bzw kleiner als 15 UND größer als 19 sein?

Grüße Uwe

Auch wenn ich es mit
tm.Hour == 6, 7, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19
mache.
oder tm.Hour >= 6 && tm.Hour <= 12 && tm.Hour >= 15 && tm.Hour <= 19

Schaltet er den ausgang durch gehend durch.

tm.Hour == 6, 7, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19

Ist keine gültige Kontrollstruktur.

Zeige bitte genau den Code.

Grüße Uwe

void loop() {
//setTime(5,35,34,5,8,2019);
time_t t = now();
tm.Hour = hour();
if (tm.Hour == 7, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19){
digitalWrite (Phase, HIGH);
digitalWrite (Neutral, HIGH);
} else {
digitalWrite (Phase, LOW);
digitalWrite (Neutral, LOW);
}

}

Uwe hatte dir doch schon gechrieben, so geht das nicht.

Deine if-Abfrage musst du genauer aufbauen und jeden Bereich einzeln abfragen.

  if (tm.Hour == 7, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19){

So funktioniert das nicht in C Du mußt OR benutzten:

if (tm.Hour == 7 || tm.Hour ==8 || ...){

Wenn etwas zwischen 7 und 12 bzw 15 und 19 h passieren soll:

 if (tm.Hour > 6 && tm.Hour < 12 || tm.Hour > 15 && tm.Hour < 19){

Gegebenenfalls muß man die genaue Grenzen kontrollieren.

Grüße Uwe

Hallo,

Du hast die logische Verknüpfung nicht verstanden die Du brauchst, oder ?

Vorschlag , schreib doch einfach mal auf wann ein und wann aus sein soll

Heinz

Uwe war schneller.

ich vermute mal zwische 6:00 und 12:00 oder 15:und 19:: soll ein sein ?

Danke Uwe jetzt funktionierts wie es soll.

Dann solltest Du dich ein wenig in logische Verknüpfungen einlesen.
Dann geht es das nächste mal sofort.
Grüße Uwe

(deleted)

Hi

Da die verwendeten Relais nicht näher genannt wurden, eine Warnung:
Nicht Alles, wo '230VAC' drauf steht, wird auch so verbaut, daß man Das gefahrlos so benutzen kann.
Beim üblichen 'Arduino-Relais-Bord' gibt's Welche MIT Ausfräsung der Platine (vergrößern der Kriechstrecke) - und eben auch Ohne.
Ohne ist der Abstand zwischen den Last-Kontakten des Relais, wo die 230V anliegen, zu den Spulenanschlüssen, wo Deine Elektronik dran hängt, NICHT AUSREICHEND, womit ein Betrieb mit 230V (also ALLES oberhalb Kleinspannung) mindestens grob fahrlässig ist.
Wenn etwas passiert, bekommst Du zumindest ein mietfreies Zimmer ...

Auch ist 'Spielen an 230V' für den Laien einfach nicht erlaubt - wenn etwas passiert -> ab auf Dein (neues) Zimmer.
Für Den, mit Dem 'was passiert' ist, kann Das tödlich enden!!

MfG