Sensore di livello serbatoio.

Salve ,ho comprato un'altro sensore di livello liquidi modello Sensori di Livello - Sic Navy
con resistenza 0/190 ohm collegato ad Arduino con partitore, facendo letture dalla seriale si vede che oscilla 0/670 più o meno non riesco a fare una map corretta.

[code]
+5 ---/\/\/\/\---+---O--- GND
                 |
          R      |   S
                 |
                A0
 R = 100 ohm         Sensore 0/190 ohm

[/code]

Anche usando lo sketch di calibrazione il 50% non corrisponde .

[code]
const int sensorPin = A8;    // pin that the sensor is attached to
// variables:
int sensorValue = 0;         // the sensor value
int sensorMin = 1023;        // minimum sensor value
int sensorMax = 0;           // maximum sensor value
void setup() {
  Serial.begin(9600);
  while (millis() < 5000) {
    sensorValue = analogRead(sensorPin);
    if (sensorValue > sensorMax) {
      sensorMax = sensorValue;
    }
    if (sensorValue < sensorMin) {
      sensorMin = sensorValue;
    }
  }  
}
void loop() {
  sensorValue = analogRead(sensorPin);
    Serial.print("sensorValue  =");
  Serial.println(sensorValue);
  // apply the calibration to the sensor reading
  sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 100);
   Serial.println(sensorValue);
  // in case the sensor value is outside the range seen during calibration
  sensorValue = constrain(sensorValue, 0, 100);
  Serial.println(sensorValue);
   delay(1000);
}

[/code]

Metti un multimetro e controlla se quel sensore è veramente lineare o meno, ovvero ...
... collega il sensore al multimetro in portata ohmmica, e, spostando a mano il gallegiante, controlla che la resistenza vari linearmente.

Guglielmo

Si controllata 0 190 al centro mi 95 a riposo da 0 max 190.

Stai facendo il map tra gli estremi 0/1023, ma il tuo sistema non potrà mai raggiungere questi valori perché si tratta di un partitore resistivo.

Segnati i valori della lettura analogica che hai con il minimo ed il massimo ed usa quelli nel map().

Se vedi il codice lo fa in automatico nel Setup la lettura finale va da 0 a 255 ok ma il 50% del serbatoio non corrisponde a 122.

Il partitore che usi (100:190 ohm) dovrebbe dare in uscita al massimo 3.276 V, compatibile infatti con la lettura max effettuata a 670. Potresi provare ad usare l'analogReference(EXTERNAL) e collegare l'AREF ai 3.3 V, magari usando una resistenza da qualche Kohm, così avresti una gamma più estesa su cui effettuare il map.

Ciao, Ale.

wingamesyun:
Se vedi il codice lo fa in automatico nel Setup la lettura finale va da 0 a 255 ok ma il 50% del serbatoio non corrisponde a 122.

Mi ero concentrato solo sul loop()...
In pratica è come se stai usando un ADC da 8 bit ;D
Ottimo il suggerimento de @ilguargua!

ilguargua:
Il partitore che usi (100:190 ohm) dovrebbe dare in uscita al massimo 3.276 V, compatibile infatti con la lettura max effettuata a 670. Potresi provare ad usare l'analogReference(EXTERNAL) e collegare l'AREF ai 3.3 V, magari usando una resistenza da qualche Kohm, così avresti una gamma più estesa su cui effettuare il map.

Ciao, Ale.

Ha letto un pò quello che mi hai consigliato non credo di aver capito molto della (analogReference) però ho misurato il voltaggio 3.28 V pieno quello che non riesco a capire perchè al 50% mi da 2.2.

Io la butto lì

Perché non è un potenziometro ma un reostato

E questo cambia le formule da usare

Standardoil:
Io la butto lì

Perché non è un potenziometro ma un reostato

E questo cambia le formule da usare

Come va trattato la cosa?

3.28 V pieno quello che non riesco a capire perchè al 50% mi da 2.2.

Non è che il potenziometro non è lineare ma logaritmico?
Se fosse lineare a metà corsa dovresti avere metà tensione rispetto a massa.
Con un logaritmico la resistenza sale lentamente all'inizio degli spostamenti e velocemente verso il fine corsa.

Non è un potenziometro

È un reostato

Probabilmente lineare

E allo OP è già stato segnalato come calcolare quello che gli serve

Ma siccome egli non studia, non si applica e pretende di copiare e basta (qui tutto scritto è, basta rileggere)....

Io personalmente ho già più volte aiutato questo OP, per aver visto sprecare il mio lavoro e ringraziare altri per cose che ho fatto io...

Mah, secondo me è la partenza l'errore è già in partenza.

  • Serbatoio vuoto misura ZERO?
  • Con quanti litri comincia a leggere? (perché non ci credo che legge da subito! E quel valore va sottratto)
  • Quanto misura con serbatoio pieno?
    Poi è matematica, sia se usi o meno la map

Non proprio

Concordo che un po' di matematica serva, ma anche tanto ragionamento, e capire quello che si scrive

A proposito, ho trovato la citazione originale che cercavo tempo fa: viene da un libro di un certo Tony Gray strategie per la gestione del tempo "un grammo di preparazione risparmia un litro di sudore"

Ma torniamo a noi

Nella setup() , durante i primi 5 secondi è previsto ti muovere il sensore tra il massimo e il minimo per aggiornare i valori massimi e minimi per la map()
Peccato che questo non sia possibile in una installazione fissa come vuole lo OP, inoltre i due valori sono già messi ai due estremi, quindi rendendo inutile la cosa
Questo è indice di programma scopiazzato e raffazzonato senza ne capire il programma ne il suo obbiettivo

Questo è sbagliato, avevo capito male io
Ne faccio pubblica ammenda

Poi quel reostato non è una resistenza variabile, ma un gruppo di resistenze inserite da contatti magnetici

Quindi di suo andrà a gradini, mi sembra siano 7

Ma se non si sanno queste cose, e nemmeno come fare un partitore con un reostato invece di un potenziometro, non si otterrà mai un risultato

Infatti ...

Ma che cavoli, perché parlate tanto, se non sapete state zitti, i sensori a resistenza lineare si leggono mediante generatore a corrente costante, un qualsiasi xxxxx che sa un minimo di elettronica lo sa

--- occhio agli appellativi che si usano ... ho eliminato io :smiley: - gpb01

Volevo rispondere a chi mi accusa di essere un copia e incolla
Prima che posto la richiesta di aiuto sul forum ho già fatto tutte le prove con la mia poca esperienza in questo mondo
Ps: Ho sempre ringraziato.
Grazie mille a tutti.

Ad esempio per il sensore da 190 ohm lo si alimenta con 5/190=26mA e la scala andrà linearmente da 0 a 5V

Se il sensore ha bassissima resistenza e la corrente calcolata diventa troppo alta per il sensore per portarlo in scala da 0 a 5V si interpone un amplificatore di tensione fatto con un operazionale

Oppure se proprio si vuol usare un partitore la formula è:
float Rx = Vadc*Rpullup/(1024-Vadc);

La map si userà poi sulla Rx per ricavare il livello cisterna

La soluzione con corrente costante però è precisa su tutta la gamma mentre quella col partitore no

A me sembra che ci sia stato un po di incasinamento ed incomprensione basato sulla confusione fra potenziometro e reostato (e sul fatto che, come gia detto anche da standardoil, quello non e' un sistema a cursore ma un sistema a matrice di reed, quindi "a gradini" ... che ne dite di resettare e ripartire da zero ?

Quello che abbiamo non e' un potenziometro (caso A, sarebbe troppo comodo), e neppure un tipico reostato a cursore (caso B), ma piu probabilmente una matrice di reed che chiude una serie di resistenze (caso C), con comportamento simile a quello di un reostato, ma a gradini (per cui, wingamesyun, a meno che in posizione centrale non ci sia esattamente la meta' della resistenza, cosa di cui dubito, non potrai mai averci la meta' della lettura, e neppure potrai avere una lettura lineare, ma solo per posizioni ... quante posizioni dipende da quanti reed ci hanno messo dentro, il sistema piu semplice per saperlo e' provare con il tester :wink: ) ...

E poiche' va da 0 (o piu probabilmente 10, stando al sito del venditore) a circa 190, possiamo leggerlo direttamente con un generatore di corrente costante come dice icio (magari per prudenza, per evitare il rischio di "cuocere" quella piu bassa quando e' sul 10 in caso di guasto al generatore di corrente, dato che non potendolo aprire, non sappiamo che tipo di resistenze abbiano usato ... anche se e' poco probabile che ne abbiano usate di piu piccole dell'ottavo di W, meglio non rischiare a prescindere), ma si puo fare lo stesso, basta aggiungere in serie un'altra resistenza ed aumentare di conseguenza la corrente applicata per avere comunque il massimo dell'escursione utile (un banale LM317L ed un paio di resistenze risolvono il problema del generatore di corrente costante) ...

Pace ? ... :wink:

Qui mi sembra che ci siamo fatti prendere la mano.

Prima domanda: come lo alimento un sensore con 26 mA fissi ?
Se ho un arduino con analogico da 1024 passi, ho proprio bisogno di un operazionale (che poi non è MAI un solo operazionale ma ha anche della componentistica intorno...)
Ultima domanda: Perché la soluzione a corrente costante è più precisa di un partitore resistivo?

Chiedo perché ignoro, quindi sono ignorante.