![Arduino - Misurare il Livello di un Liquido in un Serbatoio Arduino - Misurare il Livello di un Liquido in un Serbatoio](https://media.bigbossweb.com/corporates/chdlr48tnm8thg95tgh9e4mjgngthemb/website/michelepisani/media/pictures/arduino_misurare_il_livello_di_liquido_in_un_serbatoio.jpg)
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:
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!
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
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!
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
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.
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
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.
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?
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.
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