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.
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);
}
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?
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?
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
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.
nid69ita:
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)