In questo progetto imparerai come creare un sistema automatico di irrigazione per interni con il Arduino IoT Cloud. Questo sistema ti permette di monitorare e annaffiare le tue piante da qualsiasi parte del mondo ed è un’ottima introduzione all’internet delle cose.
Ho incluso istruzioni per la costruzione, una guida introduttiva per l’Arduino IoT Cloud e tutto il codice necessario. Questo progetto utilizza una scheda Arduino MKR1000 IoT, un sensore capacitivo di umidità del terreno, un sensore di temperatura e umidità, un LCD I2C e una pompa d’acqua. È anche possibile realizzare questo progetto con un Arduino normale (non connesso a internet).
Nota che questo è principalmente un proof of concept, cioè costruire questo sistema per una sola pianta è piuttosto costoso e probabilmente non ha molto senso. Tuttavia, ora che so come funziona tutto, posso facilmente espandere il sistema e aggiungere più funzionalità in futuro.
Se hai domande o suggerimenti, lascia un commento qui sotto.
Per maggiori informazioni su alcuni componenti usati in questo progetto, dai un’occhiata ai tutorial qui sotto:
Materiali
Componenti hardware
Nota che puoi anche usare qualsiasi altra scheda Arduino IoT con connettività Wi-Fi, come il Arduino MKR WiFi 1010 o la più economica Arduino Nano 33 IoT. Il vantaggio delle schede MKR è che si adattano all’Arduino MKR Relay Proto Shield, che rende il cablaggio molto più semplice.
Per il serbatoio dell’acqua, puoi usare qualsiasi contenitore tu abbia a disposizione (io ho usato un contenitore per alimenti IKEA dalla mia cucina).
App e servizi online
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Assemblaggio del sistema
Tutti i componenti sono collegati a una scatola centrale del progetto montata sul coperchio del contenitore IKEA.

Per montare l’Arduino MKR Relay Proto Shield, ho stampato in 3D una semplice piastra adattatrice. Un piccolo foro sul lato della scatola del progetto permette l’accesso alla porta micro USB del MKR1000, usata per alimentare il sistema e programmare la scheda.

Sensore di umidità del terreno
Per questo progetto ho usato un capacitive soil moisture sensor con uscita analogica. I sensori capacitivi hanno una migliore resistenza alla corrosione rispetto a quelli resistivi, ma non sono completamente impermeabili. Essendo realizzati con un PCB standard con substrato composito, l’acqua può facilmente entrare dai lati del PCB. L’elettronica sulla parte superiore del sensore non è protetta dall’acqua in alcun modo.
Per rendere il sensore un po’ più impermeabile, ho rivestito i bordi e l’elettronica con dello smalto trasparente per unghie. Un vero rivestimento conformale sarebbe probabilmente migliore, ma lo smalto funziona abbastanza bene come alternativa economica.

Il cavo fornito con il sensore era piuttosto corto, quindi ne ho realizzato uno nuovo. Puoi anche semplicemente saldare fili più lunghi al cavo originale.

Collegamento del sensore di umidità del terreno all’Arduino MKR1000
La tabella qui sotto mostra quali collegamenti devi effettuare.
| Sensore di umidità del terreno | Arduino MKR1000 |
|---|---|
| GND | GND |
| VCC | 3.3 V |
| AOUT | A2 |
Pompa e shield relè

Per annaffiare le piante, ho usato una small submersible pump che può essere alimentata a 3.3 V. La pompa è controllata dal relè 1 del Arduino MKR Relay Proto Shield. Poiché la pompa assorbe solo circa 200 mA, può essere alimentata direttamente dall’uscita 3.3 V del MKR1000.
Se vuoi usare una pompa più grande, devi usare un’alimentazione esterna. Assicurati che la corrente della pompa rientri nelle specifiche dei relè.

Il filo nero della pompa è collegato a massa. Il filo rosso va al lato NO (normalmente aperto) del relè. COM è collegato all’uscita 3.3 V del MKR1000. Nota che questo 3.3 V è disponibile su uno dei morsetti a vite dello Shield.
Sensore di temperatura e umidità

Anche se non strettamente necessario per annaffiare automaticamente le piante, ho pensato che un sensore di temperatura e umidità fosse un’aggiunta utile al sistema. Per questo progetto ho usato un AM2301A sensor che viene fornito in un involucro con i fili già collegati. Questo sensore è prodotto da ASAIR, che realizza anche i molto popolari sensori DHT11 e DHT22.
Per maggiori informazioni sui sensori di temperatura e umidità DHT, dai un’occhiata al tutorial qui sotto:
Collegamento del sensore di temperatura e umidità AM2301A
La tabella qui sotto mostra quali collegamenti devi effettuare.
| Sensore di temperatura e umidità AM2301A | Arduino MKR1000 |
|---|---|
| Nero | GND |
| Rosso | 3.3 V |
| Giallo | A1 |
Ho montato il sensore sul lato della scatola del progetto. Nota che ho praticato un piccolo foro nella scatola e sul retro del sensore per far passare i fili.

LCD I2C
Oltre all’Arduino IoT Cloud, i dati dei sensori sono anche visualizzati sul display LCD I2C 20×4 montato sul coperchio della scatola del progetto.

Ho tagliato un’apertura nella scatola del progetto usando my homemade CNC router, ma potresti usare anche un seghetto alternativo o un taglierino affilato.

L’LCD di solito è alimentato a 5 V ma sembra funzionare bene anche a 3.3 V. Grazie al modulo I2C montato sul retro dell’LCD, devi collegare solo due fili, SDA e SCL, al MKR1000. I collegamenti sono disponibili ai morsetti a vite dello shield, quindi il cablaggio del display è molto semplice.
Collegamenti LCD I2C
| LCD I2C 20×4 caratteri | Arduino MKR1000 |
|---|---|
| GND | GND |
| VCC | 3.3 V |
| SDA | SDA |
| SCL | SCL |
Ho scritto un tutorial dettagliato sull’uso degli LCD I2C con Arduino che puoi trovare qui:
Nota sul cablaggio
Come avrai notato, tutti i sensori, l’LCD e la pompa devono essere collegati a 3.3 V e GND. L’Arduino MKR Relay Proto Shield ha una sola uscita di alimentazione e infilare tutti i fili in un solo morsetto a vite non è una buona idea. Invece, puoi usare qualcosa come Wago lever nuts come punto di distribuzione dell’alimentazione.
Il tubo dell’acqua
Inizialmente, avevo pianificato di infilare semplicemente l’estremità del tubo in PVC da qualche parte nel mezzo del vaso. Tuttavia, ho scoperto che questo lasciava una parte del vaso bagnata e il resto completamente asciutto.
La mia soluzione è stata di praticare molti piccoli fori (1 mm) distanziati di circa 2 cm negli ultimi 30-40 cm del tubo. Ho stampato in 3D un tappo per l’estremità del tubo e alcuni supporti da infilare nel terreno.
Puoi scaricare i file STL qui se vuoi stampare i tuoi:

Questo sembra funzionare abbastanza bene per bagnare il terreno in modo uniforme.

Iniziare con Arduino IoT Cloud
Nella sezione successiva spiegherò come iniziare con Arduino IoT Cloud.
Il primo passo è andare su https://create.arduino.cc/. Su questa pagina web troverai il Web Editor, una guida introduttiva, il Device Manager e un link ad Arduino IoT Cloud.

Installazione del plugin Arduino Create
Ci sono diversi modi per configurare una nuova scheda, ma trovo più semplice farlo tramite la pagina Getting Started. Clicca sull’icona Getting Started e scorri fino in fondo alla pagina dove c’è scritto Install Arduino Create Plugin. Questo plugin ti permette di caricare sketch dall’Arduino Web Editor alla tua scheda o dispositivo.

Dopo aver cliccato sull’icona Arduino Create Plugin in fondo alla pagina, clicca su start, scarica e installa il plugin. Il wizard di configurazione verificherà se il plugin è stato installato correttamente. Se sì, vedrai la pagina qui sotto.

Configurazione di una scheda IoT
Ora torna alla pagina Getting Started cliccando sull’icona in alto. Il passo successivo è configurare una nuova scheda IoT. Per questo progetto ho usato l’Arduino MKR1000. Se non sei sicuro del nome della tua scheda, puoi cliccare sull’icona Autodetect Arduino Board.

Si aprirà il wizard di configurazione IoT che ti guiderà nella configurazione e nel test della scheda.

Clicca su start e collega la scheda al computer con un cavo USB. Se hai installato correttamente il plugin Arduino Create, il computer dovrebbe rilevare il dispositivo.

Poi dai un nome alla tua scheda. Io l’ho chiamata semplicemente MKR1000_1. Assicurati di usare un nome facile da riconoscere, soprattutto se usi più schede per progetti diversi.

Dopo questo, il chip crittografico del MKR1000 deve essere configurato, operazione che richiede fino a 5 minuti. Ogni MKR1000 è dotato di un Microchip ECC508 crypto chip. Questo chip serve a memorizzare in modo sicuro l’identità della tua scheda quando è collegata al tuo account Arduino.

Successivamente, puoi caricare uno sketch di esempio che ti permetterà di testare la funzionalità della scheda e accendere o spegnere il LED integrato tramite il Network Monitor. Nella scheda Secret dello sketch devi inserire il nome e la password della tua rete wifi locale.

Nella pagina successiva clicca sul carattere LED per accendere o spegnere il LED integrato.

Se tutto è andato bene, dovresti vedere la pagina qui sotto.

Creare un nuovo Thing
Dopo aver configurato un nuovo dispositivo IoT, puoi tornare alla dashboard di Arduino Create e cliccare sull’icona Arduino IoT Cloud.

Cliccando su questa icona si aprirà la pagina “Your Things” di Arduino IoT Cloud. Qui puoi creare nuovi Things, che è come Arduino chiama i dispositivi connessi a internet. Nel nostro caso, il Thing rappresenta la scheda Arduino MKR1000 con più sensori collegati. Ogni Thing può avere più proprietà come temperatura, stato di un LED, coordinate GPS, ecc.
Nella versione gratuita dell’IoT Cloud puoi creare solo un Thing con fino a cinque proprietà. Se vuoi di più, devi passare al piano a pagamento. Poiché questo progetto usa un solo Thing con meno di cinque proprietà, il piano gratuito va benissimo.

Clicca su ADD NEW THING e dagli un nome. Io l’ho chiamato Automatic_indoor_garden. Seleziona la scheda MKR1000 che abbiamo appena configurato dal menu a tendina (MKR1000_1).

Ora verrai reindirizzato a una pagina dove puoi aggiungere proprietà al tuo Thing.

Aggiunta delle proprietà
Per questo progetto ho aggiunto tre proprietà diverse: temperatura, umidità e contenuto di umidità del terreno. Le proprietà rappresentano variabili nel codice Arduino e sono anche leggibili nel Cloud. Dopo aver creato le proprietà e caricato il codice, potrai vederle nella dashboard del tuo Thing.
Aggiungere proprietà è molto semplice cliccando su ADD PROPERTY. Nota che devi ripetere questa operazione tre volte.
Per ogni proprietà devi impostare i seguenti parametri:
- Nome – il nome che sarà mostrato nella lista delle proprietà e nel widget.
- Nome Variabile – il nome della variabile che userai nello Sketch per riferirti a questa proprietà. Non può contenere caratteri speciali.
- Tipo – seleziona il tipo corretto della proprietà. Aggiungi il minimo e massimo per misurazioni numeriche, per disegnare correttamente il widget.
- Permessi
- Lettura & Scrittura : la proprietà può essere sia impostata che mostrata nella dashboard di Arduino IoT Cloud.
- Sola Lettura : la proprietà sarà inviata ad Arduino IoT Cloud e sarà disponibile nella tua dashboard.
- Aggiornamento
- Quando il valore cambia : la proprietà sarà inviata ad Arduino IoT Cloud ogni volta che la variazione del valore è maggiore o uguale al delta.
- Regolarmente : la proprietà sarà inviata ad Arduino IoT Cloud ogni volta che trascorre il numero specificato di secondi.
- Storico – Mostra una visualizzazione dei dati storici per la proprietà.
Nell’immagine sotto puoi vedere quali parametri ho usato per la proprietà Temperatura. Nota che puoi selezionare uno dei tanti tipi di proprietà predefiniti come Temperatura (Celsius) oppure crearne uno personalizzato.

Puoi trovare i parametri per le altre proprietà nella tabella qui sotto
Parametri delle proprietà del Thing
| Nome | Variabile Nome | Tipo | Permessi | Aggiornamento |
|---|---|---|---|---|
| Temperatura | temperature | Temperatura (Celsius) -20 °C – 60 °C | RO | Ogni 10s |
| Umidità | humidity | Umidità Relativa (Percentuale) 0 RH – 100 RH | RO | Ogni 10s |
| Contenuto di umidità del terreno | soilMoistureContent | Float 0 – 100 | RO | Ogni 1s |
Se selezioni mostra visualizzazione storico, puoi registrare i valori delle proprietà per un certo periodo e salvarli come grafici. Purtroppo, nella versione gratuita di Arduino IoT Cloud puoi salvare i dati solo per 1 giorno.

Dopo aver aggiunto tutte le proprietà clicca su EDIT SKETCH. Questo aprirà l’Arduino Web Editor.
Crea sketch
Dopo aver cliccato su EDIT SKETCH vedrai che uno sketch nuovo è stato creato automaticamente.

Nota che lo sketch ha lo stesso nome del nostro Thing più la data di creazione. Oltre a questo file .ino, vedrai altri tre file:
ReadMe.adoc : questo è un file di testo semplice dove puoi aggiungere informazioni sull’autore e sul progetto.
thingProperties.h : questo file è generato automaticamente da Arduino IoT Cloud quando aggiungi proprietà al tuo Thing. In generale, non dovresti modificare tu stesso il codice in questo file. Viene aggiornato automaticamente quando cambi le proprietà del Thing nella dashboard.
Consulta la pagina IoT Cloud – Getting Started sull’Arduino Project Hub per una spiegazione più dettagliata sulle diverse funzioni in thingProperties.h.

Secret: questa scheda ti permette di inserire le credenziali di rete. SECRET_SSID e SECRET_PASS sono il nome e la password della rete wifi a cui il MKR1000 si connetterà. Dopo aver inserito questi dati, clicca su salva.

Codice Arduino
I file generati automaticamente rendono abbastanza semplice iniziare con l’IoT Cloud, ma ovviamente devi comunque scrivere un po’ di codice da solo.
Nel sketch principale, non in thingProperties.h, ho aggiunto codice che legge i sensori, controlla la pompa d’acqua e visualizza le informazioni sull’LCD I2C.
Puoi sostituire il codice nel sketch principale con quello qui sotto. Collega la scheda MKR1000 al computer se non l’hai già fatto e carica il codice cliccando sul pulsante di upload (freccia a destra in alto). Ti consiglio di scollegare la pompa per ora e lasciare installati solo i sensori.
Ora spiegherò come funziona il codice e ti mostrerò come modificare alcuni parametri.
Puoi copiare il codice cliccando sul pulsante in alto a destra nel campo del codice.
/*
Sketch for automatic indoor garden project. More info: https://www.makerguides.com
Arduino IoT Cloud Properties description
The following variables are automatically generated and updated when changes are made to the Thing properties
float soilMoistureContent;
float humidity;
float temperature;
Properties which are marked as READ/WRITE in the Cloud Thing will also have functions
which are called when their values are changed from the Dashboard.
These functions are generated with the Thing and added at the end of this sketch.
*/
#include "thingProperties.h"
#include "DHT.h"
#include "LiquidCrystal_I2C.h"
#define DHTPIN A1
#define DHTTYPE DHT21
#define RELAYPIN 1
#define SOILPIN A2
DHT dht = DHT(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4);
const unsigned long pumpPeriod = 20000;
const unsigned long waitPeriod = 120000;
unsigned long previousMillis;
float moistureSensorData;
void setup() {
// Initialize serial and wait for port to open:
Serial.begin(9600);
// This delay gives the chance to wait for a Serial Monitor without blocking if none is found
delay(1500);
// Defined in thingProperties.h
initProperties();
// Connect to Arduino IoT Cloud
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
/*
The following function allows you to obtain more information
related to the state of network and IoT Cloud connection and errors
the higher number the more granular information you’ll get.
The default is 0 (only errors).
Maximum is 4
*/
setDebugMessageLevel(4);
ArduinoCloud.printDebugInfo();
pinMode(LED_BUILTIN, OUTPUT);
pinMode(RELAYPIN, OUTPUT);
dht.begin();
lcd.init();
lcd.backlight();
}
void loop() {
ArduinoCloud.update();
// Your code here
temperature = dht.readTemperature();
humidity = dht.readHumidity();
lcd.setCursor(0, 0);
lcd.print("Temperature:");
lcd.setCursor(13, 0);
lcd.print(temperature);
lcd.print("\xDf" "C");
lcd.setCursor(0, 1);
lcd.print("Humidity:");
lcd.setCursor(10, 1);
lcd.print(humidity);
lcd.print("%");
moistureSensorData = analogRead(SOILPIN);
//Serial.println(moistureSensorData);
soilMoistureContent = map(moistureSensorData, 883, 469, 0, 100);
soilMoistureContent = constrain(soilMoistureContent, 0, 100);
lcd.setCursor(0, 2);
lcd.print("Soil moisture:");
lcd.setCursor(15, 2);
lcd.print(soilMoistureContent, 0);
lcd.print("% ");
if (soilMoistureContent <= 30 && millis() - previousMillis >= waitPeriod) {
digitalWrite(RELAYPIN, HIGH);
digitalWrite(LED_BUILTIN, HIGH);
delay(pumpPeriod);
digitalWrite(RELAYPIN, LOW);
digitalWrite(LED_BUILTIN, LOW);
previousMillis = millis();
}
}
Come funziona il codice
Nella sezione loop del codice, temperatura e umidità sono letti con dht.readTemperature() e dht.readHumidity() rispettivamente. Le variabili temperature e humidity sono state aggiunte automaticamente in thingProperties.h e i loro valori saranno inviati al cloud ogni 10 secondi.
La sezione successiva del codice stampa i valori sull’LCD I2C.
lcd.setCursor(0, 0);
lcd.print("Temperature:");
lcd.setCursor(13, 0);
lcd.print(temperature);
lcd.print("\xDf" "C");
lcd.setCursor(0, 1);
lcd.print("Humidity:");
lcd.setCursor(10, 1);
lcd.print(humidity);
lcd.print("%");
Poi viene letta l’uscita analogica del sensore di umidità del terreno con analogRead(). Questo valore viene poi scalato tra 0 e 100 % di umidità. Per calibrare il sensore, puoi stampare i dati nel Serial Monitor. Il valore 833 corrisponde a quando il sensore è tenuto in aria e 469 quando è immerso in un bicchiere d’acqua.
moistureSensorData = analogRead(SOILPIN);
//Serial.println(moistureSensorData);
soilMoistureContent = map(moistureSensorData, 883, 469, 0, 100);
soilMoistureContent = constrain(soilMoistureContent, 0, 100);
lcd.setCursor(0, 2);
lcd.print("Soil moisture:");
lcd.setCursor(15, 2);
lcd.print(soilMoistureContent, 0);
lcd.print("% ");
Nell’ultima parte del codice controllo se il contenuto di umidità del terreno è sotto il 30 % e, in tal caso, le piante vengono annaffiate per una durata prestabilita. Ho aggiunto un tempo minimo di attesa tra i cicli di irrigazione per dare al terreno il tempo di assorbire l’acqua.
if (soilMoistureContent <= 30 && millis() - previousMillis >= waitPeriod) {
digitalWrite(RELAYPIN, HIGH);
digitalWrite(LED_BUILTIN, HIGH);
delay(pumpPeriod);
digitalWrite(RELAYPIN, LOW);
digitalWrite(LED_BUILTIN, LOW);
previousMillis = millis();
}
Probabilmente dovrai regolare i parametri pumpPeriod e waitPeriod in cima al codice per adattarli al tuo setup.
Creare una dashboard
Dopo aver caricato il codice, clicca su GO TO IOT CLOUD. Ora clicca su Dashboards in alto.

Quando sei su questa pagina, clicca su create dashboard. Puoi aggiungere widget alla tua dashboard per mostrare valori, grafici, ecc.

Clicca sul widget e seleziona Link Property

Ora seleziona quale proprietà vuoi visualizzare.

Dopo aver aggiunto più widget, la tua dashboard dovrebbe assomigliare a questa:

Conclusioni
In questo articolo ti ho mostrato come creare un semplice sistema di irrigazione automatico con MKR1000 e Arduino IoT Cloud. Spero che questo tutorial ti sia stato utile e ti abbia dato qualche spunto.
Nell’attuale configurazione, Arduino IoT Cloud è usato solo per visualizzare e registrare i dati dei sensori. Quindi potresti anche realizzare questo come sistema standalone con un Arduino Uno o simile. Personalmente volevo solo sperimentare con Arduino IoT Cloud e vedere quanto fosse difficile configurarlo. È stato molto più semplice di quanto pensassi e sicuramente lo userò per altri progetti in futuro.
Ho fatto funzionare questo sistema per un breve periodo e sembra funzionare molto bene. Farò un aggiornamento tra un mese circa, dopo averlo testato più a lungo.
Una cosa che potrei aggiungere in futuro è un interruttore di livello dell’acqua per il serbatoio e collegarlo a un sistema di allerta via email. Temo che dimenticherò di riempire il serbatoio ora che non devo più pensare all’irrigazione delle piante…
Se hai domande o suggerimenti, lascia un commento qui sotto.


