MICHELEPISANI.IT
 

Water Sensor, LED, LCD 1602/I2C

Water Sensor per Misurare il Livello di Liquido in un Serbatoio

Arduino - Misurare il Livello di un Liquido in un Serbatoio
March 04
07:492017

Effettuando diverse prove con un sensore per il rilevamento del livello di un liquido all'interno di un serbatoio o di un piccolo contenitore, in particolare Water Sensor (chiamato talvolta anche Funduino), ho realizzato uno sketch che coinvolge oltre al sensore stesso anche un display LCD e 9 led allo scopo di dare all'utente un'informazione visiva, facilmente identificabile, sul livello del liquido misurato all'interno del serbatoio.

Il display LCD 1602 I2C mostra il valore del livello di Liquido rilevato all'interno di un piccolo serbatoio con il sensore 'Water Sensor'. All'aumentare del livello del liquido i led si accendono dal rosso verso il verde (in modo da simulare un indicatore luminoso) e contestualmente il disply LCD mostra un messaggio visivo che indica lo stato di tale livello (vuoto, riserva, 1/4, 1/2, 3/4, pieno). Comportamento opposto (i led cominciano a spegnersi partendo da quello verde più a destra) si ha mano a mano che il serbatoio si svuota.

Di seguito lo schema elettrico del progetto:

arduino - misurare il livello di un liquido in un piccolo contenitore
Fig. 1 - Schema per Arduino - Misurare il Livello di un Liquido in un Piccolo Contenitore

Ed ecco la parte più interessante del progetto, lo sketch:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

const int ledPinRedF = 12;
const int ledPinRedS = 11;
const int ledPinRedT = 9;
const int ledPinYelF = 8;
const int ledPinYelS = 7;
const int ledPinYelT = 6;
const int ledPinGreF = 4;
const int ledPinGreS = 3;
const int ledPinGreT = 2;
const int ledTotalNumber = 9;
const int sensorPin = A0;
const int sensoMaxValue = 9;
const int sensoMinValue = 0;
const int sensorConstrainMaxValue = 9;
const int sensorConstrainMinValue = 0;
int sensorValue = 0;
int sensorConstrainValue = 0;
float sensorValueCm = 0.0;
bool ledPinRedFStatus = LOW;
bool ledPinRedSStatus = LOW;
bool ledPinRedTStatus = LOW;
bool ledPinYelFStatus = LOW;
bool ledPinYelSStatus = LOW;
bool ledPinYelTStatus = LOW;
bool ledPinGreFStatus = LOW;
bool ledPinGreSStatus = LOW;
bool ledPinGreTStatus = LOW;

int ratioSensorValToLedNum;

const String cisternLevelEmpty = "Vuoto";
const String cisternLevelLow = "Riserva";
const String cisternLevelQ = "1/4";
const String cisternLevelH = "1/2";
const String cisternLevelT = "3/4";
const String cisternLevelFull = "Pieno";
String cisternLevelTxt = cisternLevelEmpty;

void setup(void) {
  lcd.begin(16, 2);
  pinMode(ledPinRedF, OUTPUT);
  pinMode(ledPinRedS, OUTPUT);
  pinMode(ledPinRedT, OUTPUT);
  pinMode(ledPinYelF, OUTPUT);
  pinMode(ledPinYelS, OUTPUT);
  pinMode(ledPinYelT, OUTPUT);
  pinMode(ledPinGreF, OUTPUT);
  pinMode(ledPinGreS, OUTPUT);
  pinMode(ledPinGreT, OUTPUT);
}

void loop(void) { 
  sensorValue = analogRead(sensorPin);
  sensorValueCm = (sensorValue*9.0)/600.0;
  sensorValue = abs(sensorValueCm);
  
  sensorConstrainValue = map(sensorValue, sensoMinValue, sensoMaxValue, sensorConstrainMinValue, sensorConstrainMaxValue);
  sensorConstrainValue = constrain(sensorConstrainValue, sensorConstrainMinValue, sensorConstrainMaxValue);

  if (sensorValue > 0) {
    ledPinRedFStatus = HIGH;
    cisternLevelTxt = cisternLevelEmpty;
    if (sensorValue > 1) {
      ledPinRedSStatus = HIGH;
      cisternLevelTxt = cisternLevelLow;
      if (sensorValue > 2) {
        ledPinRedTStatus = HIGH;
        cisternLevelTxt = cisternLevelLow;
        if (sensorValue > 3) {
          ledPinYelFStatus = HIGH;
          cisternLevelTxt = cisternLevelQ;
          if (sensorValue > 4) {
            ledPinYelSStatus = HIGH;
            cisternLevelTxt = cisternLevelH;
            if (sensorValue > 5) {
              ledPinYelTStatus = HIGH;
              cisternLevelTxt = cisternLevelH;
              if (sensorValue > 6) {
                ledPinGreFStatus = HIGH;
                cisternLevelTxt = cisternLevelT;
                if (sensorValue > 7) {
                  ledPinGreSStatus = HIGH;
                  cisternLevelTxt = cisternLevelT;
                  if (sensorValue >= 8) {
                    ledPinGreTStatus = HIGH;
                    cisternLevelTxt = cisternLevelFull;
                  } else {
                    ledPinGreTStatus = LOW;
                  }
                } else {
                  ledPinGreSStatus = LOW;
                  ledPinGreTStatus = LOW;
                }
              } else {
                ledPinGreFStatus = LOW;
                ledPinGreSStatus = LOW;
                ledPinGreTStatus = LOW;
              }
            } else {
              ledPinYelTStatus = LOW;
              ledPinGreFStatus = LOW;
              ledPinGreSStatus = LOW;
              ledPinGreTStatus = LOW;
            }
          } else {
            ledPinYelSStatus = LOW;
            ledPinYelTStatus = LOW;
            ledPinGreFStatus = LOW;
            ledPinGreSStatus = LOW;
            ledPinGreTStatus = LOW;
          }
        } else {
          ledPinYelFStatus = LOW;
          ledPinYelSStatus = LOW;
          ledPinYelTStatus = LOW;
          ledPinGreFStatus = LOW;
          ledPinGreSStatus = LOW;
          ledPinGreTStatus = LOW;
        }
      } else {
        ledPinRedTStatus = LOW;
        ledPinYelFStatus = LOW;
        ledPinYelSStatus = LOW;
        ledPinYelTStatus = LOW;
        ledPinGreFStatus = LOW;
        ledPinGreSStatus = LOW;
        ledPinGreTStatus = LOW;
      }
    } else {
      ledPinRedSStatus = LOW;
      ledPinRedTStatus = LOW;
      ledPinYelFStatus = LOW;
      ledPinYelSStatus = LOW;
      ledPinYelTStatus = LOW;
      ledPinGreFStatus = LOW;
      ledPinGreSStatus = LOW;
      ledPinGreTStatus = LOW;
    }
  } else {
    ledPinRedFStatus = LOW;
    ledPinRedSStatus = LOW;
    ledPinRedTStatus = LOW;
    ledPinYelFStatus = LOW;
    ledPinYelSStatus = LOW;
    ledPinYelTStatus = LOW;
    ledPinGreFStatus = LOW;
    ledPinGreSStatus = LOW;
    ledPinGreTStatus = LOW;
  }

  digitalWrite(ledPinRedF,ledPinRedFStatus);
  digitalWrite(ledPinRedS,ledPinRedSStatus);
  digitalWrite(ledPinRedT,ledPinRedTStatus);
  digitalWrite(ledPinYelF,ledPinYelFStatus);
  digitalWrite(ledPinYelS,ledPinYelSStatus);
  digitalWrite(ledPinYelT,ledPinYelTStatus);
  digitalWrite(ledPinGreF,ledPinGreFStatus);
  digitalWrite(ledPinGreS,ledPinGreSStatus);
  digitalWrite(ledPinGreT,ledPinGreTStatus);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Livello H2O: ");

  lcd.setCursor(0, 1);
  lcd.print(sensorValue);
  lcd.print (" | ");
  lcd.print(cisternLevelTxt);
  delay(100);
}

Di seguito una breve dimostrazione del funzionamento del progetto appena descritto:

In quest'altro video c'è uno dei test preliminari dove nel display LCD è visualizzato l'effettivo valore restituito dal sensore (all'aumentare del liquido nel contenitore) rilevato dal pin Analogico di Arduino:

Per consigli, suggerimenti o chiarimenti sentitevi liberi di lasciare un commento!

Tags

Autore

Michele Pisani

Michele Pisani

Ho uno spiccato orientamento al problem-solving, se è troppo facile non mi diverto :)
Credo nella volontà e nel cambiamento perchè hanno fatto della mia passione il mio pane quotidiano.
Se devo descrivermi con una sola parola direi... "Concretezza", la mia stretta di mano è una garanzia.

9 Commenti

  1. Salvo Corrao Monday, August 12, 2019 alle ore 23:56

    Mi piace il tuo progetto, però ho in mente qualcosa di diverso adesso ti descrivo e visto il tuo motto... non mi diverto perchè troppo facile ti chiedo sè puoi aiutarmi a sviluppare un controllo di livello con arduino e bluetooth con app. che visualizza il tutto e comanda un rele' sè ti piace e hai tempo ci contattiamo via email.
    Ps. Questo progetto lo voglio realizzare per mio figlio che ha bisogno di un controllo livello serbatoio (circa 1000 lt.)e ho pensato qualcosa di innovativo.
    Cordiali saluti Salvo Corrao

    Rispondi a questo commento
    • Michele PisaniAutore Sunday, August 18, 2019 alle ore 23:26

      Ciao Salvo,
      un progetto ambizioso che tuttavia non direi irrealizzabile.
      Ad ogni modo la mia attività lavorativa ha messo da parte la creazione di applicazioni mobile in favore del mondo data analysis, tra configurazione e analisi, e sviluppo di sistemi utili allo scopo con Google Apps Script.
      A livello di elettronica mi diletto solo per puro divertimento concentrandomi sulla parte software.
      Il tempo è tiranno ma se durante il tuo sviluppo trovi qualche difficoltà sarò lieto di provare a darti una mano per capire dove sta il collo di bottiglia.
      In bocca al lupo e se ti va fammi sapere lo stato di avanzamento del progetto. Grazie!

      Rispondi a questo commento
  2. Luca Luci Sunday, December 6, 2020 alle ore 20:24

    Salve.
    Complimenti. Vorrei adattare il suo listato ad un sistema con arduino, che mi ecciti un relè quando un pozzetto di raccolta acqua è quasi pieno...sarà l' età ma non ne esco....chiedo umilmente il Suo aiuto
    Grazie

    Rispondi a questo commento
    • Michele PisaniAutore Monday, December 7, 2020 alle ore 00:27

      Ciao Luca,
      a livello generale il codice dovrebbe essere pressoché lo stesso con l'integrazione del componente che ti interessa.
      Non ho lavorato con i relé, gioco con Arduino ma l'elettronica non è il mio settore, ho visto che in rete ci sono molti tutorial sul loro utilizzo che dipendono dalla tipologia, marca, ecc... Partirei quindi dai dati di targa e cercherei un tutorial mirato per l'attivazione di quello specifico componente con Arduino, a quel punto potrà essere integrato nel mio sketch.

      Rispondi a questo commento
  3. Davide Tuesday, April 27, 2021 alle ore 19:38

    Salve, se al posto del water level, volessimo utilizzare un sensore ad ultrasuoni(hc-sr04) come cambia il listato? Grazie mille di una tua futura risposta

    Rispondi a questo commento
    • Michele Pisani Tuesday, April 27, 2021 alle ore 22:19

      Ciao Davide,
      in quel caso non è solo il listato a cambiare, considerando che i pin interessati sono 4 e non 3, ma anche tutto lo sketch e il tipo di informazioni da gestire. Si tratta di riscrivere il tutto in base ad un altro tipo di sistema.

      Rispondi a questo commento
  4. Rosario Friday, June 25, 2021 alle ore 19:13

    Ciao e complimenti. Bellissimo progetto.
    Mi chiedevo, se dovessi monitorare il livello di una cisterna da 300 l, come posso fare? Dovrei usare un sensore ad ultrasuoni?

    Rispondi a questo commento
    • Michele PisaniAutore Friday, June 25, 2021 alle ore 22:12

      Ciao Rosario,
      su questo argomento, occupandomi principalmente di sketch, effettuo i miei studi su progetti in piccola scala. Molto probabilmente la soluzione del sensore ad ultrasuoni può essere valida e pertinente, lo testimonia anche il commento di Davide. Lo sketch e lo schema elettrico saranno leggermente differente, il concetto invece pressoché lo stesso.

      Rispondi a questo commento
  5. Tino Friday, November 18, 2022 alle ore 14:50

    Buon giorno, mi chiedevo se il tuo progetto può essere adattato a misurare il livello del gpl in un impianto auto.indicatore che viene montato è di 4 led e da indicazione di massima, mi chiedevo se era possibile utilizzare il segnale che comanda i 4 led per gestire un display con arduino, tenendo buono il file di programmazione

    Complimenti per il lavoro

    Rispondi a questo commento

Scrivi un Commento

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

Articoli e Argomenti correlati

Il Canale YouTube in ITALIANO

1 VIDEO GRATIS ogni 2 settimane! ISCRIVITI!

Entra a far parte della community su Facebook

Categorie popolari

Iscriviti alla mia newsletter

La tua e-mail con me sarà al sicuro.
Non fornirò mai le tue informazioni a nessuno!

Ultimi commenti

Michele Pisani

Hai verificato se succede per tutte le pagine da un certo periodo di tempo in poi o solo su alcune?

Tecnowiz

Sono amministratore di un blog pure io... Intanto ti faccio i complimenti per questo articolo. …

Michele Pisani

Ciao Antonio, grazie per la fiducia :) In caso di più fogli è necessario inserire il codice del …

Antonio

Ciao Michele, ho acquistato il tuo libro che unitamente ai tuoi video sta diventando il mio corso …