Salve a tutti,
avrei un problema con una lettura analogica, credo sia software.
Per darvi un'idea: sto lavorando a una serra per interni che regoli temperatura, irrigazione, e cicli di luce: quindi vi sono due potenziometri uno per la regolazione dei litri d'acqua giornalieri e uno per i millilitri di concime, una fotoresistenza e un sonda di temperatura LM35cz.
Il problema è che la lettura analogica della temperatura comincia a dare valori sballati e a caso nel momento in cui io vado ad aumentare il potenziometro dei litri.
Ho provato di tutto, anche a mettere i potenziometri su un'alimentazione separata, ma non è servito a nulla....
Il valore sballa solo se vario il potenziometro dei litri, con quello dei millilitri non ho problemi.
Non so più dove sbattere la testa...Se qualcuno volesse aiutarmi grazie in anticipo....
Questi sono lo Sketch che sto usando e le letture che ottengo.
Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:
Il modo in cui sono collegati i componenti ad arduino è allegato , i componenti sono:
2 potenziometri da 10 k
3 led con 3 resistenza da 10 k
1 sonda di temperatura LM35cz
1 fotoresistenza con due resistenze in serie (una da 12 e una da 22 k)
2 bacchette di ferro e una resistenza da 1 Mg (come partitore di tensione per il sensore d'acqua)
1 ARDUINO UNO
Ho provato a far stampare sulla seriale il valore analogico letto senza convertirlo ed è stabile, sembra che sballi quando fa il calcolo ma non capisco perchè... :o :o
A mio parere dovresti seguire alcuni accorgimenti:
1 - effettua almeno una decina di letture consecutive per ogni pin analogico (ti basta ricorrere ad un ciclo for), sommarle e poi fare la media;
2 - quando passi alla lettura del pin successivo conviene scartare il primo valore e poi fare il solito ciclo di 10 letture;
3 - per migliorare la precisione di lettura la tensione di alimentazione dell'Arduino deve essere molto stabile, inoltre devi misurare il valore che esce sul pin ARef, perché quello è il riferimento per l'ADC (che poi non è altro che l'alimentazione).
4 - la conversione conviene farla sempre passando per la "classica formula": V_ARef/1024letturaADC, che ti fornisce il valore in tensione che stai applicando al pin, poi lo converti in ciò che ti serve.
p.es. l'LM35, se non ricordo male, fornisce 10mV/°C; ponendo di trovarci ad una temperatura di 25°C, lui fornisce al pin analogico 250 mV, ma l'ADC che valore restituisce in lettura? Se dai per scontata una alimentazione precisa di 5V, allora hai 5/1024=0.0048828 (devi dividere per 1024 e NON per 1023, leggi il datasheet dell'ATmega328P per capire il perché), di conseguenza 250/4.88=51.23 (il valore rilevato sarà 51). A questo punto puoi trattare direttamente la tua lettura media ADC con una sola formula: V_ARef/1024letturaADC100=24,90; l'errore è dovuto alla conversione, che è di soli 10 bit, ma lo puoi facilmente recuperare aggiungendo un ulteriore 0.5 ottenendo 25,40, infatti l'LM35 ha una accuratezza di 0.5°C, quindi inutile tentare di avere valori inferiori al mezzo grado.
Un altro esempio: 10.5°C corrispondono a 105 mV/4.88=21.51 (21); la solita formula V_ARef/1024letturaADC*100+0.5 darà come risultato finale 10.75. Impostando la formula in modo che i valori siano mostrati a passo di 0.5°C nel primo caso avrai 25.0 °C, nel secondo 10.5 °C, quindi esattamente i valori rilevati dal sensore.
Ora se tutto il ragionamento del punto 4 lo rivedi alla luce di una alimentazione di 5.1 V vedrai che tutti i valori cambieranno, ecco perché conviene misurare il valore su ARef e poi assegnarlo ad una costante (V_ARef nei miei esempi), cosicché, cambiando fonte di alimentazione, ti basterà aggiornare tale valore costante per avere sempre calcoli esatti.
5 - Considera che se i tuoi sensori non inviano segnali superiori a 1,1 V puoi ricorrere all'Internal Reference, che è abbastanza preciso ed è indipendente dalla tensione di alimentazione.
6 - Infine, per aumentare la precisione dell'ADC puoi ricorrere alla tecnica dell'oversampling, con la quale puoi arrivare a 12 o anche a 14 bit, ma devi tener presente la relativa riduzione della banda passante, quindi della velocità di lettura che si riduce, nel caso della temperatura in genere non è un problema, per il resto devi sapere tu se puoi applicarlo o meno.
Ti ringrazio, ho fatto la maggior parte delle cose che mi hai consigliato, tranne utilizzare la formula per la conversione per 2 motivi:
Il primo è che purtroppo non ho ancora capito bene come si usa il i pin AREF (purtroppo ), cmq ho misurato la tensione di alimentazione ed è 5,1-5,2 V costanti anche nelle variazioni dei potenziometri.
Il secondo è che guardando le letture non variano di poco, per cui sia possibile fare una media, sono porprio a caso, anche di 15-20°, senza logica di primo e ultimo, anzi di solito il più affidabile è prorprio il primo.
Comunque sto imparando come si una il pin AREF, ma essendo ignorante in elettronica non riesco a capire come e dove va collegato....
Se lo colleghi a 5 Volts avrai un rifermento a 5 Volts che vengono divisi per 1024. Questa sarà la suddivisione del valore in ingresso. Se invece fosse un ingresso di valore molto più basso, allora conviene collegarlo ad un partitore di tensione che suddivide i 5 Volts in quello che ritieni più opportuno.
Non va collegato da nessuna parte, se NON usi l'analogReference INTERNAL o EXTERNAL, semplicemente devi misurare la tensione che esce da esso rispetto a GND, con un normale multimetro digitale, se davvero misura 5,1-5,2 NON è stabile proprio per niente, anzi è proprio da questo che ti deriva l'instabilità delle letture, probabilmente; in ogni caso tale valore è sempre FISSO e non dipende da ciò che leggi sui pin. Una volta misurata la tensione precisa UNA TANTUM la devi usare nelle formule di conversione al posto di V_ARef.
Se stai misurando variazioni di 15-30° c'è proprio qualcosa che non va nei collegamenti, prova a vedere se l'LM35 scotta di brutto, in questo caso facilmente lo hai collegato al contrario. Quando funziona correttamente l'LM 35 deve fornire letture di XX°C molto stabili.
ExperimentUno:
Se lo colleghi a 5 Volts avrai un rifermento a 5 Volts che vengono divisi per 1024. Questa sarà la suddivisione del valore in ingresso. Se invece fosse un ingresso di valore molto più basso, allora conviene collegarlo ad un partitore di tensione che suddivide i 5 Volts in quello che ritieni più opportuno.
Quanto dici ha significato solo settando analogReference(EXTERNAL), in quel caso quel pin diventa un ingresso per una tensione di riferimento, ma deve essere una fonte stabilissima ed affidabile e non può certo passare attraverso un partitore di tensione, che ha delle tolleranze e risente della temperatura ambiente; in genere vi si applicano tensioni provenienti da integrati SPECIFICI, che una volta alimentati forniscono una tensione precisa e stabile per sempre.
Ho controllato: la sonda è collegata giusta e se la attacco da sola e funziona.
All'interno del sistema se lascio il pontenziometro del litro al minimo (1 Litro) tutto va bene, ma se lo aumento, le letture della temperatura cominciano a sballare, (ho controllato meglio, sballa proprio la lettura, non il calcolo).
Ho controllato la tensione in ingresso alla sonda ed era 5.1 V stabile.
Sembrerebbe un problema di collegamento del potenziometro, oppure un suo difetto fisico (grafite danneggiata o contatti ossidati. I fili dei potenziometri sono saldati o "volanti"?
Puoi fare queste misure:
1 - A circuito alimentato applica il tester su V tra il centrale del potenziometro (quello che va al pin analogico) e GND, ruotalo e vedi se la tensione varia regolarmente e linearmente (o logaritmicamente, se il potenziometro è di tipo A);
2 - A circuito spento applica il tester su OHM tra il centrale del potenziometro ed uno dei due capi, ruotalo e vedi se la resistenza varia con la stessa modalità della tensione della prova precedente; ripeti la prova tra il centrale e l'altro laterale.
[quote author=Michele Menniti date=1483389696 link=msg=3066396]
Quanto dici ha significato solo settando analogReference(EXTERNAL), in quel caso quel pin diventa un ingresso per una tensione di riferimento, ma deve essere una fonte stabilissima ed affidabile[/quote]
Domandina, scusate. Un chip tipo ? 7805 o LM317 sono stabili ?
Abbastanza, ma non precisi, in questi casi comunque non si usa un regolatore, esistono degli integrati specifici, tipo il REF02 o il REF25, sono fatti apposta per questi scopi.
Usando il ref esterno, si puo usare anche un 431A, che puo fornire una sorgente di riferimento a 2.5V piuttosto stabile e con una discreta corrente (massimo 100mA, che per un VREF sono parecchi), e costa pure poco
Ho fatto tutte le prove, comprese quelle di scambiare i potenziometri, ma non è cambiato niente, quando vado ad aumentare i litri giornalieri, mi sballa la temperatura, i potenziometri sono funzionanti, difatti il loro valore resta stabile, è quello del sensore di temperatura che sballa.....
Anche invertendo i potenziometri, è solo con i litri giornalieri che sballa, e sopra 1 9-10 litri con i millilitri è stabile...
Alimentazione e o disturbi li ho ricontrollati: non vi sono disturbi e le alimentazioni, ho anche provato a confrontare il valore analogico in parallelo con tester:
l'uscita in Volt é costante e varia al variare della temperatura, ma il il valore analogico sballa....