relais laten aangaan tussen bepaalde uren

Hallo,

Ik wil graag tussen bepaalde uren relais laten hoog gaan. Maar hoe doe ik dit exact? Ik gebruik een DS3231 en de library daarvoor

Hier is de code die ik nu heb. Klopt het dat de relais alleen hoog gaan als het exact dat 5:00u is? Hoe kan ik dit aanpassen zodat het tot 20u gaat en dan naar een andere if gaat?
( if(tijd.hour == Ja_uur_verwarming_licht && tijd.min == Ja_minuten_verwarming_licht){ )

#include <DS3231.h>
#include <dht.h>
#include <Stepper.h>

#define DHT11_PIN 7

const int relais_warmte = 6; 

const int stappen_per_draai = 285; // 1000 stappen = 3,5 toeren -> 1 toer = 285 stappen

const int Ja_uur_verwarming_licht = 5 ;
const int Ja_minuten_verwarming_licht = 00;

const int Nee_uur_verwarming_licht = 20 ;
const int Nee_minuten_verwarming_licht = 00 ;


Stepper myStepper(stappen_per_draai, 8, 9, 10, 11);
dht DHT;
DS3231  rtc(SDA, SCL);
Time tijd;

void setup() {

  Serial.begin(9600);

  myStepper.setSpeed(30); 
  pinMode(relais_warmte, OUTPUT);


  rtc.begin(); // initialisatie RTC object
  rtc.setDOW(TUESDAY);     // Dag van de week
  rtc.setTime(15, 21, 20);     // Het uur (uur, minuten, seconden)
  rtc.setDate(2, 12, 2020);   // De dag van het jaar
  
}

void loop() {
  
  tijd = rtc.getTime();
  Serial.print(tijd.hour);
  Serial.print(" uur, ");
  Serial.print(tijd.min);
  Serial.print(" minuten");
  Serial.println(" ");
  
  delay (1000);
  
  if(tijd.hour == Ja_uur_verwarming_licht && tijd.min == Ja_minuten_verwarming_licht){ // is het tussen 5:00 en 20:00? JA

    float VerwarmingLaagsteTemp = 18.7;
    float VerwarmingHoogsteTemp = 19.3;
    float RaamLaagsteTemp = 25.7;
    float RaamHoogsteTemp = 26.3;

    int chk = DHT.read11(DHT11_PIN); //Er wordt gelezen vanuit de sensor welke temperatuur het is
    Serial.print("Temperatuur = "); // Temperatuur = x
    Serial.println(DHT.temperature); 
    delay(1000); //Wacht 1 second
  
    if (chk < VerwarmingLaagsteTemp) {

      digitalWrite(relais_warmte, HIGH);
      
    }

    if (chk > VerwarmingHoogsteTemp) {

      digitalWrite(relais_warmte, LOW);
    }

    if (chk > RaamHoogsteTemp) {

      myStepper.step(stappen_per_draai);
    }

    if (chk < RaamLaagsteTemp) {

      myStepper.step(-stappen_per_draai);
    }
  }

Mvg

Kun je een link geven naar waar je jouw DS3231 module hebt gekocht ? En een link naar de library die je gebruikt ?
Er zijn DS3231 modules die bij 5V de oplaadbare batterij stuk maken.

Er is een DS3231 library die past bij de TimeLib: Time Library, Timekeeping and Time/Date Manipulation on Teensy.
Als dat zou werken, dan kun je de TimeAlarms library gebruiken: TimeAlarms Library, Run Functions At Specific Times.

Je kunt ook je sketch werkend maken. Dan is het beste om een variabele toe te voegen die aangeeft als de warmte aan is.
Bijvoorbeeld: bool warmteActief ;

Het is anders niet mogelijk om het netjes te doen.
Als je kijkt naar uren en minuten, dan duurt dat een hele minuut. Die code wordt dan in die minuut heel vaak uitgevoerd.
Als je kijkt naar uren, minuten en seconden, dan duurt dat een hele seconde. Dan kan de code heel vaak worden uitgevoerd, of helemaal niet als die ene seconde gemist wordt door een delay.

Ik heb graag de term "pin" in een variabele-naam als dat een pin is.
Je hebt nu: const int relais_warmte = 6 ;
Wat dacht je van: const int warmtePin = 6 ;

Dan wordt het zo iets:

void loop()
{
  if( warmteActief)
  {
    // De warmte is actief op dit moment.
    // Vraag de temperatuur op en regel de temperatuur.
    ...


    // De warmte is op dit moment aan, kijk of het tijd is om uit te zetten.
    if( tijd.hour == 20)
    {
      warmteActief = false;

      // zet de warmte uit, om er zeker van te zijn dat het uit is.
      digitalWrite( warmtePin, LOW);
    }
    
  }
  else
  {
    // De warmte is op dit moment uit, kijk of het tijd is om aan te zetten.
    if( tijd.hour == 5)
    {
      warmteActief = true;
    }
  }
}

Dan in ieder geval if( tijd.hour < 20) en if( tijd.hour >= 5

De tijd kan je heel makkelijk in je code stoppen.

//***************************************************************
Define detection check interval 
3600 seconds is 1 hour
43200 seconds is 12 hours
86400 seconds is 24 hours
int check_interval = 3600 ;
int hour = 19;
int minute = 56;
//****************************************************************

// string to store time data
char buffer[60];

// timeframe setup
const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 3600;
const int   daylightOffset_sec = 3600;

void setup() {
  // let Serial display start
  Serial.begin(115200);
    delay(1000);   // delay to wait for serial connection 
  // if omitted the first lines on the Serial Monitor won't be visible
  Serial.println("");
  Serial.println("Startup sequence visualised");
  Serial.println("");

  // Init and get the time. Works like magic
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  setenv("TZ","CET-1CEST-2,M3.5.0,M10.5.0/3,1",1);
  
  // Connect to Wi-Fi
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP Address : ");
  Serial.print(WiFi.localIP());
  Serial.println("");

  // check if current time is fetched from NTP server
  // year in 'C' language is calculated since 1900
  // Epoch time is calculated since 01/01/1970 00:00:00
  // information at https://www.cplusplus.com/reference/ctime/tm/
  // if no time is obtained from NTP server then time will be set at 01/01/1970 00:00:00
  time_t now = time(nullptr);
  struct tm * timeinfo;
  //time (&now);
  timeinfo = localtime(&now);
  sprintf(buffer, "Device startup time : %02d/%02d/%04d %02d:%02d", timeinfo->tm_mday, timeinfo->tm_mon, timeinfo->tm_year+1900, timeinfo->tm_hour, timeinfo->tm_min);
  Serial.println(buffer);
  //printf ("Current local time and date: %s\n", asctime(timeinfo));
  
  if(timeinfo->tm_year == 70){     // == number of years since 1900, 70 means no time obtained from NTP server
    Serial.println("Restart..");
    delay(6000);
    ESP.restart();
  }
  
  // delay not needed at all, just for the view on the monitor
  delay(6000);
  
  //disconnect WiFi as it's no longer needed
  Serial.println("Disconnecting WiFi");
  Serial.println("");
  delay(1000);
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
  Serial.println("WiFi disconnected");
  Serial.println("");
  
  delay(1000);
}