Temporizzare rele

Ciao a tutti
Sto cercando di modificare in base alle mie esigenze, (oltre che alle mie capacità) uno sketch del famoso typhoon-reef per acquario, e finora direi che piu o meno sono riuscito.
Dovrei fare in modo di accendere e spegnere un rele per un tot di ore impostabili da menu leggendo l'orario dal ds1307.
Siccome non uso la libreri rtclib, non riesco a capire come fare, ho cercato e provato di tutto ma non ne esco quindi mi rivolgo a voi anche solo per una dritta.

Mi spiego meglio
sono riuscito a collegare una sonda ds18b20 che accende e spegne attraverso questo semplice codice

if (sensors.getTempCByIndex(0) > sogliamax)
      digitalWrite (relay, LOW);
      else  if (sensors.getTempCByIndex(0) < sogliamin)
      digitalWrite (relay, HIGH);

E funziona perfettamente

Questo è il pezzo di menu incriminato (praticamente clonato da quello superiore...)

if (menuCount == 23) {
    //set start time for channel four
    lcd.setCursor(0, 0);
    lcd.print("Set Co2 Start");
    lcd.setCursor(0, 1);
    printMins(co2start, true);
    if (plus.isPressed() && co2start < 1440) {
      co2start++;
      if (co2period > 0) {
        co2period--;
      }
      else {
        co2period = 1439;
      }
      delay(btnCurrDelay(btnCurrIteration - 1));
      bklTime = millis();
    }
    if (minus.isPressed() && co2start > 0) {
      co2start--;
      if (co2period < 1439) {
        co2period++;
      }
      else {
        co2period = 0;
        

        digitalWrite(co2, HIGH);
      }
      
      delay(btnCurrDelay(btnCurrIteration - 1));
      bklTime = millis();

    }
  }

  if (menuCount == 24) {
    //set end time for channel four
    lcd.setCursor(0, 0);
    lcd.print("Set Co2 End");
    lcd.setCursor(0, 1);
    printMins(co2start + co2period, true);
    if (plus.isPressed()) {
      if (co2period < 1439) {
        co2period++;
      }
      else {
        co2period = 0;
      }
      delay(btnCurrDelay(btnCurrIteration - 1));
      bklTime = millis();
    }
    if (minus.isPressed()) {
      if (co2period > 0) {
        co2period--;
      }
      else {
        co2period = 1439;

        digitalWrite(co2, LOW);
        
      }
      delay(btnCurrDelay(btnCurrIteration - 1));
      bklTime = millis();]

Come faccio a dirgli : accenditi a una certa ora e spegniti ad un altra?
Allego il codice completo

Ringrazio per la comprensione e mi scuso per la mia difficoltà di espressione

Saluti
Michele

typhon0.4.1co2.ino (27.7 KB)

E' inutile, non ci riesco...

Mi arrendo, peccato...

stormymonday:
Come faccio a dirgli : accenditi a una certa ora e spegniti ad un altra?

Premetto che NON ho guardato il codice, quindi ti do delle indicazioni generiche di come fare, slegate dallo specifico tuo caso ...

  1. prima di tutto, la cosa migliore, quando si lavora con "ore:minuti:secondi" è trasformare TUTTO in "secondi" così da avere un NUMERO sul quale si possono fare confronti ed operazioni matematiche in modo elementare.
    Quindi ... data una qualisasi ORA:MINUTI:SECONDI ---> (ORA * 3600) + (MINUTI *60) + SECONDI ti da un numero compreso tra 0 e 86399 (quindi devi usare un long e NON un int).

  2. Memorizzerai la tua ora accensione e la tua ora spegnimento in due variabili long nel formato suddetto

  3. Leggerai l'ora attuale dal DS1307 e trasformerai anche essa in secondi

  4. se ( (ora attuale >= ora inizio) e (ora attuale <= ora fine) ) allora accendi, altrimenti spegni

Nota che tutto questo vale se restiamo nelle 24 ore (ovvero se non siamo, con gli orari, a cavallo tra due giorni) perché, altrimenti, la cosa si fa ugualmente, ma le operazioni sono un po' più complesse :wink:

Guglielmo

gpb01:
Premetto che NON ho guardato il codice, quindi ti do delle indicazioni generiche di come fare, slegate dallo specifico tuo caso ...

Ti ringrazio molto, perlomeno ora ho un punto di partenza sul quale concentrarmi...