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.

0 Commenti

Non ci sono commenti

Nessuno ha ancora commentato questo articolo, fallo tu per primo!

Scrivi un 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 alessandro,
questa regex dovrebbe fare al caso tuo:

alessandro

ciao sto cercando una regex per numeri interi o decimali, positivi o negativi; la tua regex mi pare …

Michele Pisani

Ciao Nicola,
ti riferisci per caso alla situazione di gianluigi?
In tutti i casi la via …

Nicola

Ciao Michele, mi trovo nella medesima situazione in cui si trovava Gianluca un anno fa. Sei poi …