Go Down

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

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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy