Problema con sensore per misurare il livello d'acqua

Buonasera a tutti ho un problema con il sensore per misurare il livello d'acqua . Collego tutto carico lo sketch ma sul display lcd mi compare come livello 0 anche se è immerso in acqua. Allego lo sketch qua sotto:

#include <LiquidCrystal.h>

LiquidCrystal lcd ( 12,   //RS
                    11,  //EN
                    5,  //D4
                    4,  //D5
                    3,  //D6
                    2); //D7  
// ****************************** variabili ********************************
int livello = A0; // variabile di memorizzazione del livello dell'acqua
int valoremin = 500; // variabile in cui viene memorizzato il valore minimo
// rilevabile dal sensore (definito sperimentalmente,
// con la bacinella vuota)
int valoremax = 700; // variabile in cui viene memorizzato il valore
// massimo rilevabile dal
// sensore (definito sperimentalmente, con la
// bacinella piena di acqua)
int i = 0; // indice utilizzato nel ciclo for per lo spegnimento
// preventivo dei led
void setup()
{
  Serial.begin(9600); // inizializza la comunicazione sul monitor seriale
  lcd.begin(16, 2); // inizializza il display (16 caratteri per due righe)
 
  pinMode (10, OUTPUT); // led verde collegato alla porta 10
  pinMode (9, OUTPUT); // led giallo collegato alla porta 11
  pinMode (8, OUTPUT); // led rosso collegato alla porta 12
  digitalWrite (12, HIGH); // accende la spia rossa di livello basso (questa
  // spia resta sempre accesa poiche' segnala la
  // situazione di serbatoio con meno del 20% di acqua
  // e quindi la situazione peggiore
}
void loop()
{
  livello = analogRead (A0); //acquisisce il segnale dal sensore livello acqua
  Serial.print ("livello: = ");
  Serial.print (livello);
  if (livello < 500) // se il segnale e’ sotto il minimo
    livello = 500; // lo porta al minimo
  if (livello > 700) // se il segnale e’ sopra il massimo
    livello = 700; // lo riporta al massimo
  livello = map(livello, valoremin, valoremax, 0, 100); // rimappa il livello
  // fornito dal sensore, portandolo su di una scala
  // da 0 a 100
  Serial.print (" - ");
  Serial.print(livello); // espone sul monitor seriale la % di riempimento
  Serial.println ("%");
  lcd.clear ();
  lcd.setCursor(0, 0); // posiziona il cursore all'inizio della prima riga
  lcd.print ("livello: ");
  lcd.print (livello); // espone il livello sul display lcd
  lcd.print ("%");
  for (i = 9; i <= 10; i ++)
    digitalWrite (i, LOW); // Spegne preventivamente i led giallo e verdi
  if (livello > 20)
    digitalWrite (9, HIGH); // se il livello e' piu' del 20% accende la spia
  // gialla (livello medio/basso)
  if (livello > 50)
    digitalWrite (10, HIGH); // se il livello e' piu' del 50% accende la prima
  // spia verde (livello medio/alto)
}

ita o incolla il codice qui

Devi specificare anche quale sensore stai usando (magari un link all'articolo esatto che hai acquistato) e come è connesso (uno schemino sarebbe l'ideale, ma anche una foto potrebbe bastare), altrimenti che vuoi che ti si dica di diverso?

Mi pare evidente che se quando dici "livello 0" intendi "0%", quello che leggi da analogRead() sia inferiore a 500.

PS: l'inizializzazione "int livello = A0;" non serve (anzi ha senso asssegnare il numero di un pin), lascia solo "int livello;"


Il sensore l’ho comprato in un kit di elegoo quindi non saprei dirti il modello

Quello non è un sensore livello ma un sensore pioggia si/no

Anche se nella foto non si vede bene, sembra il classico sensorino pioggia o livello acqua. E comunque ti ho anche chiesto di dire anche cosa intendi con "livello 0", visto che nello sketch scrivi sulla seriale sia il valore letto da analogRead sia quello che vai a mappare per avere una percentuale, cerca di dare tutte le informazioni.

Diciamo intanto che il sensore, stando alla descrizione che trovo QUI, avrebbe una tensione d’uscita "compreso tra 0 e 2,6 V" quindi "si leggeranno valori compresi tra 0 e 550 circa". nel tuo codice hai imposto il range 500-700 che non è corretto per questo sensore (ma come hai determinato quei valori?).

Il valore della lettura diretta del pin A0 te lo scrive sulla seriale dopo "livello: = ", ignora la percentuale e vedi quali valori leggi fisicamente con analogRead() quando il sensore è all'asciutto e quando totalmente immerso, e quelli saranno i nuovi limiti da utilizzare (è la "calibrazione" del sensore, visto che i valori cambiano anche in base al tipo di acqua che devi misurare ossia alla sua conduttività).

Se, viceversa, il valore di analogRead è veramente sempre zero, potrebbe essere il sensore guasto o un problema di cablaggio (perché non inizi collegando direttamente il sensore ai pin di Arduino, senza neanche la breadboard?).

In ogni caso, quando chiedi aiuto cerca di dare tutte le informazioni, soprattutto se richieste (come l'output seriale del sensore, basta un copia/incolla).

Poi vedi pure QUESTO video dove mostra quel sensore usato proprio per misurare il livello dell'acqua.

Infine se questo progetto lo stai pensando per qualcosa che debba durare, considera che quei sensorini di pioggia soffrono di un problema di ossidazione (ed in quello che hai mostrato nella foto sembra di vedere già delle piste ossidate) che ne abbassa la sensibilità fino a non funzionare quasi più. Prova anche a spiegare se è solo un tuo esperimento per prendere pratica con Arduino, o se realmente pensi di usarlo per misurare un livello (e di cosa?).

@icio: non è "si/no" perché non ha l'operazionale/comparatore ma solo un transistor, e si, può anche fare da sensore di livello dell'acqua (anche se lo sconsiglio).

Il si/no viene fatto via software mediante comparazione con soglia impostata, si usano così

Il sensore è analogico, il si/no di cui parli è per un sensore di pioggia che serve per decidere se attivare o meno l'irrigazione. Ma se viene fatto via software non ha senso dire all'OP che "è si/no" perché lo farai solo confondere. :wink:

Anche se è analogico, il valore che produce non ha un'affidabilità tale da permettere di valutare il livello dell'acqua: anche se la soglia è 700, quando non c'è acqua sarà, per esempio, 200 e quando c'è 900, ma senza una variazione costante nel tempo che permetta di stabilire il livello, anche per la diversa conducibilità dell'acqua secondo le sostanze disciolte.

Ma anche no... Ma il mio post lo hai letto, e lo schema (che puoi trovare nella pagina Adrirobot che ho linkato) lo hai visto?

Se non c'è acqua il transistor non conduce e quindi l'uscita sarà a GND e si legge sempre 0. Quando l'acqua c'è, a seconda del tipo di acqua (come ho comunque già detto) arriverà al massimo a 550 circa, più realisticamente direi non oltre 300-400 e comunque, sempre come ho già scritto, vanno "calibrati" i limiti per adeguarli al sensore ed acqua usati.
Volendo si potrebbe aggiungere in cascata un secondo transistor per amuentare maggiormente il range, ma non si risolve il problema di affidabilità ossia di ossidazione e quindi, a meno che non lo si faccia solo per studio, è sconsigliabile usare quel sensore. sempre come ho già scritto.
Perdonami, ma fare precisazioni già citate (da altri) e soprattutto poco utili ad un utente poco esperto come l'OP non fa altro che "allungare" inutilmente un thread, evitiamolo, grazie.

Non avevo capito che QUI era il link al sito del produttore.

Non so se sia il produttore ma quei sensori al 99.99% sono tutti uguali (d'altronde non c'è molto: un transistor, qualche resistenza ed un LED), di produzione probabilmente solo cinese. Ed anche dalla foto, seppure fuori fuoco, si può vedere che il sensore della pagina di Adrirobot che ho linkato mostra esattamente lo stesso.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.