Sensore LM35

Ciao a tutti,

in vista di un progettino, avevo acquistato un sensore lm35, all’epoca verificai il funzionamento scrivendomi uno sketch di base:

#define PIN_LM35 A0

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

void loop(){
 int valore = analogRead(PIN_LM35);
 float temperatura = valore/9.31;
 Serial.print("Temp.: ");
 Serial.print(temperatura);
 Serial.println("°C");
 delay(2000);
}

con questo codice ora, anzichè leggere una temperatura di 30 C, leggo da serial monitor 38 C.
Se misuro con il tester la Tensione tra pin A0 e Gnd, misuro 294 mV mentre da porta seriale arduino legge che la variabile “valore” è di 358 mV. Sapreste indicarmi perchè ci sono queste discrepanze nella lettura dei valori ?
Inoltre appena collego il display LCD con modulo I2C alla +5V i valori si iniziano a sballare tirando fuori 264 C.
Ricordo che la scheda in mio possesso è un clone arduino il cui chip è alimentato a 3.3V (condizione verificata sotto vostra stessa guida in post precedenti).

>tech2019: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

Ho appena fatto una nuova prova: ho applicato direttamente 3.3V al pin A0 letto il valore con analogRead(A0) e mi restituisce un valore di 3968… Ma la tensione sui pin analogici, non veniva suddivisa tra 1023 valori?

... si, infatti, la analogRead(), su Arduino UNO, deve restituire un valore tra 0 e 1023 (1024 possibili valori).

Metti un Serial.print() subito dopo la analogRead() e facci sapere ...

Guglielmo

tech2019:
Ho appena fatto una nuova prova: ho applicato direttamente 3.3V al pin A0 letto il valore con analogRead(A0) e mi restituisce un valore di 3968… Ma la tensione sui pin analogici, non veniva suddivisa tra 1023 valori?

Certamente…
chissa cosa stai leggendo.
PS Nello sketch precedente, il calcolo che fai va bene solo se usi analogReference(INTERNAL)

Ho preso la 3.3V sempre dalla board, collegato al pin A0 e per evitare di fare danni ho collegato in parallelo al pin A0 una resistenza da 1.5 kOhm connessa al GND.

il codice usato è questo:

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

}

void loop() {
   
   Serial.print("Valore Analogico:");
   int valore=0;
   valore=analogRead(A0);
   Serial.print(valore);
   Serial.println(" ");
 
  delay(2000);

}

valore=3968… stesso valore se applico la 5V; se collego solo a GND mi da 0… almeno quest ultimo è un valore previsto. :roll_eyes: :roll_eyes:

Il valore 3968 in binario vale 1111 1000 0000 ovvero un numero a 12 bit ...
... sicuro che parliamo di un Arduino UNO (o di altra scheda AVR a 8 bit) ? ? ?

Guglielmo

P.S.: Arduino originale o clone cinese ? ? ?

Clone cinese.
C'è modo di generare una tensione minore dei 3.3 V con arduino? magari riesco a vedere qual'e il valore di fondo scala .....

SE il valore ritornato da una semplice analogRead() NON è a 10 bit ...
... il chip è fallato ... puoi anche buttarlo un affare così, l'affidabilità è pari a ZERO.

Guglielmo

C’è qualche prova che posso fare prima di buttarla ? Mi sembra strano… ha lavorato si è no 3-4 volte per testare solo i componenti.

Purtroppo la prova la stai già facendo ...

... ti rendi conto che solo un ATmega328P fallato (o altro chip rimarchiato per sembrare un ATmega328P) può ritornare un valore analogico con risoluzione superiore a 10 bit? ? ? :o

E' una questione hardware, il chip è progettato per avere un ADC a 10 bit ... come fa a darti un risultato a 12 bit (per di più errato)? ? ? :o

E cosa ne sai che altre parti, sempre. o in particolari condizioni, non diano i numeri anche loro? ? ?

Il codice di test che hai utilizzato, salvo non mi sfugga qualche cosa (... cosa che è sempre possibile :smiley:) è piuttosto semplice ... leggi il valore ritornato in una variabile di tipo int e, immediatamente, stampi detto valore, quindi ... ::slight_smile:

Guglielmo

Non è che hai una scheda con ESP32 ?

brunello22:
Non è che hai una scheda con ESP32 ?

… gli ho chiesto in più e più punti e modi di confermare che si tratta di Arduino UNO … vedi, ad esempio, il mio post #6.

Spero bene sappia cosa sta usando … ::slight_smile:

Guglielmo

Presumo che hai un Clone cinese del Arduino UNO.

Il ATmega328 sul UNO usa i 5V come riferimento per la conversione del valore analogico.
Se quella tensione non é 5,00 ma 4,6 la misura sbaglia perchße nel fattore di conversione:
float temperatura = valore/9.31;
sono dentro i 5,00V.
Soluzioni:
Misura della tensione di alimentazione con https://www.instructables.com/id/Secret-Arduino-Voltmeter/
Oppure usa il analogReference(EXTERNAL) e collega al AREF i 3,3V. Visto che quelli sono normalmente piú stabili dei 5V la misura é piú precisa.
Ciao Uwe

uwefed:
Presumo che hai un Clone cinese del Arduino UNO.

... Uwe, leggi BENE tutta la discussione, qui NON si tratta di errore di precisione, qui si tratta di chip malfunzionante che da un valore (totalmente errato) di ADC a 12 bit !!! :o :o :o

Guglielmo

Da ricerche in rete ho riscontrato che tale clone usa un ADC a 12 bit fino ai 3.3V, ma c’è comunque qualcosa che non va, i valori rilevati dovrebbero essere a fondo scala 4096 mentre a me si ferma prima 3968 a fondo scala.

Scusa eh, ma ti avevo chiesto più volte se era un Arduino UNO (originale o clone)...
... potevi dirlo che si trattava d'altro e potevi anche mettere un link alla scheda in questione, così evitavamo tutti di perdere tempo ... ::slight_smile:

Guglielmo

tech2019:
Clone cinese.
C'è modo di generare una tensione minore dei 3.3 V con arduino? magari riesco a vedere qual'e il valore di fondo scala .....

gpb01:
... Uwe, leggi BENE tutta la discussione, qui NON si tratta di errore di precisione, qui si tratta di chip malfunzionante che da un valore (totalmente errato) di ADC a 12 bit !!! :o :o :o

Guglielmo

Allora dovrebbe finalmente il TO rispondere alla domanda che hardware sta usando.

Se la scheda é un clone di Arduino con un LGT8F328 spacciato per ATmega328 spiegherebbe i 12 BIT.
vedi [OT] ATmega328P falsi ... - Generale - Arduino Forum
[EDIT] aggiungo: Quel Chip viene chiamato anche AVGA328P della WAVGAT [/EDIT]

Secondo me esiste comunque il problema con la tensione di riferimento.

Ciao Uwe

C’è qualcosa che non quadra…
Spulciando nei post precedenti hai messo il link alla foto della tua scheda, questa


Ora, in questa scheda vedo un Atmega328P.

Tu dici che funziona a 3.3V e il che è abbastanza “strano” visto che ‘è un un quarzo a 16 Mhz e se dai un’ occhiata al datasheet dell’Atmega puoi vedere che con 3.3V non arriva a 16Mhz

E poi dove lo hai visto che usa un ADC a 12bit, dato che si parla sempre di un Atmega328.

Non è che poi hai un multimetro un pò fallato, visto che misuri 294mV sull’LM35 a una temperatura di 30° e ce ne dovrebbero essere circa 800 mV

EDIT: Mi correggo, non monta un Atmega328. ma come dice UWE, un AVGA328P…( ma dove cavolo l’ho visto l’Atmega328 ??)
Comunque la cosa mi ha incuriosito e allora ne ho ordinato uno

uwefed:
Se la scheda é un clone di Arduino con un LGT8F328 spacciato per ATmega328 spiegherebbe i 12 BIT.
vedi [OT] ATmega328P falsi ... - Generale - Arduino Forum

Hai ragione Uwe, dopo la nota di Brunello qua sopra, sono andato a ricercare i vecchi post del OP e ... QUI lui mette una foto della scheda che usa che è proprio una di quelle "fasulle" di cui si è parlato nel thread dei chip FALSI !!!

Di quel chip è dificile trovare datasheet completi che non siano in cinese ... ci sono in giro traduzioni, ma non sono complete ... buona fortuna ... ::slight_smile:

Guglielmo