Temperature sbagliate con sensore LM35DZ

Ciao a tutti,
ho provato a leggere un po’ i post presenti sul forum riguardanti il sensore di temperatura LM35DZ, ma non sono riuscito nè a trovare risposta al mio quesito, nè a trovare post più recenti di 120 giorni.

Sto tentando di realizzare un sistema che mi permetta di prendere il valore della temperatura espressa in gradi Centigradi e me lo riporti sul LCD.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

//Indirizzo LCD 0x27 - 16caratteri X 2linee
LiquidCrystal_I2C lcd(0x27,16,2);

int pinSensore = A2;
float celsius;
float millivolts;
int sensore;

void setup()
{
  Serial.begin (9600);
  
  // Inizializza LCD
  lcd.init();
  lcd.backlight();
  lcd.print("Gradi C");
}

void loop()
{
  // Lettura LM35DZ
  sensore = analogRead (pinSensore);
  // Conversione LM35DZ
  celsius = (5.0 * sensore * 100.0) / 1024.0;
  
  // Stampa temperatura su LCD
  lcd.setCursor(0,1);
  lcd.print(celsius);
  delay(5000);

  /*
  //Stampa temperatura seriale
  Serial.print(celsius);
  Serial.println(" C");
  Serial.println(sensore);
  delay(5000);
  */
}

Il problema è che ricevo misure davvero fuori dal comune: dell’ordine dei 200°C e si verifica sia se stampo sul terminale seriale, sia su LCD.
L’LCD funziona correttamente, ho effettuato diverse prove; per quanto riguarda il collegamento del sensore di temperatura ho usato lo schema presente nell’immagine.

Grazie a tutti per l’aiuto.

2016-10-12_10-28-42.png

Credo che l'errore sia nella formula di calcolo dei gradi Celsius:

celsius = 500.0 * sensore / 1023;

Anche quella formula è sbagliata.

Al massimo sarebbe

celsius = 500.0 * sensore / 1024;

Ma non è nemmeno diciamo giusto perché quella troverebbe semplicemente il valore in mV

Oppure usi map e fai così:

celsius = map(analogRead(A2), 0 ,1023, 0, 5000)/10;

E cosa credi faccia la mia formula?

cyberhs:
E cosa credi faccia la mia formula?

Hai ragione :slight_smile: Tranne su una cosa, che ci va 1024 :wink:

As_Needed:
Anche quella formula è sbagliata.

Al massimo sarebbe

celsius = 500.0 * sensore / 1024;

Ma non è nemmeno diciamo giusto perché quella troverebbe semplicemente il valore in mV

Oppure usi map e fai così:

celsius = map(analogRead(A2), 0 ,1023, 0, 5000)/10;

Ho provato ad usare la formula map ma non è cambiato molto.

cyberhs:
Credo che l’errore sia nella formula di calcolo dei gradi Celsius:

celsius = 500.0 * sensore / 1023;

stesso ragionamento anche per quanto riguarda la formula celsius = 500.0 * sensore / 1024;. (foto2).

Cos’altro posso tentare?

Strano che ti dia sempre valori sballati. Hai provato a vedere quale valore ti dà dall'uscita analogica di Arduino, ad esempio con un potenziometro attaccato? Giusto per vedere se l'uscita analogica dà valori normali... Se no è il sensore che non va.

angelus:

Se usi la bread board, è possibile che il contatto sia difettoso: controlla.

As_needed:

se usi 1024, cosa ottieni con Vadc = 5.0V ?

Infatti, nella map usi 1023...

cyberhs:
se usi 1024, cosa ottieni con Vadc = 5.0V ?

Infatti, nella map usi 1023...

Nella map uso 1023 perché nella map specifico i valori che vanno da 0 a 1023 ovvero 1024
Nella formula senza map invece divido per 1024 perché sono appunto il numero dei quanti dell'ADC di Arduino a 10 bit
E' vero che non ottieni 5 con 1024, però fatto sta che gli "scalini" in totale sono 1024

Comunque è vero, potrebbe essere anche un falso contatto

Prova a far girare uno sketch solo per la seriale e scollega l'LCD.