Go Down

Topic: Problema lettura sensori (Read 751 times) previous topic - next topic

alcibiade

Apr 03, 2013, 05:20 pm Last Edit: Apr 04, 2013, 07:22 am by leo72 Reason: 1
Ciao a tutti, mi sono appena registrato al forum; ho un problema con Arduino che mi sta facendo impazzire e spero che qualcuno mi possa aiutare: ho una Arduino Uno, un sensore per la temperatura LM35 (ma potrei anche usare un TMP36 se più accurato), e un sensore per l'umidità HIH-4030.
Ho collegato i due sensori a dei cavetti lunghi circa un metro in modo tale che le masse e i positivi siano in comune, poi, per i dati, ho un cavo dell' LM35 collegato a A1 e il cavo dati dell' HIH 4030 collegato a A0. Ho inserito il codice che segue, il problema è che la temperatura comincia a dare dati in sequenza diversi tra loro, qualcuno può aiutarmi? Grazie.

Code: [Select]
const unsigned int attesa= 9600;

void setup() {
 Serial.begin(attesa);
}
 
void loop() {
 while (1) {
   temperatura();
   umidita();
   delay (attesa);
 }
}

void temperatura()
{
 float temp = 0.0;  
 int val = 0;
 val = analogRead(A1);  
 temp = ( 5 * val * 100) / 1024.0;   // converte il dato fornito dal sensore °C
 Serial.print("Temperatura: ");
 Serial.print(temp);
 Serial.println (" C");
}

void umidita()
{
 float temp2 = 0.0;  
 float umi = 0.0;
 float umiRelativa = 0.0;
 int val2 = 0;
 val2 = analogRead(A1);  
 temp2 = ( 5 * val2 * 100) / 1024.0;   // converte il dato fornito dal sensore °C

 umi = analogRead(A0);
 umiRelativa = (((umi / 1023) * 5) - 0.8) / 0.031;
 umiRelativa = umiRelativa/(1.0546 - (0.00216 * temp2));
 Serial.print("Umidita' relativa: ");
 Serial.println(umiRelativa);
}


leo72

Ciao e benvenuto.
Ti ricordo di leggere il regolamento del forum;)

uwefed

La funzione loop() viene giá ripetuta all infinito; non serve che aggiungi "while (1) {" .
cosa sigifica: "il problema è che la temperatura comincia a dare dati in sequenza diversi tra loro,"
puoi darci un po di valori?

Ciao Uwe

leo72

Ricordati anche che conviene sempre mettere una lettura a vuoto quando si cambia pin analogico.

astrobeed


Ricordati anche che conviene sempre mettere una lettura a vuoto quando si cambia pin analogico.


Ricordati che non serve a nulla come ho spiegato qui :)

leo72

Senza dover stare a controllare le impedenze di ciò che è collegato ai pin, è sempre meglio fare qualche lettura sullo stesso pin e poi restituire la media o l'ultima, per avere un risultato più affidabile. Non trovi?

astrobeed


Non trovi?


Sopratutto il discorso della media è sbagliato di principio se c'è il problema dell'impedenza troppo alta, non serve a nulla fare letture a vuoto, semmai tocca inserire dei delay per dare tempo al condensatore del s/h di caricarsi al giusto livello.
La media serve per ripulire dal rumore, se la fai su un valore che sta salendo per via dell'alta impedenza il valore finale non è corretto visto che rappresenta il valore medio della curva di carica (eventualmente spostato verso l'alto a seconda di quante lettere esegui) e non della reale tensione, semmai tocca fare letture distanziate nel tempo, quanto serve, e fare la media di queste.
Questa storia della lettura da buttare via sta diventando una leggenda metropolitana  :D
La regola da seguire quando si usa l'ADC è fare in modo che l'impedenza d'uscita della sorgente sia sempre inferiore a 10k, se non lo è basta mettere in mezzo un opamp rail to rail in configurazione voltage follower, questo per evitare problemi di letture fluttuanti e/o drastica riduzione della banda visto che è già poca di suo.

leo72


nid69ita


...opamp rail to rail in configurazione voltage follower, ...

Per capire a cosa ti riferisci, questa lettura può andare bene?
http://www.editorialedelfino.it/ita/dettaglio.articolo.php?id=641&id_catalogo=2&id_famiglia=30
my name is IGOR, not AIGOR

astrobeed


Per capire a cosa ti riferisci, questa lettura può andare bene?


Si può condensare il concetto semplicemente dicendo che un opamp rail to rail è in grado di far variare la tensione in uscita tra gli estremi della sua alimentazione, p.e. tra 0V e 5V, in realtà c'è sempre una perdita minimale (da pochi mV a qualche decina di mV a seconda del modello) rispetto alle alimentazioni.
Una soluzione semplice, se non si dispone di un rail to rail, è usare un comunissimo LM358 che è in grado di raggiungere in out quasi 0V, alimentarlo ad almeno 7V (5V se è per 3.3V) in modo che anche la tensione alta arrivi a 5V (o 3.3V come serve)

Go Up