Temporizzatore rtc

Sono giorni che incappo sempre nello stesso problema, ho bisogno di accendere un led ad un determinato orario per poi spegnerlo ad un altro.
Ho provato con ogni variabile e miriadi di if, non ne sono comunque venuto a capo, se interrompo l’alimentazione dopo il led non si riaccende, nemmeno se dichiate che: se l’orario è maggiore dell’ ora di inizio e minore dell’ora di fine. Il problema più grande è la mezzanotte.

Ora pensavo, È possibile impostare un ora di inizio, esempio 19.00, e non impostare un ora di fine ma contare tot tempo da quel punto per cui il led deve restare acceso?

Esempio, imposto l’ora di inizio alle 19.00 e voglio il led acceso per 7 ore, perciò dovrebbe spegnersi alle 2.00, tutto ció dovrebbe funzionare anche al riavvio da interruzione di elettricità, credete sia una buona idea o mi vado a complicare le cose?

Potreste indicarmi qualche sketch anche da riadattare se possibile con la libreria rtclib?

E se dichiarassi che deve spegnersi nel tempo compreso tra le 2 e le 19 e acceso se l’ora è uguale alla mezzanotte? Potrebbe funzionare?

Ciao
Prima di risponderti, vai a presentarti QUI

Poi siamo più che contenti di darti una mano, ma inserisci anche uno scketch che stai usando

se fai if (orario > 19 and orario < 2) penso dovrebbe funzionare :slight_smile:

Che tipo di RTC hai ? Che libreria stai utilizzando ?

Perché il problema è piuttosto semplice quindi ... c'è qualche cosa che non va in quello che stai utilizzando ... ::slight_smile:

Guglielmo

Questo è il codice

#include <Wire.h>
#include <Time.h>
#incude <RTClib.h>

RTC_DS3132 RTC;

int led = 8;  //definisco pin led

byte startHour = 19;    // Set our start and end times

byte endHour = 2;      // Use 24h format for the hour, without leading zero



void setup () {
 pinMode(led, OUTPUT);   // Set our LED as an output pin
 digitalWrite(ledPin, LOW); // imposta led normalmente spento
 // avvio wire e rtc
 Wire.begin();              /
 RTC.begin();
 
 if (! RTC.isrunning()) {                       // Make sure RTC is running
   Serial.println("RTC is NOT running!");
   //RTC.adjust(DateTime(__DATE__, __TIME__));  // Uncomment to set the date and time
 }
}
void digitalClockDisplay(){
 // digital clock display of the time
 Serial.print(hour());
 
}
void loop () {
 
 DateTime now = RTC.now(); // Read in what our current datestamp is from RTC
 


byte checkStartTime() {
 DateTime now = RTC.now();  // Read in what our current datestamp is from RTC
 
 if (now.hour() >= startHour && now.hour() >= endHour) {
    digitalWrite (led, HIGH);
 } else {
   digitalWrite(luce,LOW);
 }

L’rtc È il ds3231

So che il codice presenta errori perché l’ho riscritto al volo, è la funzione if che non so come scrivere per fa in modo che si accenda il led alle 21 e spenga alle 2 senza interrompersi alle ore 0 e essere funzionante anche al riavvio in caso di interruzione elettrica

>Sfludo: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post #5 (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Grazie,

Guglielmo

Rileggi l'IF e prova a "simularlo" nella tua testa ... verdai che capisci perché così è difficile che vada ... ::slight_smile:

E comunque, visto che l'orario è a cavallo della mezzanotte ... occorre ragionare in altro modo ...
... tracciati una riga, disegna l'intervallo di interesse e scopri le condizioni di OFF e di ON. :wink:

Guglielmo

Premetto che con l'RTC non ho molta esperienza, ma non credo sia necessario leggere continuamente l'orario dall'RTC tramite "DateTime now = RTC.now(); // Read in what ---".

Una volta inizializzata nel "void setup()" la libreria "Time.h" con "setSyncProvider(RTC.get);", sarà poi la stessa a tenere il cosidetto "orologio" attivo.

Poi con i comandi della libreria dovresti intercettare l'orario di accensione e poi quello di spegnimento.

Una libreria che potresti utilizzare è "<TimeAlarms.h>", ma non credo sia necessario per le tue esigenze

Scusate ho corretto il post #5, sono a casa e posso postare il mio codice:

//includo le librerie


#include <LiquidCrystal.h>
#include <Wire.h>
#include <RTClib.h>

//definisco modello rtc

RTC_DS3231 RTC;


//Definisco pin lcd

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int accensione = 19;
const int spegnimento = 2;

#define luce 9

void setup() {
  
  delay(3000); // wait for console opening

  if (! RTC.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
 
 
  if (! RTC.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (RTC.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    
    RTC.adjust(DateTime());
    // Mese, Giorno, Anno, Ora, Minuti, Secondi
    // rtc.adjust(DateTime(2014, 2, 1, 22, 59, 0));
  }
 
 // setto il numero di righe e colonne lcd:
 
  lcd.begin(20, 4);
  
  

  pinMode(luce, OUTPUT);
 
  
}

void loop() {
  
    DateTime now = RTC.now();
   

    
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();


 delay(2000);
  
  unsigned long currentMillis = millis();
  //elapsedTime = now();
     /////////////////////// LCD info //////////////////////////////////////////////////X
//////////////////////////////////////////////////////////////////////////////////////X

  lcd.clear();
 
   lcd.setCursor(0,3);
    lcd.print(now.hour());
    lcd.setCursor(3,3);
    lcd.print(now.minute());
    lcd.setCursor(2,3);
    lcd.print(':');
    lcd.setCursor(10,3);
    lcd.print(now.day());
    lcd.setCursor(13,3);
    lcd.print(now.month());
    lcd.setCursor(15,3);
    lcd.print('/');
    lcd.setCursor(12,3);
    lcd.print('/');
    lcd.setCursor(16,3);
    lcd.print(now.year()); 



  
}

ora immaginiamo la linea temporale:

00:00-------19:00------00:00------02:00------19:00 e torniamo a mezzanotte,

sarebbe sensato dichiarare soltanto che la luce si trova sempre in stato di on e andra a spegnersi solo nell'intervallo tra le 02:00 e le 19:00?

per intenderci così:

if (now.hour() < accensione && now.hour() >=spegnimento){
   digitalWrite(luce, LOW);
  }
  else{
    digitalWrite(luce,HIGH);
    }

credo di aver risolto così:
dichiaro che la luce va in HIGH se l'ora è uguale o superiore alle 19, percio si accende fino alle 23:59 in automatico
dichiaro che la luce va in HIGH se sono le ore 0
e resta accesa fino al comando luce LOW alle ore 2 e si ripete il ciclo

  if( now.hour() >= 19 ){  
        digitalWrite(luce, HIGH);
    delay (1000);
      }
 if( now.hour() >= 0 ){  
        digitalWrite(luce, HIGH);
    delay (1000);
      }
      if( now.hour() == 2 ){  
        digitalWrite(luce, LOW);
    delay (1000);
      }

credo che per non andare dovrebbe mancare energia dalle ore 1:59 alle ore 3:00 giusto?

Difatti il metodo più semplice è verificare se si è tra l'intervallo 19:00 .. 23:59 o tra l'intervallo 00:00 .. 01:59 se una condizione è verificata o è verificata l'altra ... allora sei tra le 19:00 e le 01:59.

Se manca la luce non succede nulla ... gli RTC hanno una battareia apposta per farli camminare anche in caso di mancanza di rete per cui, quando riparti e leggi l'RTC sai esattamente dove sei e ti comporti di conseguenza.

Guglielmo

credo di aver capito

 if(   now.hour() >= 19  ){  
        digitalWrite(luce, LOW);
    delay (1000);
      }
     
       if(   now.hour() <= 0 ){  
        digitalWrite(luce, LOW);
    delay (1000);
      }
       if( now.hour() >= 2 && now.hour() < 19){  
        digitalWrite(luce, HIGH);
    delay (1000);
      }

Mah ... secondo me basta così : se ora >= 19 (e quindi dalle 19 in poi fino a mezzanotte) OPPURE se ora <= 2 (e quindi dalla mezzanotte fino alle 2) allora accendi. Questo significa che. se l'orario è oltre le 2 ma inferiore alle 19, entrambe le condizioni sono false e quini spegni.

Quindi:

if ( (now.hour() >= 19) || (now.hour() <= 2) ) {
   digitalWrite(luce, HIGH);
}
else {
   digitalWrite(luce, LOW);
}

Prova e vedi se va ...

Guglielmo