Realizziamo uno smart planter monitor IoT con Arduino

In questo articolo vediamo come utilizzare Arduino realizzare uno smart planter monitor low cost al fine di monitorare lo stato di salute dei nostri fiori.

Alcuni giorni fa in questo post abbiamo visto come configurare un dispositivo utilizzando la piattaforma Arduino IoT Cloud. Riprendiamo quindi da dove eravamo rimasti.

Funzioni

La nostra fioriera intelligente sarà in grado di rilevare temperatura, umidità e luminosità dell’ambiente oltre allo stato del terriccio. In più riceveremo messaggi testuali sull’app mobile ogni qualvolta uno di questi valori scende sotto una soglia di tolleranza.

Hardware

Per il nostro progetto ci occorreranno:

  • Scheda Arduino con connessioni WiFi (io sto utilizzando una MKR1000)
  • Breadboard
  • Due resistori
  • Fotoresistenza
  • Sensore DHT11
  • Cavi jumper

Realizziamo lo smart planter monitor con Arduino

Accediamo ad Arduino IoT Cloud da Arduino Create e creiamo una nuova “thing”, collegandola alla nostra scheda. Le proprietà di riferimento (con relativa variabile) saranno le seguenti:

smart planter monitor arduino
  • Humidity, di tipo float;
  • Temperature, di tipo float;
  • Luce, di tipo int;
  • Water, di tipo int;
  • Umore della pianta, di tipo char.

La dashboard invece andrà configurata così:

arduino dashboard
  • Widget di tipo value (rinominato “Terreno”) al quale collegare Water;
  • Widget di tipo value (rinominato “Temperatura”) al quale collegare Temperature;
  • Widget di tipo value (rinominato “Luminosità”) al quale collegare Luce;
  • Widget di tipo percentage (rinominato “Umidità”) al quale collegare Humidity;
  • Widget di tipo messenger (rinominato “Umore della pianta”) al quale collegare Umore della pianta.

Circuito

smart planter monitor circuito

Qui vediamo il circuito per la scheda Arduino MKR1000. I pin analogici A0 e A1 sono utilizzati per leggere rispettivamente il valore di luce ambientale dalla fotoresistenza e quello di umidità del terriccio direttamente dalla fioriera. I due cavi jumper verdi, in particolare, andranno infilati direttamente nel vaso (utilizzando il connettore maschio): in questo modo andremo a leggere il valore di resistenza della terra: questa meno sarà umida e più fatica farà la corrente a transitare, restituendo di conseguenza un valore analogico proporzionale a questo dato.

Al pin digitale 6 è stato collegato un sensore DHT11, che andremo a gestire grazie ad una libreria per ottenere temperatura e umidità dell’ambiente intorno alla fioriera. Questi dispositivi di solito sono inclusi negli starter kit di Arduino ed hanno 3 pin: due per l’alimentazione e uno per il segnale.

Codice

Andiamo ad analizzare lo sketch che Arduino Create ci genera in automatico.

#include <ArduinoIoTCloud.h>
#include <Arduino_ConnectionHandler.h>
 const char THING_ID[] = ""; //inserire l'id del proprio device
 const char SSID[]     = SECRET_SSID;    // Network SSID (name)
 const char PASS[]     = SECRET_PASS;    // Network password (use for WPA, or use as key for WEP)
 String plant_feel;
 float humidity;
 float temperature;
 int luce;
 int water;
 void initProperties(){
 ArduinoCloud.setThingId(THING_ID);
   ArduinoCloud.addProperty(plant_feel, READ, ON_CHANGE, NULL);
   ArduinoCloud.addProperty(humidity, READ, ON_CHANGE, NULL);
   ArduinoCloud.addProperty(temperature, READ, ON_CHANGE, NULL);
   ArduinoCloud.addProperty(luce, READ, 1 * SECONDS, NULL);
   ArduinoCloud.addProperty(water, READ, 1 * SECONDS, NULL);
 }
 WiFiConnectionHandler ArduinoIoTPreferredConnection(SSID, PASS);

Nella scheda thingProperties.h abbiamo il riepilogo delle variabili associatee alle proprietà che abbiamo creato. Andiamo nella scheda principale a programmare il comportamento della scheda Arduino.

In particolare le variabili intere luce e water saranno il valore restituito dalla lettura analogica sui due sensori di riferimento. Il codice quindi sarà il seguente:

luce = analogRead(0);

water = analogRead(1);

Umidità e temperatura sono letti dal sensore DHT11: qui le cose si complicano un poco ma viene in nostro soccorso la libreria DHT.h, che si può installare dal gestore delle librerie dell’IDE di Arduino.

Dobbiamo solo definire il pin digitale al quale è collegato il segnale del sensore e la tipologia dello stesso (DHT11). Nel setup inizializziamo il sensore e nel loop, per associare alle variabili il valore letto dal sensore, inseriremo il seguente codice:

temperature = dht.readTemperature();

humidity = dht.readHumidity();

Nel complesso il codice relativo al solo funzionamento del sensore DHT11 è il seguente:

#include <DHT.h>
 
#define DHTPIN 6
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
 dht.begin();
}

void loop() {
 temperature = dht.readTemperature();
 humidity = dht.readHumidity();
}

Per quanto riguarda la variabile relativa all’umore della pianta, che ho chiamato plant_feel, andremo ad inserire un if-else per gestire la soglia di tolleranza sotto la quale inviare i messaggi.

if(luce<50 || temperature<5 || water<10){
 plant_feel = "C'è qualcosa che non va";
 if(luce<50){
   plant_feel = "Non ho abbastanza luce";
   }
   if(temperature<5){
   plant_feel = "Ho freddo";
   }
   if(water<10){
   plant_feel = "Ho poca acqua";
   }
 }
 else{
   plant_feel = "Sto bene!";
 }

In questo modo la scheda Arduino invierà alla nostra app dei messaggi quando i valori di luce, temperatura ed umidità del terriccio scendono sotto le soglie indicate. In caso contrario visualizzeremo il messaggio Sto bene!.

N.B. le soglie possono essere cambiate impostando valori differenti a seconda della tipologia di pianta da monitorare e dell’esperienza dell’utente.

smart planter monitor arduino

Ricapitolando, il codice completo della scheda principale è il seguente:

#include "arduino_secrets.h"
#include "thingProperties.h"
#include <DHT.h>
#define DHTPIN 6
#define DHTTYPE    DHT11

 DHT dht(DHTPIN, DHTTYPE);

 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(2);
   ArduinoCloud.printDebugInfo();
 dht.begin();
 }

 void loop() {
   ArduinoCloud.update();
   // Your code here 
 luce = analogRead(0);
 water = analogRead(1);
 temperature = dht.readTemperature();
 humidity = dht.readHumidity();
 if(luce<50 || temperature<5 || water<10){
   plant_feel = "C'è qualcosa che non va";
   if(luce<50){
   plant_feel = "Non ho abbastanza luce";
   }
   if(temperature<5){
   plant_feel = "Ho freddo";
   }
   if(water<10){
   plant_feel = "Ho poca acqua";
   }
 }
 else{
   plant_feel = "Sto bene!";
 }
 }

Nella scheda arduino_secrets.h ricordiamoci di inserire il nome e la password della nostra rete WiFi. A questo punto non dobbiamo far altro che caricare lo sketch sulla scheda Arduino utilizzando l’apposita funzione.

Conclusioni sullo smart planter monitor realizzato con Arduino

In questo modo abbiamo realizzato un’interfaccia dalla quale visualizzare, sia da browser che da app mobile, le informazioni più importanti sulla nostra fioriera intelligente. Arduino leggerà questi dati e li invierà in tempo reale al cloud.

Per suggerimenti oppure per avere maggiori informazioni su un passaggio che ti risulta poco chiaro non esitare a contattarci. Se stai muovendo i primi passi in questo mondo ti consigliamo il corso online che abbiamo realizzato.

    Acconsento al trattamento dei dati personali ai sensi del Regolamento UE 2016/679. Leggi la Privacy Policy.