Ardu-Aquarium Controller v. 3.3.1

Puoi chiarire la cosa.
Se misuri a vuoto la Rsens hai 2Kohm. Se fai un partitore con una resistenza da 1.5Kohm ottieni 2.5V in uscita?
Dovresti avere 2.14. :roll_eyes:

A meno che non hai misurato la resistenza a vuoto ed il partitore in acqua col livello minimo.
Puoi essere che la Rsens asciutta valga 2K e bagnando il sensore al livello minimo scenda subito a 1.5K, ma mi pare strano visto che nella pagina evidenzia un andamento lineare.

Calcolatore per op-amp --> http://www.daycounter.com/Calculators/Op-Amp/Op-Amp-Voltage-Calculator.phtml

Si scusami, hai ragione,
avendo misurato entrambe le resistenze del sensore all'asciutto, ma anche a livello minimo, ed avendole trovate uguali, le ho messe in configurazione partitore e ho fatto le misurazioni ottenendo appunto 2,5v
Ora ho provato anche con una r da 1K5 e misuro 2,1v su questa e 2,85 sulla Rsens ma il mio multimetro non è un granché, comunque direi che è come dici tu

Grazie PaoloP

Riccardo

riciweb:
Ho trovato un po' di tempo, ed ho montato il circuito che mi hai suggerito, ma sul Vout dell'operazionale ho senpre 0,0 V, in ogni caso le misurazioni in uscita dal sensore sono:
con il sensore verso massa e R1 a +5v ho in uscita dal sensore V-livmax= 2,17 V-livmin = 4,13
con il sensore verso +5v e R1 verso massa ho in uscita dal sensore V-livmax = 4,94 V-livmin = 3,08

Ma se hai tensioni così alte all'uscita del sensore l'op-amp se ne va in saturazione; a questo punto non ti serve amplificare il segnale, semmai lo riduciamo ;). Comunque ogni misurazione va fatta in condizioni ideali, altrimenti c'è troppo casino: come dice Paolo, il sensore avendo 1,5k all'asciutto, con una R di pari valore in partitore ti dovrebbe fornire sempre 2,5V, a prescindere dalla posizione del sensore e della R1, invece i valori da te misurati fanno comprendere che la resistenza del sensore sia molto più elevata, e così non andiamo da nessuna parte.
Cerca di capirmi, un partitore fatto da due R da 1,5k divide la tensione esattamente a metà, cioè 5:2=2,5V; in queste condizioni, che il sensore sia collegato a massa o a 5V è come se tu invertissi tra loro due R uguali, quindi dovresti avere sempre 2,5V come livello minimo; invece cambia il livello massimo, poiché la R tende a 0 all'aumentare del livello, possiamo considerare che ad un certo punto sia così bassa da far misurare una tensione prossima al punto in cui è collegata; cioè se la Rsens è collegata verso GND, tu avrai una variazione tra 2,5V (liv. minimo) e 0V circa (liv. massimo), viceversa avrai una variazione tra 2,5V (SEMPRE liv. minimo) e 5V circa (liv. massimo).
Bene, se riesci ad ottenere queste condizioni allora possiamo proseguire in un ragionamento, in caso contrario non ne usciamo.

Rici, se hai misurato 2K a vuoto allora usa solo resistenze da 2K per l'operazionale. Altrimenti sballa il valore.
Quelle da 1k5 rimettile nel cassetto.
Che poi da 2 mi sa che non ci sono. Ho hai 1.8 o 2.2 :~

Scusatemi tutti e due, più cerco di fornire tutte le informazioni, più perdo in chiarezza,
malgrado ciò che dice il datasheet, sia Rsens che Rref, hanno valore 2k misurati con il multimetro, ed in modalità partitore, con Vcc di Arduino 5v ho appunto 2,5v sul vout, questa condizione, si verifica con sensore sia con acqua a livello minimo che all’asciutto, se poi porto l’acqua a livello massimo ossia 20cm, allora la lettura in volt sul vout, sempre in modalità partitore, scende a 1,25v, (Rsens circa 670 Ohm) quindi con il partitore, la tensione dal livello minimo al livello massimo ha una variazione di 1,25v, questa variazione si traduce in appena 278 rampe in analogread() in particolare leggo al minimo 790 ed al massimo 512.
Mi piacerebbe, aumentare il divario di lettura tra livello minimo e massimo, amplificando il segnale, in modo da ottenere più rampe ed ottenere una migliore definizione del sensore è possibile farlo?
Ora è tardi, ma domani appena posso inverto Rsens e Rref e rifaccio le misurazioni.

PaoloP:
Rici, se hai misurato 2K a vuoto allora usa solo resistenze da 2K per l'operazionale. Altrimenti sballa il valore.
Quelle da 1k5 rimettile nel cassetto.
Che poi da 2 mi sa che non ci sono. Ho hai 1.8 o 2.2 :~

OK, ho quelle da 2,2k vedrò di usare quelle, ma dovrei prima capire come... :blush:

Grazie infinite a tutti e due.

Riccardo

Secondo me stai anche facendo un po' di casino con i circuiti, Paolo sta seguendo l'originale che a me, per il momento, sembra un po' troppo impegnativo, visto che la RRef serve per compensare le variazioni di temperatura e per aumentare la precisione di lettura, ma ora hai da risolvere un problema diverso, semmai poi si può riprendere il discorso.
Io per ora ti consiglio di trattare questo sensore come una banale resistenza variabile, visto che i valori in tensione sono molto alti. Tu hai un range di lettura di circa 1,25V, e le rampe sono esattamente 255, non so come ti sei calcolato questo 278.... Se imposti l'ARef su External e gli fornisci 3,3V già le tue rampe salgono a 390. Se non ti bastano puoi usare uno di quegli integratini (sono in formato TO-92, tipo transistor, io ho preso l'intera serie...) che fanno da riferimento di tensione fissa; ora non ricordo esattamente ma dovrebbe esistere la versione a 2,1V, sicuramente c'è la 2,5V. Nel caso peggiore le rampe aumentano a 520. Infine potresti usare l'RRef interna a 1,1V, che significa che ti perdi la parte "alta", il sensore somincia a funzionare a più o meno 18cm di livello, oltre avrai sempre lettura 1023. Per questo tipo di uso non dovremo fare altro che calcolare un semplice partitore, lasciando stare op amp e altro, per rientrare nel range di RRef scelto.
Quindi ora devi prendere una decisione, o insisti con l'op-amp e segui i consigli di Paolo, oppure fai questa prova più semplice e per il momento butti via tutto in un cassetto, e ti aiuto io a calcolare tutto quanto.

altra possibilità: usi 2 partitori come nella figura 4.
Uno lo butti in AREF e l'altro nell'ingresso analogico. In questo modo il riferimento di tensione (inizialmente a 2.5V con resistenze uguali) varia automaticamente in funzione della temperatura e va a compensare automaticamente il dato letto.

Interessante, un ARef dinamico :cold_sweat: In effetti l'RRef è il valore di riferimento fisso per il sensore empty, se ho ben capito è strutturato in modo da compensare le variazioni di temperatura, fornendo il riferimento esatto dello 0; resta il fatto che la tensione di alimentazione V+ può variare e fornire comunque indicazioni non esatte, ma questo vale sempre, a meno di non decidere di usare i 3,3V di Arduino, che sono certamente stabili.
Allora la prova da fare sarebbe questa:
a) 3,3V - RSense - R 2k2 - GND : il punto di contatto tra RSense e R2k2 va in un pin analogico, p.es. A0
b) 3,3V - RRef - R 2k2 - GND : il punto di contatto tra RRef e R2k2 va nel pin ARef di Arduino.
c) nel Software bisogna impostare analogRead (EXTERNAL), quindi si fanno un po' di prove di lettura, poi vediamo....

Ciao,
più che farlo il casino , sono io ad essere un casino umano :blush:, non avevo capito che Paolo si riferisse al circuito originario con amp-op.
Ad ogni modo, a me interessa la compensazione con Rref, proprio perché vorrei che il sensore funzioni al meglio sia con acquari temperati che tropicali…
Oggi ho messo il neurone sotto flebo di caffè, vediamo se riesco a fare qualche casino in meno!!!

Con il circuito originario con amp-op (quello del datadheet), utilizzando per R1 e R2 2,2K di valore, le letture dal livello minimo al livello massimo in analogread() vanno da 486 (1,96V) a 245 (0,96V).

Seguendo invece le indicazioni di Michele e Paolo riguardanti l’uso di Aref con i 3,3V di Arduino, utilizzando per R1 e R2 2,2K di valore, le letture dal livello minimo al livello massimo in analogread() vanno da 1023 a 1023, mi ci sono rotto la testa, facendo prove con due arduino, pensando di fare casino io, ma ha ragione arduino, perché in effetti, Aref in questo modo è a 1,67 che corrisponde al valore di partenza del vout sul sensore (in realta misuro 1,72), quindi fondo scala per analogread(), con acqua a livmax, il Vout sale a 2,53 che è sempre fondo scala per analogread().

Invertendo i collegamenti, ossia:
3,3V - R 2k2 - RSense - GND : il punto di contatto tra RSense e R2k2 va ad A0
3,3V - R 2k2 - RRef - GND : il punto di contatto tra RRef e R2k2 va nel pin ARef di Arduino.
Con Aref 1,67, le letture dal livello minimo al livello massimo in analogread() vanno da 1023 (1,57V) a 523 (0,76V).

Ho provato anche i collegamenti:
5V - R 2k2 - RSense - GND : il punto di contatto tra RSense e R2k2 va ad A0
5V - R 2k2 - RRef - GND : il punto di contatto tra RRef e R2k2 va nel pin ARef di Arduino.
Con Aref 2,32, le letture dal livello minimo al livello massimo in analogread() vanno da 1023 (2,37V) a 498 (1,13 V).

Spero di aver fatto bene i compiti questa volta :sweat_smile: e che si riesca a sfruttare ancora di più l'analogread, ossia farlo arrivare ancora più giù ed arrivare alla massima risoluzione possibile...
Mi pare che siamo sulla buona strada giusto?

Riccardo

Sì, le ultime prove sono quelle che ti consigliavo di fare. Ricorda che se inverti tra loro le R fisse ed il sensore, la variazione sarà in aumento e non in diminuzione, cioè avrai circa 500 al minimo livello e 1023 al massimo livello.
Allora per aumentare il range della lettura ed usare contestualmente l'RRef potresti applicare quest'ultimo ad un altro pin analogico di Arduino, in modo da avere il riferimento fisso, partizionare Rsense e RRef in modo da avere tensione minima prossima a 0V e poi impostare ARef su INTERNAL, cioè su 1,1V.
In pratica tu hai un range di tensioni di 0,8V (a 3,3V) o di 1,2V (a 5V); se imposti l'ARef a 1,1V, nel primo caso sfrutterai circa 800 step vedendo l'intera scala, nel secondo caso perderai circa 180 step, che potresti sacrificare nella parte alta del livello (in pratica avresti 0 = vuoto e 1023 a partire dal 90% di livello in su; non so se sono stato chiaro.

Ciao, grazie maaa...

[quote author=Michele Menniti link=topic=141419.msg1152015#msg1152015 date=1363025270]
Allora per aumentare il range della lettura ed usare contestualmente l'RRef potresti applicare quest'ultimo ad un altro pin analogico di Arduino, in modo da avere il riferimento fisso, partizionare Rsense e RRef in modo da avere tensione minima prossima a 0V e poi impostare ARef su INTERNAL, cioè su 1,1V.[/quote]

Non mi è molto chiara questa cosa...

Qui invece è più chiaro e siccome ho bisogno di monitorare bene il livello massimo del sensore, che sarà anche il livello massimo dell'acqua in acquario, è il primo caso quello che mi interessa, ma non ho capito i collegamenti del passaggio precedente :blush:

Riccardo

parlavo tra me e me :smiley:
una domanda per conferma: la RRef è fissa? cioè la tensione di riferimento che fornisce il partitore fatto con una R+RRef è sempre stabile o varia vistosamente? Mi serve questo dato per capire se ho pensato una caxxata o meno.

La Rref è una resistenza fissa, dovrebbe variare il suo valore solo con la temperatura.
In pratica vuoi seguire lo schema della 4° figura.

Puoi fare una prova?
Metti il sensore in acqua fredda (diciamo su 10 °C) e misura Rref. Poi immergi il sensore in acqua calda (37° dovrebbero bastare) e rimisura le resistenza.

Per ora ho fatto prove solo a temperatura acqua di casa e mi pare anche dalle misuarzioni che sia abbastanza fissa, dovrei provare con acqua fino a 30° per vedere di quanto varia...
Ora sono ancora al lavoro, ma in serata posso fare la prova e dirti.

Grazie di tutto...

OK, allora si può fare, non mi serve conoscere la variazione, poi lì bisognerà fare un pò di calcoli per la compensazione, quindi la nostra prova PER ORA prescinde dalla RRef che NON useremo. Cioè per ora facciamo finta di lavorare sempre alla stessa temperatura, poi introdurremo il correttivo. Allora fai così:

  • Collega un capo di una R di 3k9 ai 3,3V di Arduino
  • L'altro capo della R ad un capo di RsenseR
  • Il capo libero della Rsense a GND
  • Il punto di unione tra Rsense e la R 3k9 ad A0 di Arduino
  • Imposta nello sketch analogReference(INTERNAL)
    Secondo i miei calcoli, che spero siano esatti, ma dobbiamo considerare le ovvie tolleranze in gioco, dovremmo avere un'uscita variabile tra 0,24V (pieno) e 1,1V (vuoto). Infatti sappiamo cha Rsense varia tra 2k (vuoto) e 300ohm (pieno), ricordo che i 2k li hai rilevati tu mentre i 300 ohm li ho presi dal datasheet, qundi dovremo verificare anche questi due valori come si deve!!!
    Vout = 3,3 / 5900 * 2000 = 1,18V -> lettura = 1023 (vuoto)
    Vout = 3,3 / 4200 * 300 = 0,24V -> lettura = 75 (pieno)
    Se il test più o meno corrisponde avremo sfruttato circa il 92% della scala, mi pare possa bastare, poi nei prossimi 3-4 mesi completeremo il lavoro :grin:

Ho fatto la prova, ma non ho la R da 3k9 quindi ho messo in serie una 3k una 560 ed una 330 :cold_sweat: :blush:
ecco i risultati:
A vuoto Analogread 1023 Vout= 1,14
A pieno Analogread 464 Vout = 0,48 (Rsens misurata a pieno 680 ohm domani scrivo a milonetech e chiedo per sti valori a cappero rispetto al datasheet)

Il codice:

byte levelsensor = A0; 
int levelvalue = 0;  // variable to store the value coming from the sensor

void setup() {
   Serial.begin(9600);
   analogReference(INTERNAL);
}

void loop() {

  levelvalue = analogRead(levelsensor);    
  Serial.println(levelvalue);
            
}

Ciao e grazie

Guarda hai fatto tutto bene (ma 3k non esiste, sarà 3k3), quindi basta la sola 560), il problema è sto zz di sensore, a prescindere dei 300-1500 sulla carta e 680-2000 reali, ha effettivamente un range ristretto.

Non per dubitare, ma hai corrette conoscenze sui colori delle R? non è che stiamo pigliando fischi per fiaschi? Inoltre il tester che hai è decente? Non vorrei che tra te e lui stiano uscendo risultati peggiori di quanto non ci si aspetti.

La piega che sta prendendo questo topic me ne ricorda un altro. ]:slight_smile: ]:slight_smile:

PaoloP:
La piega che sta prendendo questo topic me ne ricorda un altro. ]:slight_smile: ]:slight_smile:

sono proprio uno sfigato, visto che ogni volta mi ci butto a pesce, convinto che "si tocca", invece è sempre una FOSSA DELLE MARIANNE :fearful:

Dunque Arancione = 3 Nero = 0 Rosso (moltiplicatore) = 100 quindi 3000 :blush: il tester mi da 2,94K
Mi vergogno un pò ma difronte a voi guru, vacillano anche le poche cose che credevo di sapere :~
Sul fatto che non esistano... http://it.rs-online.com/web/p/resistori-montaggio-a-foro-passante/7077707/

Il tester effettivamente non è proprio dei migliori, marcucci.it acquistato quando nemmeno sapevo dell'esitenza di Arduino, dopo averti letto ho cambiato anche la batteria e ripetuto le misurazioni, ma i risultati non sono cambiati, oggi se riesco ne vado a comprarne un'altro, oltre alle resistenze ovvio, nel caso quali altri valori sarebbe meglio che compri?
Con 50/60€ lo prendo un tester decente? Hai qualche consiglio da darmi?

Dai non fate così, in fondo il sensore misura al massimo 20cm, se mi mandate i vostri indirizzi vi spedisco un paio di calosce :stuck_out_tongue_closed_eyes:

Scherzi a parte, vi ringrazio di vero cuore per il tempo che mi state dedicando...

Riccardo