Go Down

Topic: RTC DS3231 impostare allarmi (Read 2345 times) previous topic - next topic

ziopippo

Quel parametro mi era sfuggito, grazie!
Devo però studiarmela attentamente e con la mente più lucida perchè in questo momento sono fuso  :smiley-confuse:

Della parte hardware cosa ne pensi? :)

zoomx

Intervengo un po' tardi ma.... il fatto che il DS3231 gestisce solo 2 allarmi non è mica un problema.
Ti fai una lista degli orari e imposti il primo elemento come allarme.
Quando scatta l'allarme esegui ciò che devi fare, quindi prendi il secondo elemento e lo imposti come allarme.
E così via.

ziopippo

#17
May 13, 2018, 12:29 am Last Edit: May 13, 2018, 12:29 am by ziopippo
ho dato un'occhiata al readme.txt della libreria degli allarmi e ho trovato questo:

Alarm.timerOnce(Hour, Minute, Second, TimerFunction);
  Description:  As timerOnce above, but period is the number of seconds in the given Hour, Minute and Second parameters

quindi puoi impostare l'allarme all'orario che vuoi come gia facevi e impostare la durata per l'intervento con la timerOnce che accetta ore, minuti e secondi
quindi seguendo l'esempio
Code: [Select]

#include <Time.h>
#include <TimeAlarms.h>

void setup()
{
  Serial.begin(9600);
  setTime(8,29,0,1,1,11); // set time to Saturday 8:29:00am Jan 1 2011
  // create the alarms
  Alarm.alarmRepeat(8,30,0, MorningAlarm);  // 8:30am every day
  Alarm.alarmRepeat(17,45,0,EveningAlarm);  // 5:45pm every day
  
//
// nel caso di mancanza corrente
// qui ci va il controllo se siamo in un orario successivo al previsto per l'allarme
//per l'attivazione/disattivazione dei relè
// qualche cosa tipo
// if (oraAdesso > oraPrimoAllarme && oraAdesso < oraFineAllarme)
//    attiva/disattiva relè;


}
void  loop(){  
  digitalClockDisplay();    //fai quello che serve
  Alarm.delay(1000);     // wait one second between clock display
}

// functions to be called when an alarm triggers:
void MorningAlarm(){
  Serial.println("Alarm: - accendi relè 1");
// esegui le varie istruzioni
Alarm.timerOnce(Hour, Minute, Second, EndFunction); // tra quanto tempo in ore, minuti, secondi intervenire
}

void EndFunction() {
   serial.println("Spengo relè 1");
// esegui le varie istruzioni

}


Grazie mille per avermi illuminato! Lo sketch inizia a prendere la strada giusta. Peccato però  che se va via la corrente non considera l'allarme. Faccio un esempio allegando il codice aggiornato secondo le tue indcazioni:

Code: [Select]

/*
   Esempio per accensione ed spegnimento relè temporizzati
*/
#include <TimeLib.h>
#include <TimeAlarms.h>
#include <LiquidCrystal_I2C.h>
#include <DS3232RTC.h>
#include <Wire.h>

AlarmId id;

// lcd object
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

//================================= DEFINISCO LE VARIABILI DEI RELE' ====================================
const int releCO2 = 8;       //relè CO2             R1 NC
const int relePlafo = 9;    //relè Plafoniera       R4 NA
const int releTermo = 10;   //relè Temoriscaldatore R3 NA
const int releAereatore = 12; //relè Aereatore      R2 NA


#define RelayOn LOW
#define RelayOff HIGH


void setup() {
  Serial.begin(57600);
  while (!Serial) ; // wait for Arduino Serial Monitor


  setSyncProvider(RTC.get);  // the function to get the time from the RTC
  if (timeStatus() != timeSet)
    Serial.println("Unable to sync with the RTC");
  else
    Serial.println("RTC has set the system time");

  //setTime(01, 59, 30, 3, 24, 18); // set time to Saturday 8:29:00am Jan 1 2011

  lcd.init();
  lcd.clear();
  lcd.backlight();

  digitalWrite(releCO2 , RelayOff);
  pinMode(releCO2 , OUTPUT);
  digitalWrite(releAereatore , RelayOff);
  pinMode(releAereatore , OUTPUT);
  digitalWrite(releTermo , RelayOff);
  pinMode(releTermo , OUTPUT);
  digitalWrite(relePlafo , RelayOff);
  pinMode(relePlafo , OUTPUT);

  // create the alarms, to trigger at specific times
  Alarm.alarmRepeat(23, 1, 0, CO2); // 18:430 every day
  Alarm.alarmRepeat(23, 3, 30, Plafo); // 21:43:00 every day

  digitalClockDisplay();
}

void loop() {
  printTime();
  Alarm.delay(0); // wait one second between clock display
  //CO2();
}

// functions to be called when an alarm triggers:
void CO2() {
  Serial.println("Alarm: accendo CO2");
  lcd.setCursor(0, 0);
  lcd.print("CO2:ON AIR:OFF");
  digitalWrite(releCO2 , RelayOn); // Accendo CO2
  digitalWrite(releAereatore , RelayOff); // Spengo Aereatore
  Alarm.timerOnce(1, 0, 00, EndCO2); // tra quanto tempo in ore, minuti, secondi intervenire
}

void EndCO2() {
  Serial.println("Spengo CO2");
  lcd.setCursor(0, 0);
  lcd.print("CO2:OFF AIR:OFF");
  digitalWrite(releCO2 , RelayOff); // Spengo CO2
  digitalWrite(releAereatore , RelayOn); //Accendo Aereatore
}


void Plafo() {
  lcd.setCursor(0, 0);
  lcd.print("PLAFO:ON                 ");
  Serial.println("Alarm: Accendo LUCI");
  digitalWrite(relePlafo , RelayOn); // Accendo luci
  Alarm.timerOnce(3, 0, 0, EndPlafo); // tra quanto tempo in ore, minuti, secondi intervenire
}

void EndPlafo() {
  Serial.println("Spengo LUCI");
  lcd.setCursor(0, 0);
  lcd.print("PLAFO:OFF                 ");
  digitalWrite(relePlafo , RelayOff); //Spengo luci
  // esegui le varie istruzioni
}

void p2dig(uint8_t v)
// Print 2 digits with leading zero
{
  if (v < 10) lcd.print("0");
  lcd.print(v);
}

void printDigits(int digits) {
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

const char *dow2String(uint8_t code)
// Day of week to string. DOW 1=Sunday, 0 is undefined
{
  static const char *str[] = {"---", "Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"};

  if (code > 7) code = 0;
  return (str[code]);
}

void printTime(void)
// Display the current time on the display
{
  // display the current time
  lcd.setCursor(0, 1);
  p2dig (hour());
  lcd.print(":");
  p2dig(minute());
  lcd.print(":");
  p2dig(second());
}

void digitalClockDisplay() {
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(' ');
  Serial.print(day());
  Serial.print('/');
  Serial.print(month());
  Serial.print('/');
  Serial.print(year());
  Serial.println();
  Alarm.delay(1000); // wait one second between clock display
}





Secondo questo esempio se carico lo sketch alle ore 23:02:00 il codice non mi tiene conto dell'allarme CO2 impostato alle ore 23:01:00, considerando invece correttamente quello Plafo delle 23:3:30.

Inoltre mi assale anche un altro dubbio. La libreria da me usata gestisce automaticamente il passaggio all'ora solare/legale? Considera automaticamente anche gli anni bisestili?
Grazie.


Patrick_M

Quote
Secondo questo esempio se carico lo sketch alle ore 23:02:00 il codice non mi tiene conto dell'allarme CO2 impostato alle ore 23:01:00, considerando invece correttamente quello Plafo delle 23:3:30.
infatti non hai tenuto conto di quanto commentato nel setup
Code: [Select]

void setup() {
   ...
   ...
   // nel caso di mancanza corrente
   // qui ci va il controllo se siamo in un orario successivo al previsto per l'allarme
   //per l'attivazione/disattivazione dei relè
   // qualche cosa tipo
   // if (oraAdesso > oraPrimoAllarme && oraAdesso < oraFineAllarme)
   //    attiva/disattiva relè;
   ...
}

Quote
Inoltre mi assale anche un altro dubbio. La libreria da me usata gestisce automaticamente il passaggio all'ora solare/legale? Considera automaticamente anche gli anni bisestili?
non lo so, non ho controllato... ma non mi pare
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

ziopippo

infatti non hai tenuto conto di quanto commentato nel setup
Code: [Select]

void setup() {
   ...
   ...
   // nel caso di mancanza corrente
   // qui ci va il controllo se siamo in un orario successivo al previsto per l'allarme
   //per l'attivazione/disattivazione dei relè
   // qualche cosa tipo
   // if (oraAdesso > oraPrimoAllarme && oraAdesso < oraFineAllarme)
   //    attiva/disattiva relè;
   ...
}

non lo so, non ho controllato... ma non mi pare
Hai ragione scusa.
Alla tarda ora che l'ho testato ieri sera, preso dal l'euforia che funzionava non ho proprio letto la prima parte!
Chiedo venia.
Per gli anni bisestili ho letto che li gestisce automaticamente ma sarei curioso di verificarlo.

zoomx

Inoltre mi assale anche un altro dubbio. La libreria da me usata gestisce automaticamente il passaggio all'ora solare/legale? Considera automaticamente anche gli anni bisestili?
L'RTC gestisce i bisestili, che sono comuni a tutti ma non i passaggi ora estiva ora invernale che invece dipendono da cosa si decide a livello di stato, poiche molti stati non seguono il fuso che gli competerebbe ma non è il caso dell'Italia.
Per quello c'è la libreria TimeZone, se la usi ti dico subito che devi cambiare l'include time.h in TimeLib.h a causa di un conflitto di nomi.
Se la usi, va configurata usando le seguenti istruzioni
Code: [Select]
//Central European Time (Frankfurt, Paris, Rome)
TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120};     //Central European Summer Time
TimeChangeRule CET = {"CET ", Last, Sun, Oct, 3, 60};       //Central European Standard Time
Timezone myTZ(CEST, CET);
TimeChangeRule *tcr;        //pointer to the time change rule, use to get TZ abbrev
time_t utc, local;

ziopippo

L'RTC gestisce i bisestili, che sono comuni a tutti ma non i passaggi ora estiva ora invernale che invece dipendono da cosa si decide a livello di stato, poiche molti stati non seguono il fuso che gli competerebbe ma non è il caso dell'Italia.
Per quello c'è la libreria TimeZone, se la usi ti dico subito che devi cambiare l'include time.h in TimeLib.h a causa di un conflitto di nomi.
Se la usi, va configurata usando le seguenti istruzioni
Code: [Select]
//Central European Time (Frankfurt, Paris, Rome)
TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120};     //Central European Summer Time
TimeChangeRule CET = {"CET ", Last, Sun, Oct, 3, 60};       //Central European Standard Time
Timezone myTZ(CEST, CET);
TimeChangeRule *tcr;        //pointer to the time change rule, use to get TZ abbrev
time_t utc, local;


Bene, allora vorrei chiederti un consiglio.
Come già accennato, il progetto prevede oltre che ad un ovvio LCD anche un encoder rotativo (per risparmiare spazio) per gestire gli allarmi ed altro. Non avendo volutamente previsto una connessione ad internet per l'autoaggiornamento della data via NTP, secondo te, ha senso cambiare libreria in modo che gestica il passaggio dell'ora legale o conviene farlo fare manualmete dall'utente? Considera che vorrei prevedere anche una funzione per correggere eventuali errori nell'orario; A proposito di ciò devo ancora riuscire a capire bene come posso sfruttare la libreria che sto usando (LCDMenuLib.h di Nils Feldkämper) in modo da poter usare l'encoder per settare orario ed allarmi. Tale libreria l'ho usata già per un altro progetto ma utilizzando dei pulsanti ed è stato piuttosto smplice aggiustare il codice secondo le mie esigenze ma, con l'encoder, devo ancora trovare la soluzione giusta.

zoomx

Io l'ho fatto perché ad ogni passaggio tra orari devo mettere a punto un po' di orologi in giro per cui non ne volevo aggiungere altri.
Aggiungere la connessione consuma sicuramente piedini, se usi la scheda Ethernet sono quelli della SPI.

ziopippo

Io invece ho voluto scartare l'ipotesi di internet perchè non essendo per me ma per un amico, se disgraziatamente dovesse cambiare router (come ha già più volte fatto) sarei costretto a tornare da lui ogni volta a riprogrmmare le credenziali di accesso al WiFi; So benissimo che ci sono librerie che prevedono la selezione del SSID ma poi resterebe il problema dell'inserimento della password.
Domanda: Se decidessi di mettere la libreria che mi hai segnalato, è sufficiente inserire/modificare qulle quattro righe di codice che mi hai postato?

zoomx

Si, se non ricordo male quelle sono le uniche righe che ti personalizzano la libreria.

ziopippo

#25
May 15, 2018, 08:14 pm Last Edit: May 15, 2018, 08:14 pm by ziopippo
Dopo varie capocciate sul muro per cercare di capire come dichiarare le varie variabili finalmente sono riuscito ad ottenere ciò che volevo.
Ora mi chiedo se esiste un metodo più snello ed elegante per avere lo stesso risultato.

Code: [Select]
/*
   Esempio per accensione ed spegnimento relè temporizzati
*/
#include <TimeLib.h>
#include <TimeAlarms.h>
#include <LiquidCrystal_I2C.h>
#include <DS3232RTC.h>
#include <Wire.h>

AlarmId id;

// lcd object
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

//================================= DEFINISCO LE VARIABILI DEI RELE' ====================================
const int releCO2 = 8;       //relè CO2             R1 NC
const int relePlafo = 9;    //relè Plafoniera       R4 NA
const int releTermo = 10;   //relè Temoriscaldatore R3 NA
const int releAereatore = 12; //relè Aereatore      R2 NA


#define RelayOn  HIGH
#define RelayOff LOW

#define RelayAirOn  LOW
#define RelayAirOff HIGH

#define RelayTermoOn  LOW
#define RelayTermoOff HIGH

#define RelayPlafoOn  LOW
#define RelayPlafoOff HIGH

//unsigned long CO2Timer[4]; // array per ore, minuti, secondi, durata
unsigned long AirTimer[4]; // array per ore, minuti, secondi, durata
//unsigned longPlafoTimer[4]; // array per ore, minuti, secondi, durata

unsigned long CO2Timer [4] = {10, 3, 0, 10}; // imposto timer alle 08:14:00 per la durata di 4 ore
unsigned long PlafoTimer [4] = {10, 11, 40, 10}; // imposto timer Plafo alle 11:14:30 per la durata di 30 ore


void setup() {
  Serial.begin(57600);
  while (!Serial) ; // wait for Arduino Serial Monitor


  setSyncProvider(RTC.get);  // the function to get the time from the RTC
  if (timeStatus() != timeSet)
    Serial.println("Unable to sync with the RTC");
  else
    Serial.println("RTC has set the system time");

  //setTime(01, 59, 30, 3, 24, 18); // set time to Saturday 8:29:00am Jan 1 2011

  lcd.init();
  lcd.clear();
  lcd.backlight();

  digitalWrite(releCO2 , RelayOn);
  pinMode(releCO2 , OUTPUT);
  digitalWrite(releAereatore , RelayAirOff);
  pinMode(releAereatore , OUTPUT);
  digitalWrite(releTermo , RelayTermoOn);
  pinMode(releTermo , OUTPUT);
  digitalWrite(relePlafo , RelayPlafoOff);
  pinMode(relePlafo , OUTPUT);


  // create the alarms, to trigger at specific times
  Alarm.alarmRepeat(CO2Timer[0], CO2Timer[1], CO2Timer[2], CO2); // 18:430 every day
  Alarm.alarmRepeat(PlafoTimer[0], PlafoTimer[1], PlafoTimer[2], Plafo); // 21:43:00 every day

  digitalClockDisplay();
  unsigned long ora[3] = {hour(), minute(), second()};
}

void loop() {
  printTime();
  Alarm.delay(0); // wait one second between clock display
  checkTimers();
}

// functions to be called when an alarm triggers:
void CO2() {
  Serial.println("Alarm: accendo CO2");
  lcd.setCursor(0, 0);
  lcd.print("CO2:ON AIR:OFF");
  digitalWrite(releCO2 , RelayOn); // Accendo CO2
  digitalWrite(releAereatore , RelayAirOff); // Spengo Aereatore
  Alarm.timerOnce(0, 0, CO2Timer[3], EndCO2); // tra quanto tempo in ore, minuti, secondi intervenire
}

void EndCO2() {
  Serial.println("Spengo CO2 - accendo AIR");
  lcd.setCursor(0, 0);
  lcd.print("CO2:OFF AIR:ON ");
  digitalWrite(releAereatore , RelayAirOn); //Accendo Aereatore
}


void Plafo() {
  lcd.setCursor(0, 0);
  lcd.print("PLAFO:ON                 ");
  Serial.println("Alarm: Accendo LUCI");
  digitalWrite(relePlafo , RelayOn); // Accendo luci
  Alarm.timerOnce(0, 0, PlafoTimer[3], EndPlafo); // tra quanto tempo in ore, minuti, secondi intervenire
}

void EndPlafo() {
  Serial.println("Spengo LUCI");
  lcd.setCursor(0, 0);
  lcd.print("PLAFO:OFF                 ");
  digitalWrite(relePlafo , RelayOff); //Spengo luci
  // esegui le varie istruzioni
}

void p2dig(uint8_t v)
// Print 2 digits with leading zero
{
  if (v < 10) lcd.print("0");
  lcd.print(v);
}

void printDigits(int digits) {
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

const char *dow2String(uint8_t code)
// Day of week to string. DOW 1=Sunday, 0 is undefined
{
  static const char *str[] = {"---", "Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"};

  if (code > 7) code = 0;
  return (str[code]);
}

void printTime(void)
// Display the current time on the display
{
  // display the current time
  lcd.setCursor(0, 1);
  p2dig (hour());
  lcd.print(":");
  p2dig(minute());
  lcd.print(":");
  p2dig(second());
}

void digitalClockDisplay() {
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(' ');
  Serial.print(day());
  Serial.print('/');
  Serial.print(month());
  Serial.print('/');
  Serial.print(year());

  //Serial.println();


  Alarm.delay(1000); // wait one second between clock display
}

void checkTimers() {
  // verifico l'ora attuale per rispettare i timers in caso di mancanza di corrente
  unsigned long ora[3] = {hour(), minute(), second()};
  unsigned  long nows = ( (ora[0] * 3600) + (ora[1] * 60) + ora[2] ); // trasformo l'ora attuale in secondi
  unsigned  long CO2Start = ( (CO2Timer[0] * 3600) + (CO2Timer[1] * 60) + CO2Timer[2] );
  unsigned  long PlafoStart = ( (PlafoTimer[0]  * 3600) + (PlafoTimer[1] * 60) + PlafoTimer[2] );
  unsigned  long CO2End = (CO2Timer[3] * 3600);
  unsigned  long PlafoEnd = (PlafoTimer[3] * 3600);
  Serial.print("CO2Start: ");
  Serial.print (CO2Start);
  Serial.print(" Durata: ");
  Serial.print (CO2End);

  Serial.print(" Totale Secondi: ");
  Serial.print (CO2Start + CO2End);
  /* Serial.print(" - PlafoStart: ");
    Serial.print (PlafoStart);
    Serial.print(" PlafoEnd: ");
    Serial.print (PlafoEnd);
  */

  Serial.print(" - now: ");
  Serial.print(nows);
  Serial.print (" ");

  if  ( (nows >= CO2Start) && (nows <= (CO2Start + CO2End))) {
    Serial.print (" CO2 ACCESA - AIR SPENTA ");
    lcd.setCursor(0, 0);
    lcd.print("CO2:ON-AIR:OFF");
    digitalWrite(releCO2 , RelayOn); // Accendo CO2
    digitalWrite(releAereatore , RelayAirOff); // Spengo  Aereatore
  }
  else {
    Serial.print (" CO2 SPENTA - AIR ACCESA ");
    lcd.setCursor(0, 0);
    lcd.print("CO2:OFF AIR:ON ");
    digitalWrite(releCO2 , RelayOff); // Spengo CO2
    digitalWrite(releAereatore , RelayAirOn); // Accendo Aereatore
  }
  if  ((nows >= PlafoStart) && (nows <= PlafoStart + PlafoEnd)) {
    Serial.print (" PLAFO ACCESA ");
    lcd.setCursor(9, 1);
    lcd.print("LED:ON");
    digitalWrite(relePlafo , RelayPlafoOn); // Accendo Plafo
  }
  else {
    Serial.print (" PLAFO SPENTA ");
    lcd.setCursor(9, 1);
    lcd.print("LED:OFF");
    digitalWrite(relePlafo , RelayPlafoOff); // Spengo Plafo
  }
  Serial.println ();
}





Patrick_M

per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

zoomx

Aggiungo che se tu stai realizzando un impianto che , ad esempio, ha a che fare con un acquario oppure regola anche l'illuminazione artificiale di una serra ma non ha a che fare con umani (ad esempio l'illuminazione serve agli animali e non alle persone che vogliono osservarli) il passaggio tra ora estiva ed invernale può essere tralasciato.

ziopippo

#28
May 16, 2018, 12:20 pm Last Edit: May 16, 2018, 12:22 pm by ziopippo
Aggiungo che se tu stai realizzando un impianto che , ad esempio, ha a che fare con un acquario oppure regola anche l'illuminazione artificiale di una serra ma non ha a che fare con umani (ad esempio l'illuminazione serve agli animali e non alle persone che vogliono osservarli) il passaggio tra ora estiva ed invernale può essere tralasciato.

Si ci ha azzeccato! Il progetto serve ad automatizzare l'acquario di un amico. Convengo con te che non ha vitale importanza la gestione dell'ora legale/solare però, vuoi mettere a non vedere l'ora sbagliata sul display per 5 o 7 mesi?  :smiley-twist:  :smiley-mr-green:

Ed aggiungo... se posso limitare al minimo gli smanettamenti, sono più tranquillo che non trova bug nel codice.  :smiley-lol:  :smiley-yell:  :smiley-evil:  :smiley-evil:  :smiley-evil:

ziopippo


ho dato un'occhiata al readme.txt della libreria degli allarmi e ho trovato questo:

Alarm.timerOnce(Hour, Minute, Second, TimerFunction);
  Description:  As timerOnce above, but period is the number of seconds in the given Hour, Minute and Second parameters

quindi puoi impostare l'allarme all'orario che vuoi come gia facevi e impostare la durata per l'intervento con la timerOnce che accetta ore, minuti e secondi
quindi seguendo l'esempio

Code: [Select]

#include <Time.h>
#include <TimeAlarms.h>

void setup()
{
  Serial.begin(9600);
  setTime(8,29,0,1,1,11); // set time to Saturday 8:29:00am Jan 1 2011
  // create the alarms
  Alarm.alarmRepeat(8,30,0, MorningAlarm);  // 8:30am every day
  Alarm.alarmRepeat(17,45,0,EveningAlarm);  // 5:45pm every day
 
//
// nel caso di mancanza corrente
// qui ci va il controllo se siamo in un orario successivo al previsto per l'allarme
//per l'attivazione/disattivazione dei relè
// qualche cosa tipo
// if (oraAdesso > oraPrimoAllarme && oraAdesso < oraFineAllarme)
//    attiva/disattiva relè;


}

....


Stavo dando una riorganizzata al codice per aggiungere altre funzioni e, mi sono accorto che prevedendo i controlli sull'orario che ho implementato, posso a questo punto eliminare totalmente la libreria TimeAlarms in quanto la bypassa totalmente!
Che ne pensi?

Code: [Select]

...
 if  ( (nows >= CO2Start) && (nows <= (CO2Start + CO2End))) {
    Serial.print (" CO2 ACCESA - AIR SPENTA ");
    lcd.setCursor(0, 0);
    lcd.print("CO2:ON");
    digitalWrite(releCO2 , RelayOn); // Accendo CO2
    digitalWrite(releAereatore , RelayAirOff); // Spengo  Aereatore
  }
  else {
    Serial.print (" CO2 SPENTA - AIR ACCESA ");
    lcd.setCursor(0, 0);
    lcd.print("CO2:OFF");
    digitalWrite(releCO2 , RelayOff); // Spengo CO2
    digitalWrite(releAereatore , RelayAirOn); // Accendo Aereatore
  }
...

Go Up