Calcoli per temperatura con LM35DZ

Intanto prova a vedere se mettendo un piccolo C da 100nF ceramico tra i pin Vin e Gnd dell'LM35 migliori la situazione. Ti dovrebbe però aiutare solo per gli sbalzi all'accensione del display. Ma se la tensione resta bassa fintanto che è accesa la retroilluminazione secondo me risolvi usando un'alimentazione a 5V stabili separata per il sensore. La retroilluminazione di un display LCD può succhiare diverse decine di mA, anche un centinaio, e gli sbalzi di tensione influenzano la lettura del sensore. Tempo fa anch'io notai lo stesso problema con un sensore simile al tuo ed un piccolo display Nokia3310.

Allora.. Ho provato la tensione sul pin AREF.. esce 4.88v senza illuminazione, con illuminazione invece scende ai 4.73v..
Potrei portarla a 1.1v, ma oltre alla limitazione cosa mi cambierebbe? Avrei maggiore stabilità? O i cali ci saranno comunque?

X leo: vedo se ne ho qualcuno in giro, anche se la vedo dura..

EDIT: infatti non ne ho.. =(
Comunque, ho misurato la tensione in uscita dal sensore.. sia con l'illuminazione che senza lui fa uscire sempre 0.25v.. Perchè poi arduino me lo legge diversamente se la tensione in uscita è sempre la stessa???

Perché cambia la tensione di riferimento, che normalmente è quella presente su VCC.
Puoi provare col consiglio di Paolo, inserendo nel pin AREF una tensione a 5V stabili, settando la tensione di riferimento su EXTERNAL con analogReference e poi leggendo il sensore.
Ricordati le masse in comune fra l'Arduino e l'alimentatore esterno.

Attualmente non ho niente da 5v da dargli al pin AREF.. In ogni caso ho settato l'analogReference ad INTERNAL, ed ovviamente dal punto AREF mi escono 1.1v.. Ho modificato la formula in modo che mi calcoli la temperatura basandosi sugli 1.1, misurando il punto AREF resta stabile sia che metto, sia che tolgo l'illuminazione all'lcd.. Ma la temperatura cambia lo stesso..

Mi sa che non ho capito bene come funziona sta analogReference :astonished:

Se imposti l'ADC per usare la tensione a 1,1V devi anche adattare la tensione in ingresso sui pin analogici affinché vari da 0 a 1,1V altrimenti non c'è proporzione fra il valore letto ed il riferimento.
Solo che perdi in range, come ti aveva detto anche Paolo.

leo72:
Se imposti l'ADC per usare la tensione a 1,1V devi anche adattare la tensione in ingresso sui pin analogici affinché vari da 0 a 1,1V altrimenti non c'è proporzione fra il valore letto ed il riferimento.
Solo che perdi in range, come ti aveva detto anche Paolo.

Ehm.. e come faccio ad adattarla sui pin..!? È una cosa software o hardware???

Comunque (se non sto sparando una cavolata) in uscita dal sensore leggo più o meno 0.2v stando a 20°C.. Anche se lo riduco a 1.1v penso di stare nel range che mi serve.. Se misuro delle temperature penso che mi servono al massimo tra i 10 e i 40°C..

LM35 se non sbaglio varia da 0 a 150°C ogni 10mv, quindi al massimo misuri 110°
Per la temperatura ambiente è sufficiente, ma non puoi andare sotto zero per le temperature invernali in nord italia.
Per adattare la tensione potresti usare un partitore resistivo, ma non hai questa necessità.

Controlla la tensione in entrata all'LM ed in uscita, dovrebbe rimanere stabile anche accendendo o spegnendo il display.

In uscita resta stabile, in entrata varia..

Se, a temperatura costante, l'uscita è stabile, ed il riferimento dell'ADC è interno, la temperatura non può variare.

Forse mi sto sbagliando io.. La tensione in entrata al sensore è quella che prendo da 5v di arduino, e quella in uscita è quella che mando al pin A0.. giusto?

Giusto.
Quindi se la tensione in uscita dal sensore, che è proporzionale alla temperatura non varia: come ti fa a variare la temperatura letta sul display?

È quello che mi son chiesto anch'io ieri sera..

AleCune93:
Comunque, ho misurato la tensione in uscita dal sensore.. sia con l'illuminazione che senza lui fa uscire sempre 0.25v.. Perchè poi arduino me lo legge diversamente se la tensione in uscita è sempre la stessa???

E la risposta di leo è stata

leo72:
Perché cambia la tensione di riferimento, che normalmente è quella presente su VCC.

Che sarebbe stato vero se tu non usassi l'AnalogReference(INTERNAL);

Oddio non saprei proprio cosa dirti.. Provo a postare il codice, magari ho sbagliato io a scrivere qualcosa.. Comunque ho roprovato, confermo che la tensione in uscita dal sensore è sempre 0.25v..

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

float val;

void setup(){
  pinMode(A0, INPUT);
  analogReference(INTERNAL);
  Serial.begin(9600);
  lcd.begin(16,2);
  lcd.print("Inizio...");
  delay(500);
}

void loop(){
  lcd.clear();
  val=0;
  
  //leggo valore pin A0
  for(int i=0;i<10;i++){
    val=val+analogRead(A0);
  }
  val=val/10;
  Serial.print("analogRead(A0): "); Serial.println(analogRead(A0)); //stampo analog A0
  
  //converto in temperatura 1.1v
  lcd.setCursor(0,0);
  lcd.print("Temp 1: ");
  lcd.print((1.1 * float(val) * 100.0) / 1024.0);
  lcd.print("^C");
  
  //converto in temperatura 5v
  lcd.setCursor(0,1);
  lcd.print("Temp 2: ");
  lcd.print((5.0 * float(val) * 100.0) / 1024.0);
  lcd.print("^C");
    
  delay(1000);
}

Mi sono messo a giocare col tuo codice

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup(){
  pinMode(A0, INPUT);
  analogReference(INTERNAL);
  Serial.begin(9600);
  lcd.begin(16,2);
  lcd.print("Inizio...");
  delay(500);
}

void loop(){
  lcd.clear();
  float temperature = LM35temp(A0, 1.1, 10);
  lcd.setCursor(0,0);
  lcd.print("Temp : ");
  lcd.print(temperature);
  lcd.print("^C");
  delay(1000);
}

float LM35temp(byte p, byte ref, byte cycle)
{
  float readed = 0;
  //leggo valore pin A0
  for(int i=0; i<cycle; i++){
    readed += analogRead(p);
  }
  readed /= cycle;
  Serial.print("analogRead("); 
  Serial.print(p); 
  Serial.print("): "); 
  Serial.println(readed); //stampo la media della lettura
  return (ref * readed * 100.0) / 1024.0;
}

Ho messo una funzione dove gli passi il pin, il riferimento e il numero di letture e restituisce un float con la temperatura.

L'oscillazione data dall'accensione del display l'ho sperimentata anch'io tempo fa, secondo me se alimenti a parte il display risolvi i tuoi problemi, l'Arduino prende l'alimentazione dalla porta USB e può darsi che tra quello che consuma la scheda e quello che consuma il tuo display, l'assorbimento sia al limite e causi quel calo di tensione che misuri, che poi ti altera la lettura del sensore.

Scusate il ritardo, ma ultimamente sono un pò incasinato con la scuola XD

Comunque, proverò quel codice.. Anche se odio le funzioni di questo tipo, non sono mai riuscito a capirle =(

Leo, però se io alimento a parte il display, ci sarà sempre qualcosa che mi prenderà energia, anche un semplice led.. Quindi alla fine non risolvo nientre

Un led sono una decina di mA, la retroilluminazione di un display possono essere 100 mA come anche di più, a seconda del modello (io ne ho uno che "succhia" 240 mA!). Insomma, un display lo senti.
Prova mettendo il display alimentato a parte ed il C da 0.1uF ceramico tra Vin e Gnd dell'LM35 come ti avevo detto, che dovrebbe ovviare agli sbalzi di piccola entità.

Buongiorno a tutti, effettivamente anche io mi sono imbattuto nello stesso problema, quando aggiungo un carico (led,relè, o altro) mi varia l'uscita del sensore.Usare uno zener da 3.3v sull'uscita 5v potrebbe stabilizzare la lettura?