Problema con sensori temperature LM35

Buongiorno e grazie in anticipo a chi vorrà aiutarmi.
Partendo da uno dei tanti sketch per i sensori in oggetto ne ho realizzato uno con due sensori di cui dopo farei la media delle letture, ma è un passo successivo.

Di seguito lo sketch che ho modificato

#define Temp1 A1
#define Temp2 A2
#define out1Pin 9
#define out2Pin 10


void setup() {
Serial.begin(9600);
  
}

void loop() {
  int mvT1 = analogRead(Temp1);
  float T1 = mvT1 / 2.046;
  int mvT2 = analogRead(Temp2);
  float T2 = mvT2 / 2.046;

  Serial.print("  T1 ");
  Serial.print(T1);
  
  Serial.print("  T2 ");
  Serial.println(T2); 
 
  delay(100);
  }

Il problema è che le letture non sono costanti ma variano ciclicamente da 0 a valori alti e non sono coerenti. Questo per entrambi i sensori.
Il cablaggio è corretto.

12:20:39.828 -> T1 0.00 T2 0.00
12:20:39.905 -> T1 0.00 T2 0.00
12:20:40.022 -> T1 0.00 T2 0.00
12:20:40.104 -> T1 0.00 T2 0.00
12:20:40.222 -> T1 0.00 T2 0.00
12:20:40.328 -> T1 12.71 T2 1.47
12:20:40.407 -> T1 0.00 T2 38.61
12:20:40.527 -> T1 0.00 T2 26.88
12:20:40.609 -> T1 12.71 T2 0.00
12:20:40.714 -> T1 32.75 T2 19.06
12:20:40.828 -> T1 31.77 T2 35.68
12:20:40.932 -> T1 20.53 T2 41.54
12:20:41.014 -> T1 20.04 T2 43.50
12:20:41.129 -> T1 14.17 T2 32.75
12:20:41.236 -> T1 8.80 T2 14.66
12:20:41.361 -> T1 15.64 T2 0.00
12:20:41.440 -> T1 0.00 T2 35.68
12:20:41.545 -> T1 0.00 T2 0.00
12:20:41.621 -> T1 0.00 T2 0.00
12:20:41.729 -> T1 0.00 T2 0.00
12:20:41.832 -> T1 1.47 T2 0.00
12:20:41.946 -> T1 0.00 T2 0.00

Qualcuno può aiutarmi?
Grazie mille

Intanto comincia con lo specificare di CHE Arduino parliamo ... :roll_eyes:

Guglielmo

Si, ok. Perdonate sono molto inesperto.
Arduino 1 R3
IDE 2.3.6

Ok, su arduino UNO R3, quando si cambia canale analogico (ovvero, prima leggi un certo Ax e poi Ay) è d'obbligo effettuare almeno una lettura a vuoto (scartando il risultato) sul nuovo canale scelto per problemi di come funziona il circuito interno di S/H.

Guglielmo

Ho però provato ad escludere la lettura di un sensore tenendo solo l'altra.
Non cambia. Sempre oscillante e incoerente.

Metti uno schema dei collegamenti e delle alimentazioni ...

... gli LM35 sono sensori non raziometrici e come tali sono insensibili alle variazioni di tensione (dentro gli LM35 c'è un generatore a corrente costante, usato per la misura, che li rende indipendenti dalla tensione di alimentazione, che può essere compresa tra 4 e 30 V, e anche al rumore sulla stessa se non è troppo alto).

Il problema, in funzione dell'ampiezza delle oscillazioni, potrebbe essere l'ADC della MCU che richiede un riferimento di tensione preciso e noto (più gli eventuali problemi legati al rumore che possono causare notevoli fluttuazioni nella misura).

Guglielmo

Questa. Copiata paro paro da quanto ho trovato sull'argomento

Si beh ovviamente nello sketch ho collegato A0 e tolto A1 per essere coerente con l'immagine.

Però a noi non convince il calcolo

Da dove arriva?

L'avevo copiato qui

Si, ok
(Giusto) Sbagliato
E poco leggibile

La costante esatta è 2.048

Si, 2.046 o 2.048 (come ho messo nel mio sketch) non cambia niente. Il problema è sempre quello.

Tieni conto di una cosa:
Tutti quelli che hanno avuto problemi con quei sensori alla fine hanno trovato il loro errore (noi compresi)

Confortante

Per la conversione PWM per il pilotaggio dei LED delle luci psichedeliche ho messo doppie letture e 1ms di pausa fra l'una e l'altra. Se il programma deve girare più velocemente, usa millis() al posto dei delay:

void loop()
{
analogRead(IN_BASSI); bassi=analogRead(IN_BASSI);
delay(1); // I delay servono per evitare interferenze con le letture successive!
analogRead(IN_MEDI);   medi=analogRead(IN_MEDI);
delay(1);
analogRead(IN_ALTI);   alti=analogRead(IN_ALTI);
delay(1);
... ... ...

Troppo avanzato per me...

Che cosa??? Fare 2 letture e mettere dei delay?...

Arriverò anche io a dire così...

void loop() {
  analogRead(Temp1); float T1=analogRead(Temp1)/2.048;
  delay(1);
  analogRead(Temp2); float T2=analogRead(Temp2)/2.048;
  // Non metto il delay perché poi ce n'è uno di 100ms.
  Serial.print("  T1 "); Serial.print(T1);  
  Serial.print("  T2 "); Serial.println(T2); 
 
  delay(100);
  }

Era difficile?... :slight_smile:

Grazie
compilando mi da però
Compilation error: 'T1' was not declared in this scope