Problema lettura sensori

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);
}

Ciao e benvenuto.
Ti ricordo di leggere il regolamento del forum. :wink:

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

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

leo72:
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 :slight_smile:

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?

leo72:
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 :smiley:
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.

OK.

astrobeed:
...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

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)