Modificare sketch irrigatore

Buongiorno, vorrei modificare uno sketch di Mauro Alfieri (che riporto).
Lui ha previsto 4 elettrovalvole che vanno in funzione una volta al giorno.
Lo vorrei modificare in modo da usare solo due elettrovalvole ma che intervengano due volte al giorno.
Una mia prima idea è di collegare il pin 5 e 7 (tramite diodo) alla stessa base del transistore che pilota il relè, e la stessa cosa con il 6 e 8.
Vorrei però farlo a livello software in modo che intervengano sempre, esempio, il 5 e il 6.
Ciao

/**********************************************************
 * Irrigazione rtc Arduino
 *
 * Data creazione 20 maggio 2013
 * Ultima modifica 27 maggio 2013
 *
 * autore: Mauro Alfieri
 * web:    mauroalfieri.it
 * tw:     @mauroalfieri
 *
/**********************************************************/
#include <Wire.h>
#include <RTClib.h>
 
#define pinSettore1 5
#define pinSettore2 6
#define pinSettore3 7
#define pinSettore4 8
 
int settore1[] = {15,40,15,41};
int settore2[] = {15,42,15,43};
int settore3[] = {15,44,15,45};
int settore4[] = {15,46,15,47};
 
RTC_DS1307 RTC;
 
void setup() {
  Serial.begin(9600);
  Serial.println( "START" );
 
  Wire.begin();
  RTC.begin();
 
  pinMode( pinSettore1,OUTPUT );
  pinMode( pinSettore2,OUTPUT );
  pinMode( pinSettore3,OUTPUT );
  pinMode( pinSettore4,OUTPUT );
 
  RTC.sqw(0);        //0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
 
  digitalWrite( pinSettore1,LOW );
  digitalWrite( pinSettore2,LOW );
  digitalWrite( pinSettore3,LOW );
  digitalWrite( pinSettore4,LOW );
 
}
 
void loop() {
  if ( RTC.isrunning()) {
    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(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
 
    int _hour   = now.hour();
    int _minute = now.minute();
 
    // Settore Uno
    if ( settore1[0] <= _hour && _hour <= settore1[2] && settore1[1] <= _minute && _minute <= settore1[3] ) {
      digitalWrite( pinSettore1,HIGH );
    } else { digitalWrite( pinSettore1,LOW ); }
 
    // Settore Due
    if ( settore2[0] <= _hour && _hour <= settore2[2] && settore2[1] <= _minute && _minute <= settore2[3] ) {
      digitalWrite( pinSettore2,HIGH );
    } else { digitalWrite( pinSettore2,LOW ); }
 
    // Settore Tre
    if ( settore3[0] <= _hour && _hour <= settore3[2] && settore3[1] <= _minute && _minute <= settore3[3] ) {
      digitalWrite( pinSettore3,HIGH );
    } else { digitalWrite( pinSettore3,LOW ); }
 
    // Settore Quattro
    if ( settore4[0] <= _hour && _hour <= settore4[2] && settore4[1] <= _minute && _minute <= settore4[3] ) {
      digitalWrite( pinSettore4,HIGH );
    } else { digitalWrite( pinSettore4,LOW ); }
 
  }
}

Dopo aver reso un po' più comprensibili i nomi delle variabili, farei così:

/**********************************************************
   Irrigazione rtc Arduino
       Data creazione 20 maggio 2013
       Ultima modifica 27 maggio 201
   autore: Mauro Alfieri
       web:    mauroalfieri.it
       tw:     @mauroalfieri
  /**********************************************************/
#include <Wire.h>
#include <RTClib.h>

#define pinEV1 5 // EV: ElettroValvola
#define pinEV2 6
// #define pinEV3 7
// #define pinEV4 8
RTC_DS1307 RTC;
//                Accens.  Spegn.
//                 H   M   H   M
int HMHM_EV1_1[] = {15, 40, 15, 41}; // H e M  accensione e H e M spegnimento EV1-1
int HMHM_EV1_2[] = {15, 42, 15, 43}; // H e M  accensione e H e M spegnimento EV1-2
int HMHM_EV2_1[] = {15, 44, 15, 45}; // H e M  accensione e H e M spegnimento EV2-1
int HMHM_EV2_2[] = {15, 46, 15, 47}; // H e M  accensione e H e M spegnimento EV2-2

void setup()
{
  Serial.begin(9600);
  Serial.println( "START" );
  Wire.begin();
  RTC.begin();
  
  pinMode(pinEV1, OUTPUT);
  pinMode(pinEV2, OUTPUT);

  RTC.sqw(0);        // 0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz
  
  if (! RTC.isrunning())
    {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
    }
  digitalWrite(pinEV1, LOW);
  digitalWrite(pinEV2, LOW);
}

void loop()
{
  if (RTC.isrunning())
    {
    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(now.hour(), DEC);   Serial.print(':'); 
    Serial.print(now.minute(), DEC); Serial.print(':'); 
    Serial.print(now.second(), DEC); Serial.println();

    int _hour   = now.hour();
    int _minute = now.minute();

    // Settore Uno
    if ((_hour>=HMHM_EV1_1[0] && _hour<=HMHM_EV1_1[2] && _minute>=HMHM_EV1_1[1] && _minute<=HMHM_EV1_1[3])
       ||
       (_hour>=HMHM_EV1_2[0] && _hour<=HMHM_EV1_2[2] && _minute>=HMHM_EV1_2[1] && _minute<=HMHM_EV1_2[3]))
      {
      digitalWrite(pinEV1, HIGH); // Apri
      }
    else {digitalWrite(pinEV1, LOW);} // Chiudi

    // Settore Due
    if ((_hour>=HMHM_EV2_1[0] && _hour<=HMHM_EV2_1[2] && _minute>=HMHM_EV2_1[1] && _minute<=HMHM_EV2_1[3])
       ||
        (_hour>=HMHM_EV3[0] && _hour<=HMHM_EV3[2] && _minute>=HMHM_EV3[1] && _minute<=HMHM_EV3[3]))
      {
      digitalWrite(pinEV2, HIGH);
      }
    else {digitalWrite(pinEV2, LOW);}

/*    // Settore Tre
    if (_hour>=HMHM_EV2_2[0] && _hour<=HMHM_EV2_2[2] && _minute>=HMHM_EV2_2[1] && _minute<=HMHM_EV2_2[3])
      {
      digitalWrite(pinEV3, HIGH);
      }
    else {digitalWrite(pinEV3, LOW);}

    // Settore Quattro
    if (_hour>=HMHM_EV4[0] && _hour<=HMHM_EV4[2] && _minute>=HMHM_EV4[1] && _minute<=HMHM_EV4[3])
      {
      digitalWrite(pinEV4, HIGH);
      }
    else {digitalWrite(pinEV4, LOW);}
    }
*/
}

Salvo errori, così è anche più semplice:

/**********************************************************
   Irrigazione rtc Arduino
       Data creazione 20 maggio 2013
       Ultima modifica 27 maggio 201
   autore: Mauro Alfieri
       web:    mauroalfieri.it
       tw:     @mauroalfieri
  /**********************************************************/
#include <Wire.h>
#include <RTClib.h>

#define pinEV1 5 // EV: ElettroValvola
#define pinEV2 6

RTC_DS1307 RTC;
//                  Apre Chiude
//                  H  M  H  M
int HMHM_EV1_1[] = {0700, 0730}; // H e M  accensione e H e M spegnimento EV1-1
int HMHM_EV1_2[] = {1900, 1930}; // H e M  accensione e H e M spegnimento EV1-2
int HMHM_EV2_1[] = {0735, 0805}; // H e M  accensione e H e M spegnimento EV2-1
int HMHM_EV2_2[] = {1935, 2005}; // H e M  accensione e H e M spegnimento EV2-2

void setup()
{
  Serial.begin(9600);
  Serial.println( "START" );
  Wire.begin();
  RTC.begin();
  
  pinMode(pinEV1, OUTPUT);
  pinMode(pinEV2, OUTPUT);

  RTC.sqw(0);        // 0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz
  
  if (! RTC.isrunning())
    {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(__DATE__, __TIME__));
    }
}

void loop()
{
  if (RTC.isrunning())
    {
    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(now.hour(), DEC);   Serial.print(':'); 
    Serial.print(now.minute(), DEC); Serial.print(':'); 
    Serial.print(now.second(), DEC); Serial.println();

    int adesso = 100*now.hour() + now.minute();

    // Settore Uno
    if ((adesso>=HMHM_EV1_1[0] && adesso<=HMHM_EV1_1[1])
       ||
        (adesso>=HMHM_EV1_2[0] && adesso<=HMHM_EV1_2[1]))
      {
      digitalWrite(pinEV1, HIGH); // Apri
      }
    else {digitalWrite(pinEV1, LOW);} // Chiudi

    // Settore Due
    if ((adesso>=HMHM_EV2_1[0] && adesso<=HMHM_EV2_1[1])
       ||
        (adesso>=HMHM_EV2_2[0] && adesso<=HMHM_EV2_2[1]))
      {
      digitalWrite(pinEV2, HIGH);
      }
    else {digitalWrite(pinEV2, LOW);}
}

Per ora grazie, domani lo provo e ti faccio sapere.
Un altro passo che vorrei fare è fare irrigare due volte al giorno, ma un passo alla volta.
Per quanto riguarda la leggibilità sarebbe stato meglio allegare il link dell'articolo, lo faccio ora, di nuovo grazie
https://www.mauroalfieri.it/elettronica/centralina-irrigazione-arduino.html

Due volte al giorno?... Quello fa! :slight_smile:

int HMHM_EV1_1[] = {0700, 0730}; // H e M  accensione e H e M spegnimento EV1-1
int HMHM_EV1_2[] = {1900, 1930}; // H e M  accensione e H e M spegnimento EV1-2
int HMHM_EV2_1[] = {0735, 0805}; // H e M  accensione e H e M spegnimento EV2-1
int HMHM_EV2_2[] = {1935, 2005}; // H e M  accensione e H e M spegnimento EV2-2

Ecco, l'ho modificato:
la zona 1 viene innaffiata dalle 7 alle 7.30 e dalle 19 alle 19.30;
la zona 2 viene innaffiata dalle 7.35 alle 8.05 e dalle 19.35 alle 20.05.

Grande! Non avevo ancora studiato il tuo elaborato, come dicevo domani lo provo :+1:

Fammi sapere! :slight_smile:

L'ho compilato, mi da errore alla riga 21
int HMHM_EV2_1 = {0735, 0805}; // H e M accensione e H e M spegnimento EV2-1
Questo errore:
sketch_aug10b:21:27: error: invalid digit "8" in octal constant

:confused:

Inoltre correggo la richiestaquella di fare due interventi al giorno, l'avevo già detto nel primo post (è l'età... mettiamola così) , volevo dire oltre a due interventi al giorno, almeno 2 programmi che selezioneri con uno switc...

Se metti la cifra 0 il compilatore assume che il numero sia in base 8 (octal) e quindi il numero 0805 non è valido.

https://www.cplusplus.com/doc/hex/

Anche le altre tre istruzioni cominciano o contengono lo 0, ma solo su quella mi da errore, anche se le inverto di posto . :pensive:

Il messaggio del compilatore è chiaro :wink:
Cifra 8 non valida in una costante "octal"

Nel sistema numerico in base 8 si hanno solo 8 cifre per rappresentare i numeri, ovvero 01234567 e di conseguenza il numero costante 0805 (base8) non è valido.

1 Like

Ci sono anche alcuni 9, ma non mi da errore, ora provo a sostituire l'8 e vedo che succede....
... l'ho sostituito con un 6 e non mi da più l'errore, la vedo dura per un principiante cronico come me :pensive:
Ma sto usando un approccio diverso, funziona, interviene due volte al giorno e ha due programmi( più o meno durata), funziona al 90%, ogni tanto si riavvia, ma appena riparte se si trova nell'intervallo in cui deve attivarsi si attiva, e quindi continua l'irrigazione.
Per ora è un accrocchio, se lo rendo decente lo posto. Ciao

Ma non fai prima a cancellare gli 0 ???

Se cancello gli 0 non si sballano gli orari?

No, perché dovrebbe?

Se si riavvia, c'è sempre qualche problema nascosto che è meglio risolvere.
Potrebbe essere sia hardware che software.

esatto, domani provo con "UNO" originale.
Inoltre sto usando rtc3231 in luogo del ds1307, naturalmente con le sue librerie e impostazioni, ma qualcosa può esseremi sfuggito. Ciao

Se ti ritrovi un ESP8266 oppure un ESP32 (ed hai connessione internet nel punto di applicazione), ti posso girare un esempio che ti consente di programmare quanti timer vuoi su base giornaliera, feriale, o solo weekend usando l'app Telegram ed un bot.

1 Like

ho tutto quello che hai indicato
e comunque da tenere presente che sono un elettrotecnico prestato all'elettronica analogica, quindi sono moooolto indietro rispetto a voi.
Ma mi piace tenere la mente impegnata, altrimenti con alcune decine di euro prendevo gli irrigatori belli e fatti.

Allora prova questo esempio se vuoi (cosi mi dai anche un po' di feedback :laughing:)

EventScheduler.ino

L'esempio è generico e compilabile sia per esp8266 che per esp32, ma si può facilmente semplificare e/o adattare ad esigenze specifiche.
Ad esempio se non ti interessa tutta la parte per l'aggiornamento del firmware da remoto, si rimuove e via.
L'esempio chiede anche un setpoint di temperatura perché è pensato come cronotermostato, ma nel tuo caso quel passaggio non serve (oppure potresti mettere un sensore di umidità del terreno per evitare di innaffiare inutilmente).