Irrigazione arduino – prima parte

Inizio oggi un nuovo progetto di irrigazione arduino in attesa della primavera e del momento in cui dovrai irrigare e monitorare lo stato del tuo giardino.

irrigazione arduino

Hai letto bene monitorare lo sttao del terreno e le attività eseguite dall’impianto.

E’ proprio da questo aspetto che inizia il progetto irrigazione arduino che puoi realizzare seguendo questa serie di articoli.

Il progetto irrigazione arduino raccogliere i dati

Questa prima parte ti mostro come inviare i dati raccolti dai sensori e le informazioni dell’impianto ad un DataBase Web in cui registrarli per poterli visualizzare in seguito sottoforma di tabella o grafico secondo le tue esigenze.

Il materiale necessario

I componenti iniziali per la prima parte del progetto sono:

  • n.1 arduino (Uno,Due,Leonardo,Mega)
  • n.1 ethernet shield
  • n.1 cavo di rete ethernet
  • n.1 connessione a internet con DHCP
  • n.1 server LAMP (  Linux Apache MySql Php )

Nella foto ho inserito volontariamente due sensori che utilizzerai per le prossime evoluzioni del progetto, si tratta di un sensore per misurare temperatura ed umidità:

irrigazione arduino sensore umidita

e di un sensore che misura l’umidità del terreno:

irrigazione arduino sensore terreno

ci sono molti altri sensori che potrai aggiungere al tuo progetto e per questo ho deciso di collezionare 16 valori nel mio progetto, inizialmente ne userai meno di quelli previsti per registrare temperatura, umidità dell’aria e del terreno, ma in seguito potrai aggiungere sensori di luminosità, vento, pioggia o di controllo di funzionamento dell’impianto, e i 16 input ti saranno molto utili.

La tabella di raccolta dati MySql

Parti dalla creazione della tabella che registrerà i dati, per farlo utilizza questa istruzione SQL:

DROP TABLE IF EXISTS `monitoraggio_irrigazione`;
CREATE TABLE IF NOT EXISTS `monitoraggio_irrigazione` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data_time` datetime NOT NULL,
  `ip_remote` varchar(16) NOT NULL,
  `codice_impianto` varchar(32) NOT NULL,
  `sensoreA` float DEFAULT NULL,
  `sensoreB` float DEFAULT NULL,
  `sensoreC` float DEFAULT NULL,
  `sensoreD` float DEFAULT NULL,
  `sensoreE` float DEFAULT NULL,
  `sensoreF` float DEFAULT NULL,
  `sensoreG` float DEFAULT NULL,
  `sensoreH` float DEFAULT NULL,
  `sensoreI` float DEFAULT NULL,
  `sensoreL` float DEFAULT NULL,
  `sensoreM` float DEFAULT NULL,
  `sensoreN` float DEFAULT NULL,
  `sensoreO` float DEFAULT NULL,
  `sensoreP` float DEFAULT NULL,
  `sensoreQ` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `codice_impianto` (`codice_impianto`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Monitoraggio Irrigazione' AUTO_INCREMENT=1;

il risultato visto con PhpMyAdmin dovrebbe essere simile al seguente:

irrigazione arduino tabella

Ho aggiunto nella tabella alcuni valori che non passerai da arduino, per non sovraccaricare il progetto ma che lasceremo aggiungere al server, tali valori sono:

  • data_time
  • ip_remote

Il primo valore colleziona la data e l’ora del record inserito in tabella, il secondo valore ti riporta l’IP del client che ha inserito il dato, l’arduino.

Le colonne da A a Q memorizzeranno i valori dei 16 sensori.

Lo script Php del progetto irrigazione arduino

Sul server LAMP su cui è presente il DataBase MySql che utilizzi per raccogliere i dati dovrai aggiungere anche una pagina Php con il seguente codice:

<?php
/*****************************************************/

/** Nome utente del database MySQL */
define('DB_USER', 'USERNAME');
/** Password del database MySQL */
define('DB_PASSWORD', 'PASSWORD');
/** Hostname MySQL  */
define('DB_HOST', 'localhost');
/** DataBase MySQL  */
define('DB_NAME', 'DATABASE');
/** Table MySQL  */
define('DB_TABLE', 'monitoraggio_irrigazione');

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

$_path_info = array();

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

if ( !empty($_SERVER['PATH_INFO'])) {
        $_path_info = explode( '/',$_SERVER['PATH_INFO'] );
} else {
        die( "ERROR001" );
}

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

$codice         = $_path_info[1];
$sensoreA       = $_path_info[2];
$sensoreB       = $_path_info[3];
$sensoreC       = $_path_info[4];
$sensoreD       = $_path_info[5];
$sensoreE       = $_path_info[6];
$sensoreF       = $_path_info[7];
$sensoreG       = $_path_info[8];
$sensoreH       = $_path_info[9];
$sensoreI       = $_path_info[10];
$sensoreL       = $_path_info[11];
$sensoreM       = $_path_info[12];
$sensoreN       = $_path_info[13];
$sensoreO       = $_path_info[14];
$sensoreP       = $_path_info[15];
$sensoreQ       = $_path_info[16];

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

@mysql_connect(DB_HOST,DB_USER,DB_PASSWORD) or die( "ERROR002" );
@mysql_select_db(DB_NAME) or die( "ERROR003" );

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

$sql="INSERT INTO " . DB_TABLE . "(
                                                                        data_time,
                                                                        ip_remote,
                                                                        codice_impianto,
                                                                        sensoreA,
                                                                        sensoreB,
                                                                        sensoreC,
                                                                        sensoreD,
                                                                        sensoreE,
                                                                        sensoreF,
                                                                        sensoreG,
                                                                        sensoreH,
                                                                        sensoreI,
                                                                        sensoreL,
                                                                        sensoreM,
                                                                        sensoreN,
                                                                        sensoreO,
                                                                        sensoreP,
                                                                        sensoreQ
                                                                  ) VALUES (
                                                                        NOW(),
                                                                        '" . $_SERVER['REMOTE_ADDR'] . "',
                                                                        '" . $codice . "',
                                                                        '" . $sensoreA . "',
                                                                        '" . $sensoreB . "',
                                                                        '" . $sensoreC . "',
                                                                        '" . $sensoreD . "',
                                                                        '" . $sensoreE . "',
                                                                        '" . $sensoreF . "',
                                                                        '" . $sensoreG . "',
                                                                        '" . $sensoreH . "',
                                                                        '" . $sensoreI . "',
                                                                        '" . $sensoreL . "',
                                                                        '" . $sensoreM . "',
                                                                        '" . $sensoreN . "',
                                                                        '" . $sensoreO . "',
                                                                        '" . $sensoreP . "',
                                                                        '" . $sensoreQ . "'
                                                                  )";

@mysql_query($sql) or die( "ERROR004" );

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

@mysql_close();
die( "SUCCESS" );
?>

la cui funzione è di salvare i valori passati dal progetto irrigazione arduino nella Url del browser.

In pratica dopo aver salvato la pagine con il nome saveData.php nel path del server che ritieni opportuno richiamala dal browser con l’Url:

https://www.mauroalfieri.it/progetto_irrigazione/saveData.php/123456/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0

dovrai sostituire il nome a dominio “mauroalfieri.it” con il nome del tuo server ed il percorso “progetto_irrigazione” con il percorso della tua pagina sul server.

irrigazione arduino url test

Dopo aver richiamato la pagina di test dal browser dovresti ottenere in tabella il seguente record:

irrigazione arduino primo valore in tabella

ora sai che la tua pagina funziona e che i valori passati nell’Url vengono correttamente salvati nella tabella sul server.

Lo sketch di irrigazione con Arduino

In questo primo sketch ti concentrerai solo sulla connessione di Arduino al sito web e l’invio dei valori, tralascerai i valori passati che saranno fissati nello sketch e non misurati da veri sensori.

Ho scritto molti altri tutorial su come leggere valori da sensori di differente natura e potrai integrare gli sketch di lettura con questo di comunicazione ethernet.

 /*
  * Progetto Irrigazione Arduino - prima parte
  *
  * Autore: Alfieri Mauro
  * Twitter: @mauroalfieri
  *
  * Tutorial su: https://www.mauroalfieri.it
  *
  */

#include <SPI.h>
#include <Ethernet.h>

#define TIME_MISURA 60000

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "www.mauroalfieri.it";
char buffer[150];

char codiceImpianto[32] = "1234567890123456789012345678901";
int sensoreA = 0;
int sensoreB = 0;
int sensoreC = 0;
int sensoreD = 0;
int sensoreE = 0;
int sensoreF = 0;
int sensoreG = 0;
int sensoreH = 0;
int sensoreI = 0;
int sensoreL = 0;
int sensoreM = 0;
int sensoreN = 0;
int sensoreO = 0;
int sensoreP = 0;
int sensoreQ = 0;

EthernetClient client;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  delay(1000);
}

void loop() {
  sensoreA = 1;
  sensoreB = 1;
  sensoreC = 1;
  sensoreD = 1;
  sensoreE = 1;
  sensoreF = 1;
  sensoreG = 1;
  sensoreH = 1;
  sensoreI = 1;
  sensoreL = 1;
  sensoreM = 1;
  sensoreN = 1;
  sensoreO = 1;
  sensoreP = 1;
  sensoreQ = 1;

  send2server();
  delay( TIME_MISURA );
}

void send2server() {
  Serial.println("connecting...");

  if (client.connect(server, 80)) {
    Serial.println("connected");
    sprintf(buffer, "%s%s%s/%s/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d %s", "GET http://", server, "/progetto_irrigazione/saveData.php", codiceImpianto, sensoreA, sensoreB, sensoreC, sensoreD, sensoreE, sensoreF, sensoreG, sensoreH, sensoreI, sensoreL, sensoreM, sensoreN, sensoreO, sensoreP, sensoreQ, "HTTP/1.1" );
    Serial.println( buffer );

    client.println(buffer);
    client.println();
  }

  while (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }
}

Ci sono alcune parti dello sketch che riguardano la configurazione:

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char server[] = "www.mauroalfieri.it";

La linea 16 contiene il Mac Address che devi sostituire con il Mac della tua scheda, lo trovi scritto sull’adesivo attaccatto sotto la Ethernet Shield;

linea 17: è il nome del server su cui hai inserito la pagina php che accetta i dati da salvare sul sever;

Ci sono anche altre 2 righe da personalizzare:

char codiceImpianto[32] = "1234567890123456789012345678901";

linea 20: è un parametro che ti permette di utilizzare il progetto di irrigazione arduino con più centraline dislocate in giardino ad ognuna potrai assegnare un codice composto da 33 digit che lo contraddistingue.

L’altra linea dello sketch da personalizzare è la linea 80:

sprintf(buffer, "%s%s%s/%s/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d %s", "GET http://", server, "/progetto_irrigazione/saveData.php", codiceImpianto, sensoreA, sensoreB, sensoreC, sensoreD, sensoreE, sensoreF, sensoreG, sensoreH, sensoreI, sensoreL, sensoreM, sensoreN, sensoreO, sensoreP, sensoreQ, "HTTP/1.1" );

in cui dovrai sostituire il path ( percorso ) presente: /progetto_irrigazione/saveData.php con il percorso su cui è presente la pagina php sul tuo server.

Delle altre linee voglio sottolineare la funzione delle seguenti:

linea 14: impostazione del TIME_MISURA ossia il tempo che deve trascorrere tra una misurazione e la successiva, si traduce nello sketch nel tempo di attesa tra un loop() ed il successivo.

linea 37: inizializzazione del client ethernet necessario a creare la connessione ed inviare i dati di irrigazione arduino alla pagina web;

linee 55-69: è la parte dello sketch in cui tutti i 16 valori dei sensori sono impostati a 1, serve solo per testare la parte di invio del dato al server, non legge nessun valore reale dai sensori;

linea 71: richiami la funzione send2server() che ha il compito di connettersi, gestire la connessione ed il risultato e trasmettere i valori dei 16 sensori alla pagina Php e quindi al server;

linea 72: imposta il tempo di attesa tra un eseguzione del loop() ed il successivo;

linea 78: l’oggetto client esegue la connessione al server mediante il metodo connect( server, porta );

linea 80: componi la linea che invierà i dati del progetto irrigazione arduino al server;

linea 83: invia la stringa composta alla linea 80 al server grazie al metodo client.prinln( buffer );

linea 87: gestisci il ritorno proveniente dalla connessione al server, il ciclo while ti garantisce di leggere tutti i valori presenti nella risposta proveniente dal server;

linea 92: gestisci la disconnessione del client dopo aver salvato i parametri dei sensori sul server e ricevuto i dati di risposta;

linea 95: chiusi la connessione tra il progetto irrigazione arduino ed il server.

Avrai già capito che indipendentemente da questo progetto irrigazione arduino potrai utilizzare questo progetto in tutti quei casi in cui vorrai trasmettere ad un web server LAMP i valori di 16 sensori o 16 azioni che rilevi con arduino.

Se il tuo sketch è correttamente configurato dovresti aver ottenuto sul database questo risultato:

irrigazione arduino record in tabella

Buona irrigazione arduino !!!

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/irrigazione-arduino-prima-parte.html

123 pings

Skip to comment form

  1. […] precedente articolo dedicato all’irrigazione arduino hai imparato a condividere i valori rilevati da arduino su […]

  2. […] settimane fa ho pubblicato il progetto Irrigazione arduino che si collega al precedente: irrigazione con arduino ma a cosa serve un progetto di irrigazione […]

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.