Centralina irrigazione arduino imposta orario

Continuando nella realizzazione della tua centralina irrigazione arduino è giunto il momento di integrare i pulsanti ed il display LCD allo sketch di controllo della centralina irrigazione arduino: Centralina irrigazione arduinoPer integrare pulsanti e display dovrai modificare lo sketch per consentirgli di gestire i nuovi componenti presenti. Non è nulla di nuovo, se hai letto gli articoli:

ed un precedente articolo:

Noterai che questo sketch è un insieme di parti provenienti da quegli articoli. Spesso quando realizzi un progetto prendi sketch o parti di sketch da differenti siti o da tuoi precedenti esperimenti e questo è senza dubbio uno di quei progetti in cui riutilizzare del buon codice già scritto in precedenza ti semplifica la vita e velocizza il raggiungimento del risultato.

Sketch della centralina irrigazione arduino

Lo sketch che riporto di seguito è stato arricchito e modificato con alcune funzioni:

/**********************************************************
 * Centralina irrigazione arduino
 *
 * Data creazione 20 maggio 2013
 * Ultima modifica 30 luglio 2013
 *
 * autore: Mauro Alfieri
 * web:    mauroalfieri.it
 * tw:     @mauroalfieri
 *
/**********************************************************/
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>

/**********************************************************/

#define pinSettore1 5
#define pinSettore2 6
#define pinSettore3 7
#define pinSettore4 8

#define BUTTON A0

/**********************************************************/

int settore1[] = {15,40,15,41};
int settore2[] = {15,42,15,43};
int settore3[] = {15,44,15,45};
int settore4[] = {15,46,15,47};

int SELECT[]  =  {0,20};     // pulsante A
int LEFT[]    =  {500,520};  // pulsante B
int RIGTH[]   =  {670,690};  // pulsante C
int UP[]      =  {760,780};  // pulsante D
int DOWN[]    =  {810,830};  // pulsante E

char buffer[10];
unsigned long time=0;
unsigned long timeSet=0;
int  setModeTime=2000;

/**********************************************************/

RTC_DS1307 RTC;
LiquidCrystal lcd(4, 3, 10, 11, 12, 13);

/**********************************************************/

void setup() {
  Serial.begin(9600);
  Serial.println( "START" );

  Wire.begin();
  RTC.begin();
  lcd.begin(16, 2);

  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 );

  lcd.clear();
}

/**********************************************************/

void loop() {
  if ( RTC.isrunning()) {

    DateTime now = RTC.now();
    int _button = ctrlButton( analogRead( BUTTON ) );

    if ( _button == 0 || _button > 1) { time = millis(); }

    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.print(' pulsante: ');
    Serial.print(_button);
    Serial.println();

    int _hour   = now.hour();
    int _minute = now.minute();
    start_impianto( _hour, _minute );
    view_date_time( now );

    if (time > 0 && setModeTime < (millis() - time) ) { setMode( now ); }
  }
}

/**********************************************************/

void start_impianto( int _hour, int _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 ); }

}

/**********************************************************/

int ctrlButton( int button ) {

  if ( SELECT[0] <= button && button <= SELECT[1] )  { return 1; }
  if ( LEFT[0] <= button && button <= LEFT[1] )      { return 2; }
  if ( RIGTH[0] <= button && button <= RIGTH[1] )    { return 3; }
  if ( UP[0] <= button && button <= UP[1] )          { return 4; }
  if ( DOWN[0] <= button && button <= DOWN[1] )      { return 5; }

  return 0;

}

/**********************************************************/

void view_date_time ( DateTime now ) {

    lcd.clear();

    sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
    lcd.setCursor(0,0);
    lcd.print( buffer );

    char buffer[10] = "";

    sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
    lcd.setCursor(0,1);
    lcd.print( buffer );

    delay(1000);
}

/**********************************************************/

void setMode( DateTime now ) {
    boolean setMode = true;
    int setModeLevel = 0;

    int _day = now.day();
    int _month = now.month();
    int _year = now.year();
    int _hour = now.hour();
    int _min = now.minute();
    int _sec = now.second();

    lcd.clear();
    lcd.setCursor(0,0);
    sprintf(buffer,  "%s: %02d", "Giorno", _day);
    delay( 1000 );
    timeSet = millis();

    while ( setMode ) {
      int _button = ctrlButton( analogRead( BUTTON ) );

      if ( _button > 1 ) { timeSet = millis(); }

      lcd.setCursor(0,0);

      // Set Day
      if ( setModeLevel == 0 ) {
        if ( _button == 3 && _day < 31) { _day++; }
        if ( _button == 2 && _day > 1) { _day--; }

        sprintf(buffer,  "%s: %02d", "Giorno", _day);
      }
      // Set Month
      if ( setModeLevel == 1 ) {
        if ( _button == 3 && _month < 12) { _month++; }
        if ( _button == 2 && _month > 1) { _month--; }

        sprintf(buffer,  "%s: %02d", "Mese", _month);
      }
      // Set Year
      if ( setModeLevel == 2 ) {
        if ( _button == 3 && _year < 9999) { _year++; }
        if ( _button == 2 && _year > 1900) { _year--; }

        sprintf(buffer,  "%s: %02d", "Anno", _year);
      }
      // Set Hour
      if ( setModeLevel == 3 ) {
        if ( _button == 3 && _hour < 24) { _hour++; }
        if ( _button == 2 && _hour > 1) { _hour--; }

        sprintf(buffer,  "%s: %02d", "Ora", _hour);
      }
      // Set Minute
      if ( setModeLevel == 4 ) {
        if ( _button == 3 && _min < 60) { _min++; }
        if ( _button == 2 && _min > 1) { _min--; }

        sprintf(buffer,  "%s: %02d", "Minuti", _min);
      }
      // Set Second
      if ( setModeLevel == 5 ) {
        if ( _button == 3 && _sec < 60) { _sec++; }
        if ( _button == 2 && _sec > 0) { _sec--; }

        sprintf(buffer,  "%s: %02d", "Secondi", _sec);
      }

      lcd.print( buffer );
      if ( _button == 5 ) { lcd.clear(); setModeLevel++;  }
      if ( _button == 4 ) { lcd.clear(); setModeLevel--;  }
      if ( setModeLevel > 5 ) { setModeLevel=0; }

      if (timeSet > 0 && (setModeTime*2) < (millis() - timeSet) ) {
         RTC.adjust(DateTime(_year, _month, _day, _hour, _min, _sec));
         setMode = false;
      }
      delay(200);
    }
}

 

come avrai notato è decisamente più lungo del suo predecessore, del resto deve fare più cose.

 

Le linee che restano invariate le puoi leggere negli articoli citati, decsrivo di seguito solo le linee aggiunte o modificate per aggiungere le nuove funzioni alla centralina irrigazione arduino.

Inizia dalla linea 014: in cui includi la classe LiquidCrystal.h che ti permette di gestire il display LCD della centralina irrigazione arduino;

 

linea 023: aggiungi la definizione di BUTTON ossia il pin a cui è collegata la pulsantiera alla centralina irrigazione arduino, come sai tutti i cinque pulsanti sono collegati al pin A0;

 

linee 032-036: sono le linee in cui definisci i valori di min e max per ciascun pulsante, prendi ad esempio la 032:

int SELECT[]  =  {0,20};     // pulsante A

 

questa linea indica allo sketch che i valori 0 e 20 appartengono all’array SELECT composto da due elementi. Quando verificherai il valore letto sul pin A0 se ricade nel’intervallo 0-20 saprai di aver premuto il pulsante A, come visto nell’articolo precedente e riportato nella figura: lettura dei 5 pulsanti da arduino in aggiunta al riconoscimento del pulsante A ho assegnato all’array il nome SELECT perchè vorrei utilizzare questo pulsante con funzione di SELECT / INVIO nella scelta e conferma delle funzioni di menu;

 

linea 038: imposta una variabile di buffer da 10 caratteri che utilizzerai per scrivere sul display data ed ora dell’RTC; linee 039-040: definisci due variabile di tipo unsigned long in cui memorizzerai i tempi in millis() per scandire il tempo che passa ed entrare nella modalità di impostazione dell’ora;

 

linea 041: definisci una variabile di tipo integer in cui impostare il tempo minimo per cui il bottone SELECT deve essere premuto per entrare in modalità SET; linea 046: inizializza la classe LiquidCrystal con i pin definiti in questo articolo;

 

linea 056: inizializza l’istanza lcd con il metodo begin() della classe LiquidCrystal;

 

linea 074: pulisci entrambe le linee del display LCD 16×2; linea 082: ad ogni ciclo di loop() richiama la funzione ctrlButton( analogRead ( A0 ) )  che analizzeremo in seguito ed assegna alla variabile _button il valore restituito da tale funzione;

 

linea 085: controlla che il pulsante SELECT sia stato premuto, la funzione ctrlButton( analogRead( A0 ) ) restituisce il valore 1 se il pulsante SELECT è stato premuto. La pressione del pulsante imposta il valore della variabile time a millis() che ti servirà alla linea 107;

 

linee 098-099: aggiungi due linee di print del Serial Monitor per farti scrivere anche il valore ritornato dalla linea 082;

 

linea 104: sostituisci il precedente blocco di codice, la cui funzione era di attivare le zone dell’impianto corrispondente alla fascia oraria corretta, con il richiamo alla funzione start_impianto() al cui interno ho riportato l’intero blocco di codice.Questa operazione ha il vantaggio di avere una loop() più snella e facile da comprendere anche in futuro per aggiungervi altre funzioni o condizioni di funzionamento;

 

linea 105: richiama la funzione view_date_time() che visualizza sul display la data e l’ora dell’RTC;

 

linea 107: definisci la condizione con cui entri nella modalità di impostazione della data e dell’ora. Controlli che il tempo trascorso tra la pressione del pulsante e l’attuale valore di millis() superi il valore impostato come tempo di setModeTime, in tal caso richiami la funzione: setMode( now );

 

linee 113-135: definisci la funzione start_impianto() al cui interno è presente tutto il blocco di codice precedentemente presente nella funzione loop() e che fa il vero e proprio controllo dell’ora e dei minuti per attivare i singoli settori dell’impianto, se vuoi verificare come funziona puoi leggere l’articolo;

 

linee 139-149: definisci la funzione ctrlButton( button ) il cui scopo è valutare quale pulsante hai premuto, per farlo usi un gioco di confronti tra il valore button ed i valori di range definiti alle linee 032-036. Come avevi già visto gli ciascun array contiene i valori min e max di confronto, per cui se il valore button è 0,1,2,3,4,…20 ritorna il valore 1 che da questo momento sarà per te SELZIONA / INVIO / CONFERMA / SET in funzione del punto in cui lo valuti. In pratica la tabella seguente riporta i valori dei pulsanti e la loro funzione:

centralina irrigazione arduino Tabella pulsanti se nessuno dei range impostati corrisponde al valore letto sul pin analogico la funzione restituisce 0 con la linea 147;

 

linee 153-168: definisci la funzione view_date_time() richiamata nell’ultima linea del loop() la cui descrizione è quella definito nella funzione di loop() descritta nell’articolo “RTC shield DS1307: impostare data e ora” ed il cui scopo è quello di visualizzare sul display la data e l’ora corrente dell’RTC;

 

linee 172-250: definisci l’ultima funzione di questo script setMode() la cui funzione è di consentirti di impostare la data e l’ora dell’RTC. Questa funzione è stata dettagliatamente descritta nell’articolo “RTC shield DS1307: impostare data e ora” ed adattata per questo sketch, ecco come:

 

linea 190: assegna il valore di ritorno della funzione ctrlButton() alla variabile _button; linea 192: controlla che il valore di _button sia superiore a 1, questo comporta che stai continuando a premere dei pulsanti, per impostare data e ora, e fino a quando premi i pulsanti non devi salvare il dato nella RTC della centralina irrigazione arduino, per ottenere questo effetto continua a impostare timeSet come il valore di millis() corrente;

 

linea 244: quando il valore dell’operazione ( millis() – timeSet ) è maggiore del doppio del valore impostato nella variabile setModeTime esegui le linee 245 e 246;

 

linea 245: salva data ed ora corrente sull’RTC Shield;

 

linea 246: imposta la variabile booleana setMode a false in modo che lo sketch esca dal ciclo while e iniziato alla linea 189 e dalla funzione setMode();

 

Buona irrigazione !!!

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/centralina-irrigazione-arduino-imposta-orario.html

52 comments

Skip to comment form

  1. Ciao Mauro,
    Peccato aver già montato su millefori il mio primo progettino (molto minimale e sulla base di tuoi sketch più vecchi) per l’ irrigazione… altrimenti questo sarebbe stato perfetto e l’ ideale per quello che dovevo fare!!! ti ruberò anche questo appena rielaboro la mia centralina! 😛
    volevo chiederti una cosa… ho un problema di riavvio dell’ atmel quando ho le elettrovalvole collegate ai relè.
    uso un alimentatore da 24V per alimentare le elettrovalvole e uno stepdown con il quale alimento l’ atmel a 5V puliti.
    a parte ho una shield con 4 relè che si alimenta anch’ essa dalla linea 5Vdello stepdown.
    quando avvio il test delle linee (1 alla volta i relè si chiudono per 15 sec) il primo relè si chiude ma nel momento in cui aprè togliendo corrente all’ elettrovalvola l’ atmel riavvia! di conseguenza il test si stoppa.
    senza le elettrovalvole collegate il test va via liscio….
    i relè dovrebbero avere già il diodo di protezione (è già sulla shield)
    qualche consiglio?
    Grazie.
    Alessandro

    1. Ciao Alessandro,
      Per lo sketch prendi pure quello che ritieni utile, sappi ne sto elaborando nuove versioni, la voglia di sperimentare non si ferma mai.
      Potresti pensare di unire gli sketch adattando il codice finale.

      Per i relè stai usando la stessa shield che ho descritto nei miei articoli o una differente, sembra un problema elettrico.
      Stai usando in arduino o lo hai costruito standalone sul tuo circuito?

      Mauro

  2. è una shield cinese…
    l’ atmega è standalone.
    ho già provato anche ad alimentare l’ atmega e il resto del circuito tramite un alimentatore da 12V con in mezzo lo stepdown(portato a 5V) e le elettrovalvole con un altro alimentatore da 24V (giusto per provare a dividere) ma il problema persiste.
    hai mai provato con in carico le elettrovalvole? leggevo di archi di tensione che si generano sulle bobine nel momento in cui si apre il relè… ma i relè hanno già diodo in antiparallelo di protezione… dovrei metterlo anche alle elettrovalvole? sono un pò ignorante in materia… :-/

    1. Ciao Alessandro,
      con la shield che ho utilizzato non ho avuto alcun problema con le elettrovalvole collegate può darsi che i diodi di protezione della shield che stai utilizzando non siano connessi correttamente.

      La shield relay dispone di un optoisolatore per ogni relè che garantisce la protezione da correnti di ritorno su arduino.

      Mauro

  3. sarà questa relè shield che ha problemi allora.. gli optoisolatori li monta anche la mia in accoppiata con i diodi… che rabbia.

    motivo in più per rivedere, riprendere e risistemare tutto con questo tuo nuovo aggiornamento! gran bel lavoro davvero!

    1. Ciao Alessandro,
      se ci sono i fotoaccoppiatori non dovresti avere problemi di ordenti di ritorno, sopratutto se hai separato le alimentazioni.
      Tutte le alimentazioni devono avere il negativo (Gnd) comune per funzionare, ma questo già lo avrai fatto.

      Prova la shield con uno schetch base ad es.:
      – attivo relè uno
      – attendo 1 min
      – spengo relè uno
      – attendo 30 secondi
      – attivo 2
      – ecc..

      Mauro

    • cristiano on 8 settembre 2013 at 13:34
    • Reply

    Buongiorno Mauro
    Interessato dal tuo progetto della centralina di irrigazione, ho iniziato la sua preparazione, ma dovendo essere non un esperimento di studio ma un oggetto da usare stabilmente, vorrei fare un cablaggio su circuito stampato.
    In attesa della rtc shield e del LCD, ho trovato tra i miei componenti quattro relè a 5 volt, ed ho realizzato una shield su PCB, completata e collaudata funziona. L’idea è di realizzare un unico circuito stampato con relè, lcd, pulsanti e sezione alimentazione, da inserire come ultima shield.
    Per fare una bella cosa la mia relè shield alimenta i relè dal pin Vin di Arduino, il solo relè nudo ha un assorbimento di 40 ma. ma soommato al led che ne segnala l’eccitazione e alla dissipazione del 7805 sale a circa 80/90 ma., anche se non saranno eccitati più di due in simultanea, 160 ma., la domanda è quanta corrente può erogare il Pin Vin di Arduino, io in rete non sono riusciyo ad avere questa informazione.
    Come vedi non ho abbandonato arduino, anzi ho realizzato un piccolo robot autocostruito, anzi ti dirò di più stavo per partecipare al tuo corso svolto in quel bellissimo agriturismo, ma quando ho letto dei genitori che accompagnano i figli mi sono sentito troppo vecchio.
    Un saluto Cristiano

    1. Ciao Cristiano,
      Per la centralina io eviterei di alimentare tutto il Vin di arduino, sebbene sia connesso direttamente al polo centrale del connettore di alimentazione é meglio utilizzare un collegamento diretto tra l’alimentazione e il tuo circuito.

      Per il robot sono contento che tu ci stia provando e presto organizzerò a milano un corso, senza bambini e papà, e vicino alla metro di Lambrate, se ti interessa segui la newsletter ed il blog 🙂

      Mauro

    • Luciano on 11 marzo 2014 at 09:53
    • Reply

    Ciao Mauro, un grosso ringraziamento a te e alla tua voglia di aumentare il nostro apprendere il mondo arduino, ho provato il tuo irrigatore e non capisco perché il massimo tempo di accensione per qualunque delle quattro valvole è 1 ora max, mi spiego meglio, se metto come orario (15,46,16,48) alle 15,46 si aprirà la valvola ma si richiuderà alle 15,48, cioè due minuti dopo anziché 62 minuti dopo, è come se non tenesse conto delle ore ma solo dei minuti, ho io qualche problema di libreria o pensi sia altro?
    Grazie, Luciano

    1. Ciao Luciano,
      ho spostato il tuo commento nell’articolo corretto.
      Hai ragione è un Bug logico dello sketch per cui alle 15:48, nel tuo esempio, sono vere le prime due condizioni, quelle sul controllo dell’ora, e contemporaneamente è vera la terza ma non la quarta e quindi si chiude l’impianto.
      Prova a correggere il codice da solo se vuoi e magari condividiamo la tua soluzione, io prossimamente pubblicherò l’errata corrige.

    • Enzo on 23 aprile 2014 at 19:34
    • Reply

    Buonasera Mauro
    La voglio ringraziare per l’aiuto che da il tuo sito a chi come me ne sa ben poco di programmazione e grazie a quello che o potuto apprendere sul tuo sito sono riuscito a mettere insieme un piccolo progetto di automazione con Arduino per il mio acquario che mi da la possibilità di controllare temperatura livello acqua, misurazione PH e temporizzazione delle luci, per la parte orologio e timer ho utilizzato lo sketch del progetto di irrigazione il tutto funziona bene tranne il timer che riconosce l’ora di accensione ma non quella di spegnimento per cui mi da una temporizzazione al massimo di 59 minuti, ci ho perso la testa a provare e riprovare anche a variare lo sketch ma senza risultati mi ero arreso poi ho letto che ci sarà una correzione dello sketch ho tirato un sospiro di sollievo,
    sicuro di una soluzione resto in attesa.
    La ringrazio Enzo

    1. Ciao Enzo,
      in attesa della modifica, che potrebbe non riguardare il tuo problema specifico in quanto nessuno irriga per oltre un’ora, ti consiglio di leggere le spiegazioni sullo sketch e capire come vengono gestite ore e minuti per apportare le modifiche che ti occorrono.

    • Andrea on 8 febbraio 2015 at 16:16
    • Reply

    Ciao, complimenti!!! Ti volevo chiedere se è possibile aggiungere i giorni della settimana? Fare partire un settore solo ogni 2 giorni. lo già modificato mettendo i secondi. ciao e grazie

    1. Ciao Andrea,
      si puoi fare tutte le modifiche che desideri.

    • Andrea on 20 febbraio 2015 at 20:30
    • Reply

    Mi potresti aiutare

    1. Ciao Andrea,
      cosa non ti è chiaro di questo progetto ?

        • Andrea on 24 febbraio 2015 at 13:37
        • Reply

        Come faccio per decidere anche i giorni della settimana? Esempio, un settore deve partire solo il martedì, venerdì e domenica. Grazie

        1. Ciao Andrea,
          se leggi bene nel codice c’è un punto in cui definisci in quali orari partire, dovrai definire i giorni aggiungendoli al controllo.

            • Andrea on 24 febbraio 2015 at 20:34

            Ok grazie

    • Vincenzo on 11 agosto 2015 at 21:01
    • Reply

    Ciao Mauro non riesco a far il tuo progetto della centralina d’ irrigazione ti elenco i problemi da me riscontrati:
    1) è il meno importante me se lascio le istruzioni //RTC.sqw(0); // 0 Led off – 1 Freq 1Hz – 2 Freq 4096kHz – 3 Freq 8192kHz – 4 Freq 32768kHz il compilatore mi evidenzia questo errore:
    Arduino:1.6.1 (Windows XP), Scheda:”Arduino Uno”

    Centralina_irrigazione_arduino_imposta_orario.ino: In function ‘void setup()’:

    Centralina_irrigazione_arduino_imposta_orario.ino:63:7: error: ‘class RTC_DS1307’ has no member named ‘sqw’

    Errore durante la compilazione
    2)le ore min. e sec. non si incrementano questo accde solo quando premo il reset e sul monitor seriale compare ad ognoi pressione START
    2000/1/14 21:29:41148800
    START
    2000/1/14 21:29:42148800
    START
    2000/1/14 21:29:50148800
    START
    2000/1/14 21:29:51148800
    Non ho dimestichezza con il linguaggio C/Arduino.
    Spero in un tuo aiuto perchè ho la necessità di utilizzare questo progetto.
    Grazie
    Enzo

    1. Ciao Vincenzo,
      affronto un errore alla volta:
      1) si verifica perché la tua classe non supporta il metodo sqw, puoi scarcare una libreria che la supporti o commentare l’istruzione, nei commenti trovi altri che hanno risolto il problema in modo simile;
      2) hai un problema con l’RTC, potresti averlo collegato male, non averlo funzionante o aver connesso altro ai pin A4 ed A5. Se hai acquistato i miei stessi componenti provali con uno sketch base per RTC che trovi nel blog.

      Se non hai dimestichezza con Arduino segui il corso Base online gratuito arduino nella sezioni corsi del blog.

    • Bruno D. on 21 febbraio 2016 at 21:31
    • Reply

    Mauro volevo segnalarti che il codice che hai postato nel tuo articolo, se riportato nell’IDE di Arduino successivo alla versione arduino-1.5.6-r2-windows , da una serie di errori collegati alla libreria RTClib. Dopo infiniti errori e prove che ho effettuato leggendo il post di francesco_b evidenziava qualcosa di simile troverai tutto al link http://forum.arduino.cc/index.php?topic=333352.0. Sono interessato alla tua realizzazione che vorrei implementare con una serie di parametri ambientali (esempio esclusione in caso di pioggie abbondanti, incremento tempo di adaquamento in caso di improvvisi innalzamenti termici, differenti programmi di adacquamento attraverso notifica sms). Sono un Agronomo, con l’hobby della coltivazione degli ortaggi, non potendo intervenire giornamente sulla centralina per problemi di distanza dall’abitazione e con davvero poco tempo libero a disposizione, volevo utilizzare la tua idea e personalizzarla alle mie necessità. La domanda che fondamentale che ti pongo è questa, completando la compilazione con la versione arduino-1.5.6-r2-windows, nel momento che trasferisco il tutto alla board cosa succede? Non l’ho potuto testare perchè non dispongo ancora di board, non ho ancora completato il progetto, e dopo tante prove e tanto studio acquisterò il necessario.

    1. Ciao Bruno,
      grazie per il link ed i suggerimenti, spesso con le versioni nuove dell’IDE alcune librerie fanno i capricci 🙂
      Purtroppo non posso ripetere tutti i miei progetti con ogni nuova versione dell’IDE.

      Se ho capito la domanda la risposta è dovrebbe iniziare a funzionare come descritto nell’articolo.

        • Bruno D. on 22 febbraio 2016 at 19:41
        • Reply

        Ok, se mai riuscirò a implementare con quanto mi prefiggo, ti informerò per condividere la mia esperienza. Saluti, grazie per quanto hai messo in rete, è già tanto e sopratutto in è spiegato passo-passo in italiano :).

        1. Bene Bruno, attendo fiducioso.

    • lino grieco on 29 settembre 2016 at 13:14
    • Reply

    ciao mauro…come va?
    mi sto studiando il tuo sketch per impostare la data e l’orario alla centralina d’irrigazione….

    come ti ho detto tempo fa, il mio progetto ha al suo interno qualcosa del genere….
    mi spiego meglio:
    ho settato il mio DS3232RTC e mi compare su LCD sia la data che l’ora..
    ora voglio che tra 10 giorni, a partire dalla data e ora che mi escono sul display LCD appena lancio il mio sketch, arduino faccia partire un relè che metta in moto un attuatore collegato…..senza settare però nè la data nè l’ora…il tutto deve avvenire in automatico.

    Si può fare?
    Mi puoi dare qualche dritta?

    1. Ciao Lino,
      certo, è solo necessario un ragionamento sullo sketch.
      Io procederei: memorizzo data ed ora attuali in EEPROM, valuto se sono trascorsi i giorni e do il comando in attuazione.
      Memorizzo in EEPROM xchè se capita un reset almeno recupero l’informazione.

    • lino grieco on 4 ottobre 2016 at 11:25
    • Reply

    memorizzare data ed ora in EEPROM vuol dire memorizzarli nella memoria dell’RTC nel mio caso DS3231?
    ho capito bene?
    perchè per un pivellino come me……ce ne vorrebbe da imparare di wiring!!!!

    cmq guardando un pò di forum arduino ho trovato uno sketch che fa proprio al mio caso…però va bene per il DS1307….sto provando ad adattarlo ma nn ci riesco….http://forum.arduino.cc/index.php?topic=289785.0

    il problema è forse nella funzione DateTime now = RTC.now();

    il mio RTC DS3231 rileva la data e l’ora con la funzione RTC.get….

    ho fatto dei tentativi ma credo che sia un problema di librerie diverse……nn sono ancora così ferrato…..

    nn voglio assolutamente che tu mi scriva lo sketch ma dimmi almeno cosa posso studiarmi per arrivare alla soluzione…..

    ti ringrazio per la pazienza che hai…ciao…lino

    1. Ciao Lino,
      io ho scritto articoli dedicati sia al DS1307 sia al 3231 e posso dirti che se comprendi bene la logica dello sketch le differenze sono solo sintattiche e facilmente superabili.
      Come guida puoi seguire il mio corso arduino on-line gratuito su questo stesso blog.

    • lino grieco on 5 ottobre 2016 at 11:34
    • Reply

    ciao mauro….
    da una discussione fatta sui forum di arduino ho potuto capire che la mia libreria del RTC DS3231 si poggia sulla libreria Time.h….allora mi sono andato a studiare quella….
    durante qualche lettura ho appreso anche l’esistenza della libreria TimeAlarms.h, la quale mi permette con la funzione Alarm.timerRepeat di poter accendere un allarme ogni tot secondi…..

    la sto provando per accendere un led ogni 10 sec e va bene…

    che ne pensi….la posso usare per attivare un attuatore ogni 10 giorni convertendo i 10 giorni in 864000 secondi?
    potrei avere qualche problema?

    1. Ciao Lino,
      il problema resta sempre il caso in cui si verifichi una interruzione di tensione o un reset .. tutto riparte ed hai perso il conteggio.

    • lino grieco on 5 ottobre 2016 at 14:12
    • Reply

    che domanda stupida……se va via la corrente, quando torna, arduino ricomincia a contare da capo….
    me l’avevi scritto nel post precedente….bisogna memorizzare la data e l’ora…torno a studiare

    1. Si Lino, vedi risposte precedenti.

    • lino grieco on 5 ottobre 2016 at 16:19
    • Reply

    sto iniziando a capirci qualcosa grazie al tuo tutorial sulla libreria EEPROM.h…..
    se non ci fossi tu…….!!!!
    ciao mauro…torno a studiare

    1. Grande Lino !!!
      Tutta tue e solo tua volontà

    • Maurizio on 28 ottobre 2016 at 10:54
    • Reply

    Ciao Mauro.
    Questo articolo è molto interessante, ma io posseggo un DS3231 e vorrei utilizzarlo per questo sketch.
    Quali sono le modifiche che devo fare??
    Grazie per l’aiuto.

    1. Ciao Maurizio,
      ti consiglio la lettura e comprensione degli articoli sul DS3231 in modo che ti sia facile adattarli a questo sketch.
      Le differenze oltre alla libreria dovrebbero solo riguardare i comandi con cui interroghi l’RTC DS3231

    • Domenico Marcoaldi on 19 giugno 2017 at 00:12
    • Reply

    Ciao MAuro
    volevo chiederti se c’era un modo di collegare un sensore di pioggia commerciale, quello della claber o Orbit per intenderci e come inserirlo sul progetto che hai sviluppato.

    Grazie

    Domenico

    1. Ciao Domenico,
      non conosco quel tipo d sensore.
      Si tratta di un sensore analogico o digitale? Come comunica con il micro controllore?

    • Vito on 12 dicembre 2017 at 11:48
    • Reply

    Ciao Mauro.
    Volevo chiedere se potevi dirmi dove posso trovare i schield che hai usato perché non riesco a trovarli…Grazie in anticipo

    1. Ciao Vito,
      io acquisto quasi tutto il mio materiale da robotics-3d.com

      Mauro

    • Davide on 26 giugno 2018 at 19:52
    • Reply

    Salve, mi chiamo Davide. Complimenti per tutto ciò che fa. Le volevo chiedere un aiuto per organizzare una centralina a 16 relè, con possibilità di settare le ripetizioni giornaliere e l’orario di partenza per ogni valvola, se possibile.
    Esempio:
    Valvola 1 partenza ore 6:00 ripetizioni giornaliere 28 ogni 30 minuti tempo di lavoro 1 minuto e 55 secondi
    Valvola 2 partenza ore 6:02 ripetizioni giornaliere 9 ogni 1 ora e 30 minuti tempo di lavoro 6 minuti
    Se possibile mi servirebbe cosi, sennò specificando ogni orario e tempo di lavoro
    esempio: valvola 1 partenza ore 6:00 fine lavoro ore 6:01:55
    Preferirei molto il primo metodo, sempre se possibile.
    Aspetto sue notizie.
    Grazie con anticipo.
    Cordiali saluti

    1. Ciao Davide,
      puoi modificare il codice che è rilasciato in licenza Creative Common Attribution Non commercial Share Alike e che trovi descritto in ogni sua parte.
      Se ci sono parti oscure di cui posso chiarirti il funzionamento non hai che da commentare, come hai fatto, chiedendo delucidazioni sulle righe dubbie.

      Se desideri che sia io a realizzare il progetto puoi scrivermi sulla casella info e ti farò avere le informazioni su come commissionarmi il progetto.

        • Davide on 29 giugno 2018 at 21:51
        • Reply

        Ciao Mauro.
        Perfetto grazie. Penso che la contatterò nella casella. Grazie ancora. Complimenti ancora per tutto, il sito è l’aiuto che da.

        • Davide on 13 luglio 2018 at 18:07
        • Reply

        Salve Mauro,
        ho provato a cercare il codice che mi ha consigliato ma non sono riuscito a trovarlo. Le ho anche inviato un mail ma non mi ha risposto. Dove lo posso trovare il codice?
        Grazie.
        Cordiali saluti

        1. Ciao Davide,
          il modo migliore di ricevere assistenza e suggerimenti è di certo inserire un commento nei miei articoli, le email sono riservate ai progetti su commissione e le leggo solo quando ho terminato un precedente progetto commissionato, per evitare sovrapposizioni che non potrei gestire.
          Il codice è quello presente in questo articolo, certo dovrai modificarlo dopo averlo compreso dalle mie spiegazioni.
          Ho compreso bene cosa tu stia cercando ?

            • Davide on 19 luglio 2018 at 13:55

            CiaoMauro,
            Si ti ho contattato per mail per avere un preventivo per commissionarlo a te. Perché non è per me ma per un mio amico che ha delle serre. Ah ok allora proverò a modificare, se riesco perché non ho mai fatto programmazione, il codice che trovo qui e adattarlo a come mi servirebbe. Grazie ancora.

          1. Ciao Davide,
            si ho risposto all’email ieri.
            In merito alle modifiche puoi farti dare un aiuto anche dal tuo amico che desidera avere il progetto così magari studiando in due ti sarà meno oneroso.

        • Davide on 23 agosto 2018 at 21:57
        • Reply

        Salve Mauro
        Ho quasi tutto il materiale per il progetto, ho preso arduino mega 2560 per la necessita di uscite, sto cercando di caricare il suo progetto su arduino mega ma non riesco. mi da: errore durante la compilazione. Cosa devo modificare? Inoltre dovrei aggiungere l’accensione di una pompa ad ogni apertura delle elettrovalvole, come posso fare?
        Grazie mille per il suo prezioso aiuto.

        1. Ciao Davide,
          che errore riscontri?
          Hai verificato tutto quando descritto nel mio articolo?
          Ti sono chiari tutti i passaggi di codice e le loro funzioni ?

            • Davide on 26 agosto 2018 at 16:49

            Ciao Mauro;
            l’unico errore che trovo è che mi dice exit status 1
            Errore durante la compilazione per la scheda Arduino/Genuino Mega or Mega 2560.
            Ho provato con arduino 1.0.3 e me lo carica, solo che ora non lo posso provare perché
            mi è caduto il display lcd e si è rotto e sto aspettando che mi arriva il nuovo. Le faccio sapere se funziona appena arriva il nuovo lcd. Grazie.

          1. Ok Davide, attendo le tue successive prove.

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.