lettura livello liquidi con galleggiante e digitalread... ma come?!

ciao a tutti ragazzi...

non riesco a far funzionare un progettino veramente elementare e non capisco il perché...

allora si tratta di un sistema composto da 3 galleggianti che, posti in una vasca di raccolta, mi permetta di segnare sul display il livello rilevato in tre punti: livello basso, livello medio e livello alto.

per quanto riguarda la configurazione del display non ho avuto problemi, sulla lettura dei sensori, invece, si.

Sul mio arduino ho liberi gli analogici 1, 2, 3 e i digitali 8 e 9; per comodità ho provato ad utilizzare gli analogici dato che sono in fila ed ho usato questo sketch (per comodità riporto solo quello che interessa a noi)

int livellob = A1;
int livellom = A3;
int livelloa = A2;

void setup(){
 pinMode(livellob, INPUT);
  pinMode(livellom, INPUT);
  pinMode(livelloa, INPUT);
}

void loop(){

 lcd.setCursor(13, 3);
 if (digitalRead(livellob) == HIGH){
    lcd.write(1);
  }
 else {
      lcd.write(0);
  }

  lcd.setCursor(14, 3);
  if (digitalRead(livellom) == HIGH){
    lcd.write(0);
  }
  else {
    lcd.write(1);
  }
   lcd.setCursor(15, 3);
  if (digitalRead(livelloa) == HIGH){
    lcd.write(0);
  }
  else {
    lcd.write(1);
  }

delay(1000)
}

come potete vedere è semplicissimo... ed io pensavo di collegare il primo cavo di ciascun galleggiante al +5v di arduino e gli altri ad A1, A2 ed A3...

quando l'acqua sale il galleggiante chiude il circuito mandando il +5v al pin di Arduino che, a sua volta, leggendolo, scriverà sul display un'icona che ho realizzato..

bene, il problema è che A1 funziona correttamente mentre A2 legge solo se anziché il +5v gli porto il ground (in realtà basta che colleghi un qualsiasi conduttore a prescindere che sia collegato o meno al + o a gnd) ma al tempo stesso deve interferire in qualche modo con A3 perché eccita anche quest'ultimo che automaticamente arduino legge come: "livello alto raggiunto".......

dove sbaglio?

luca56: dove sbaglio?

Devi invertire la logica di funzionamento, attiva le pullup su A1, A2 e A3, lo stato normale è 1, e collega i galleggianti con il comune a GND, quando chiudono il relativo ingresso va 0. Il motivo è che gli ingressi lasciati flottanti, cioè non collegati a nulla, a causa dell'alta impedenza possono leggere sia 1 che 0 a seconda delle condizioni ambientali e lo stato dei pin della stessa porta.

ok, intanto grazie per la risposta...

ho capito la logica di funzionamento e quale fosse il mio errore... però non ho capito come posso procedere (attiva le pull-up)...

scusate ma ho arduino solo da 10 giorni e non ho mai studiato informatica, faccio tutto da autodidatta...

luca56: però non ho capito come posso procedere (attiva le pull-up)...

Le pull-up interne sono resistenze integrate nel circuito dei pin e che, se attivate, collegano il pin a Vcc (da qui "pull-up", "tirar su" il segnale) con una resistenza da qualche decina di Kohm.

Per attivarle:

pinMode(pin, INPUT);
digitalWrite(pin, HIGH);

cioè, devi mettere prima il pin su INPUT e poi impostarlo su HIGH.

per disattivarle:

digitalWrite(pin, LOW);

impostalo a LOW. Ricordati di farlo se poi vuoi usarlo per altre cose, altrimenti la pull-up resta attiva

mi sento un pò stupido ma… non ho ancora capito cosa devo fare…

voglio dire: attivo le pull up sui pin A1 A2 A3 tramite il comando

digitalWrite(A1, HIGH)

e così anche per gli altri 2… massa comune ai galleggianti ed altro capo di ognuno su A1 A2 A3

ho provato ma il risultato è questo:

A1 = livello non raggiunto
A2 = livello raggiunto
A3 = livello raggiunto

ma non ho ancora collegato i galleggianti!

giusto per rendere l’idea… l’ultima scritta in basso a destra (Ro) è l’indice di cui stiamo parlando.

il primo carattere dopo Ro indica lo stato del livello basso (se ha solo i contorni il livello non è stato raggiunto, altrimenti diventa pieno… e così anche per gli altri 2)

Devi invertire anche la tua logica da così:

if (digitalRead(livellob) == HIGH){

a così:

if (digitalRead(livellob) == LOW){

E poi un po' di link: http://arduino.cc/en/Reference/PinMode http://arduino.cc/en/Tutorial/DigitalPins http://arduino.cc/en/Reference/DigitalWrite http://arduino.cc/en/Reference/DigitalRead

allora avevo capito bene... ma non vanno in cortocircuito così?

se su A1 A2 A3 attivo il +5v e ad un capo dei galleggianti GND, quando il livello sale o scende questi mandano GND sui pin che quindi vanno in cortocircuito, no?

comunque l'immagine qui sopra rappresenta esattamente quello che succede con pull up attive su A1 A2 A3

ora ogni pin non influenza più l'altro, ma non capisco perché mentre il primo segna giustamente vuoto, gli altri due si comportano all'opposto... segnano pieno quando dovrebbero segnare vuoto e viceversa...

se provo con un cavetto a collegare GND con A1 questo segna pieno (ok)

GND ad A2 segna vuoto (dovrebbe essere l'opposto)

GND ad A3 come sopra...

mi viene voglia di cambiare soltanto le icone che assegno io nei due casi... ma vorrei capire perché sti 3 pin si comportano in modo diverso...

No, perché la pull-up limita la corrente che transita da Vcc a GND: tu non stai collegando direttamente i 5V a massa, ma tramite una resistenza. In questo modo il pin "sente" che il segnale va a Low senza però avere il corto.

grazie mille..... c'è stata una svista da parte mia nell'assegnazione delle char personali.... erano invertite, per quello non mi tornavano i conti

grazie ancora e scusate la stupidità delle domande...

ahahah

Luca