NodeMCU e Idroponica Parte 2 - quando la precisione conta veramente

Coding

Scritto da Vincenzo Caputo

In questo nuovo articolo della serie dedicata al coding riprendiamo il precedente tutorial imparando ad utilizzare il Convertitore Analogico Digitale presente sul NodeMCU.

Vedremo come effettuare una serie di misurazioni del valore di umidità sfruttando ancora l'Igrometro per il Suolo della Sodial(R) collegando l'igrometro al purtroppo unico pin analogico A0 del NodeMCU.

Infatti il NodeMCU è dotato di un solo Convertitore Analogico Digitale, ADC, con un range da 0V a 3.3V, risoluzione 10bit e un sampling rate di circa 10kHz.

Vi ricordo che l'Igrometro per il Suolo della Sodial(R) misura il valore di tensione ai capi dei due elettrodi presenti permettendo due modalità di utilizzo e cioè permette sia di impostare, tramite giravite, un valore di soglia della tensione al di sopra della quale fornisce il valore Vcc e al di sotto invece 0V sia di ottenere il valore istantaneo della tensione.

In questo tutorial utilizzeremo la seconda modalità considerando piccole variazioni di tensione nel tempo.

La classe Serial ci permetterà di visualizzare la serie di misurazioni sul Monitor Seriale dell'IDE di Arduino.

Ingredienti necessari:

Preparazione.

Prendete dell'hardware e collegatelo così:

Prendete del software, cioè l'IDE di Arduino, e scrivete così:

const int MOISTURE_PIN = A0;
const int ALARM_PIN = D1;

void setup() {
  Serial.begin(115200);

  pinMode(MOISTURE_PIN, INPUT);
  pinMode(ALARM_PIN, OUTPUT);
}

void loop() {
  int moistureValue = 1024 - analogRead(MOISTURE_PIN);   //leggo dal MOISTURE_PIN il valore della tensione istantanea 
  moistureValue = map(moistureValue, 0, 1024, 0, 100);

  if(moistureValue < 25) {
    digitalWrite(ALARM_PIN, HIGH);  
  }

  Serial.printf("Umidita': %d\n", moistureValue);

  delay(500);

  digitalWrite(ALARM_PIN, LOW);

  delay(500);
}

Questo è lo sketch che andremo a caricare.

Descrizione:

Tralasciando le funzioni già viste nei tutorial precedenti le uniche due nuove funzioni presenti sono la funzione analogRead() e la funzione map().

Il Convertitore Analogico Digitale ovviamente converte un segnale analogico cioè un segnale tempo-continuo, che in questo caso è una differenza di potenziale ai capi dei pin A0 e GND, in un segnale digitale cioe un segnale tempo-discreto.

Il Convertitore Analogico Digitale riceverà quindi in input un valore di tensione compreso, nel caso del NodeMCU, tra 0 e 3.3V e in output restituirà non una tensione bensì un valore compreso tra 0 e 2^risoluzione dove la risoluzione in questo caso è 10 quindi un valore compreso tra 0 e 1024.

La funzione analogRead() leggerà quindi dal pin analogico passato come argomento, in questo caso A0, proprio un valore compreso tra 0 e 1024. Il prototipo della fuonzione analogRead() è:

int analogRead(const int pin);

La funzione map() invece ri-mappa un valore da un range ad un altro. Il prototipo della funzione, grazie a dio fornitaci dalla documentazione di arduino, è:

long map(long value, long fromLow, long fromHigh, long toLow, long toHigh);

La classe Serial è stata descritta nel precedente tutorial. Tuttavia qui abbiamo introdotto la funzione statica printf() della classe Serial che permette di ottenere un output formattato. La funzione printf() è del tutto simile a quella presente nella stdio.h del C.

Risultato:

 

Abbiamo utilizzato la funzione map() per ri-mappare il valore restituitoci dal Convertitore Analogico Digitale, compreso tra 0 e 1024, in un valore tra 0 e 100 che ci indica la percentuale di umidità del terreno.

 

L'unico if() presente nello sketch è stato utilizzato per attivare l'allarme, tramite un led rosso, nel caso in cui il terreno diventa troppo asciutto, condizione che si verifica nel mio caso quando l'umidità del terreno va al di sotto del 25%.

 

Poichè il sensore non eccede in qualità non aspettatevi variazioni lineari nella percentuale di umidità del terreno. Inoltre i sali minerali disciolti all'interno del terreno per concimazione aumentano la conducibiltà.

 

Morale della favola non vi resta che tentare e trovare il valore minimo della percentuale di umidità del terreno, visibile su Monitor Seriale, che fa scattare l'allarme notificandovi, in realtà, che "il terreno è asciutto" sfruttando la funzione printf della classe Serial.

 

Se questo non avviene scrivetemi nei commenti e cercherò di aiutarvi il prima possibile.

 

Rivolgendomi ad esperti agronomi presenti tra di voi se avete una idea migliore su come effettuare misure di umidità del terreno, magari tenendo in considerazione la variazione di conducibilità del terreno in funzione dei sali minerali oppure tenendo in considerazione la temperatura, etc.., non esitate a scrivermi!!!

 

Nel prossimo tutorial...

 

Vedremo come sfruttare il WiFi integrato nel NodeMCU aprendo una connessione server all'interno di una LAN interagendo con questo tramite una app per Android che vi metterò gratuitamente a disposizione.

 

Se avete suggerimenti su nuovi tutorial attinenti il NodeMCU non esitate a scrivere nei commenti.

Produrre e aggiornare contenuti su vincenzocaputo.com richiede molto tempo e lavoro. Se il contenuto che hai appena letto è di tuo gradimento e vuoi supportarmi, clicca uno dei link qui sotto per fare una donazione.

Vincenzo Caputo

Nato a Matera, il 1° novembre 1977. Sono da sempre appassionato di tecnologia e ho un'esperienza lavorativa ventennale nel settore IT. Mi piace sperimentare e cercare sempre nuove soluzioni e soprattutto mi piace comunicare le mie esperienze agli altri.


Vai ai commenti