«

»

Lug 31

Stampa Articolo

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 !!!

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/centralina-irrigazione-arduino-imposta-orario.html

41 comments

Vai al modulo dei commenti

  1. Alessandro

    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. Mauro Alfieri

      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. Alessandro

    è 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. Mauro Alfieri

      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. Alessandro

    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. Mauro Alfieri

      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

  4. cristiano

    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. Mauro Alfieri

      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

  5. Luciano

    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. Mauro Alfieri

      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.

  6. Enzo

    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. Mauro Alfieri

      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.

  7. Andrea

    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. Mauro Alfieri

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

  8. Andrea

    Mi potresti aiutare

    1. Mauro Alfieri

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

      1. Andrea

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

        1. Mauro Alfieri

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

          1. Andrea

            Ok grazie

  9. Vincenzo

    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. Mauro Alfieri

      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.

  10. Bruno D.

    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. Mauro Alfieri

      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.

      1. Bruno D.

        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. Mauro Alfieri

          Bene Bruno, attendo fiducioso.

  11. lino grieco

    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. Mauro Alfieri

      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.

  12. lino grieco

    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. Mauro Alfieri

      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.

  13. lino grieco

    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. Mauro Alfieri

      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.

  14. lino grieco

    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. Mauro Alfieri

      Si Lino, vedi risposte precedenti.

  15. lino grieco

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

    1. Mauro Alfieri

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

  16. Maurizio

    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. Mauro Alfieri

      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

  17. Domenico Marcoaldi

    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. Mauro Alfieri

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

  18. Vito

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

    1. Mauro Alfieri

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

      Mauro

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>