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
Marzo 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
Condividi

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.

2 Commenti

  1. Salvo Corrao lunedì 12 agosto 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 domenica 18 agosto 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

Scrivi un Commento

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

Articoli e Argomenti correlati

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

Ciao Sandro, in tal caso può essere sufficiente riferirsi all'elemento in posizione [0] dell'array …

Sandro

Il problema mio è più complesso. L'ho risolto con VbScript, ma con JavaScript mi sono …

Michele Pisani

Ciao Nicola, all'epoca l'interfaccia dello strumento e le voci dei menu non lo permettevano, non …

Nicola

Dopo l'esportazione in JPG, chiudi, e Gimop ti chiede se vuoi salvare l'IMG. Lavorando con tante …