Go Down

Topic: Calcoli per temperatura con LM35DZ (Read 3315 times) previous topic - next topic

AleCune93

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  :smiley-eek:

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.


AleCune93


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

PaoloP

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.

AleCune93

In uscita resta stabile, in entrata varia..

PaoloP

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

AleCune93

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?

PaoloP

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?

AleCune93

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

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

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

PaoloP

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

AleCune93

#25
Apr 11, 2013, 05:28 pm Last Edit: Apr 11, 2013, 05:51 pm by AleCune93 Reason: 1
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..

Code: [Select]
#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);
}

PaoloP

Mi sono messo a giocare col tuo codice
Code: [Select]
#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.

leo72

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.

AleCune93

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

leo72

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à.

Go Up