Loading...
Pages: 1 [2] 3   Go Down
Author Topic: letture errate sensore lm35dz  (Read 953 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve ragazzi,
anche io ho lo stesso problema di lettura errata!

Ho fatto un test con due tutorial diversi ed ho risultati totalmente diversi!

-TUTORIAL UNO-

Schema Fritzing



Codice usato

Code:
/*
 An open-source LM35DZ Temperature Sensor for Arduino. This project will be enhanced on a regular basis
 (cc) by Walter Esposito , http://www.arduinoproject.it
 http://creativecommons.org/license/cc-gpl
 */

float tempC;      //dichiarazione di variabile
int tempPin = A0;  //inizializzazione del pin di Arduino

void setup()
{
Serial.begin(9600); //apertura porta seriale, set della velocità a 9600 bps
}

void loop()
{
tempC = analogRead(tempPin);           //lettura valore del sensore
tempC = (5.0 * tempC * 100.0)/1024.0;  //conversione del dato analogico in temperatura
Serial.println(tempC);             //invia i dati alla seriale
Serial.print(" Celsius, ");

delay(1000);                           //aspetta 1 secondo prima di ripetere
}

Uscita seriale

Code:
Celsius, 0.00
Celsius, 499.51
Celsius, 499.51
Celsius, 499.51
Celsius, 0.00
Celsius, 0.00
Celsius, 0.00
Celsius, 0.00
Celsius, 0.00
Celsius, 371.09
Celsius, 499.51
Celsius, 499.51
Celsius, 193.36
Celsius, 0.00
Celsius, 0.00
Celsius, 0.00
Celsius, 0.00
Celsius, 380.86
Celsius, 499.51
Celsius, 499.51

A questo punto penso che il mio sensore non funzioni correttamente.
Provo quindi un altro tutorial

-TUTORIAL DUE-

Schema Fritzing



Codice usato

Code:
//TMP36 Pin Variables
int sensorPin = A0; //the analog pin the TMP36's Vout (sense) pin is connected to
                        //the resolution is 10 mV / degree centigrade with a
                        //500 mV offset to allow for negative temperatures
 
/*
 * setup() - this function runs once when you turn your Arduino on
 * We initialize the serial connection with the computer
 */
void setup()
{
  Serial.begin(9600);  //Start the serial connection with the computer
                       //to view the result open the serial monitor
}
 
void loop()                     // run over and over again
{
 //getting the voltage reading from the temperature sensor
 int reading = analogRead(sensorPin); 
 
 // converting that reading to voltage, for 3.3v arduino use 3.3
 float voltage = reading * 5.0;
 voltage /= 1024.0;
 
 // print out the voltage
 Serial.print(voltage); Serial.println(" volts");
 
 // now print out the temperature
 float temperatureC = (voltage - 0.5) * 100 ;  //converting from 10 mv per degree wit 500 mV offset
                                               //to degrees ((volatge - 500mV) times 100)
 Serial.print(temperatureC); Serial.println(" degrees C");
 
 // now convert to Fahrenheight
 float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
 Serial.print(temperatureF); Serial.println(" degrees F");
 
 delay(1000);                                     //waiting a second
}

Uscita seriale

Code:
0.15 volts
-35.35 degrees C
-31.63 degrees F
0.15 volts
-35.35 degrees C
-31.63 degrees F
0.14 volts
-35.84 degrees C
-32.51 degrees F
0.15 volts
-35.35 degrees C
-31.63 degrees F
0.15 volts
-35.35 degrees C
-31.63 degrees F
0.15 volts
-35.35 degrees C
-31.63 degrees F
0.14 volts
-35.84 degrees C
-32.51 degrees F
0.14 volts
-35.84 degrees C
-32.51 degrees F
0.14 volts
-35.84 degrees C
-32.51 degrees F
0.15 volts
-35.35 degrees C
-31.63 degrees F
0.15 volts
-35.35 degrees C
-31.63 degrees F
0.15 volts
-35.35 degrees C
-31.63 degrees F

Qua le cose sembrano andare meglio dal punto di vista della stabilità delle letture ma sono sempre errate perché sono tutte negative, forse perché ho un voltaggio di riferimento errato poichè reputo che nella mia stanza ci siano 15/17 gradi!

Per tutti e due i tutorial ho usato la mia Arduino UNO rev.3 con sensore di temperatura LM35DZ.
Potete aiutarmi a capire dove sta l'errore?
Grazie!
« Last Edit: February 03, 2013, 06:43:42 am by ClaudioF » Logged

Cagliari
Online Online
Faraday Member
**
Karma: 49
Posts: 3030
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prova con questo codice e dicci i risultati che visualizzi nel serial monitor
Code:
#define tempPin A0 //inizializzazione del pin di Arduino

int lettura = 0; // impostazione valore iniziale della variabile
int media = 30; //n° letture per calcolo media

void setup()
{
  Serial.begin(9600); //apertura porta seriale, set della velocità a 9600 bps
  // analogReference(INTERNAL); //setta il riferimento interno a 1,1V
}

void loop()
{
  lettura = 0; //azzera il totalizzatore
  for (int i = 0; i < media; i++) {
    lettura += analogRead(tempPin); //totalizza tutti i valori letti dall’ADC
  }
  lettura = lettura / media; //calcolo del valore medio di lettura
  Serial.print(lettura); //lettura valore ADC
 Serial.print(" --> ");
 Serial.println((float)((500*lettura)/1023.0));
 delay(1000); //pausa
}
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
30 --> 14.66
31 --> 15.15
31 --> 15.15
31 --> 15.15
31 --> 15.15
30 --> 14.66
31 --> 15.15
31 --> 15.15
31 --> 15.15
30 --> 14.66
31 --> 15.15
30 --> 14.66
30 --> 14.66
31 --> 15.15
31 --> 15.15
30 --> 14.66
30 --> 14.66
31 --> 15.15
31 --> 15.15
31 --> 15.15
30 --> 14.66
30 --> 14.66
31 --> 15.15
31 --> 15.15
31 --> 15.15
31 --> 15.15
30 --> 14.66
30 --> 14.66
31 --> 15.15
31 --> 15.15
31 --> 15.15
31 --> 15.15
30 --> 14.66

Direi perfetto! Dove sta l'inghippo?
Logged

Cagliari
Online Online
Faraday Member
**
Karma: 49
Posts: 3030
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Credo ci sia un errore nella formula dei 2 sketch precedenti.
Ma al momento no ho molta voglia di spulciarli.  smiley-sad-blue
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie tante @PaoloP, vedo di spremere le meningi e capirlo da me!
Ho notato un'altra stranezza posizionando un ventilatore ad aria calda vicino al sensore.
All'aumento della temperatura, sopra i 30.77° la temperatura passa in negativo e dimiusce, spegnendo il ventilatore la temperatura negativa aumenta e ritorna positiva nuovamente intorno ai 30.77°!

Code:
60 --> 29.33
59 --> 28.84
58 --> 28.35
57 --> 27.86
56 --> 27.37
55 --> 26.88
55 --> 26.88
54 --> 26.39
55 --> 26.88
57 --> 27.86
60 --> 29.33
62 --> 30.30
64 --> 31.28
67 --> -31.32
69 --> -30.34
71 --> -29.36
73 --> -28.38
74 --> -27.89
76 --> -26.92
77 --> -26.43
79 --> -25.45
80 --> -24.96
81 --> -24.47
82 --> -23.98
83 --> -23.50
84 --> -23.01
85 --> -22.52
86 --> -22.03
87 --> -21.54
88 --> -21.05
88 --> -21.05
89 --> -20.56
90 --> -20.07
90 --> -20.07
90 --> -20.07
91 --> -19.59
91 --> -19.59
92 --> -19.10
92 --> -19.10
93 --> -18.61
93 --> -18.61
94 --> -18.12
94 --> -18.12
94 --> -18.12
94 --> -18.12
92 --> -19.10
90 --> -20.07
87 --> -21.54
85 --> -22.52
83 --> -23.50
81 --> -24.47
79 --> -25.45
78 --> -25.94
76 --> -26.92
75 --> -27.41
73 --> -28.38
72 --> -28.87
70 --> -29.85
70 --> -29.85
68 --> -30.83
68 --> -30.83
67 --> -31.32
66 --> -31.80
66 --> -31.80
65 --> 31.77
64 --> 31.28
64 --> 31.28
63 --> 30.79
Logged

Cagliari
Online Online
Faraday Member
**
Karma: 49
Posts: 3030
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Colpa mia.
Moltiplicando 500*lettura si supera il limite massimo per gli interi e viene segnato un numero negativo.
Quote
On the Arduino Uno (and other ATMega based boards) an int stores a 16-bit (2-byte) value. This yields a range of -32,768 to 32,767 (minimum value of -2^15 and a maximum value of (2^15) - 1).

Prova modificando il codice così: dai int a float.
Code:
#define tempPin A0 //inizializzazione del pin di Arduino

float lettura = 0; // impostazione valore iniziale della variabile
int media = 30; //n° letture per calcolo media

void setup()
{
  Serial.begin(9600); //apertura porta seriale, set della velocità a 9600 bps
  // analogReference(INTERNAL); //setta il riferimento interno a 1,1V
}

void loop()
{
  lettura = 0; //azzera il totalizzatore
  for (int i = 0; i < media; i++) {
    lettura += analogRead(tempPin); //totalizza tutti i valori letti dall’ADC
  }
  lettura = lettura / media; //calcolo del valore medio di lettura
  Serial.print(lettura); //lettura valore ADC
 Serial.print(" --> ");
 Serial.println((float)((500*lettura)/1023.0));
 delay(1000); //pausa
}
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ora va tutto bene!
Non vorrei prendere tutto alla carlone, puoi spiegarmi meglio come funziona, se puoi e ti va?
Grazie!
Logged

Cagliari
Online Online
Faraday Member
**
Karma: 49
Posts: 3030
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Puoi leggere le pagine di questa guida
--> http://www.html.it/pag/15396/cosa-sono-le-variabili/
--> http://www.html.it/pag/15397/le-variabili-in-c/
e poi il reference di Arduino
--> http://arduino.cc/en/Reference/VariableDeclaration

Lo spiegano molto meglio di come te lo spiegherei io. Credimi.  smiley-mr-green
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie tante! smiley
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Puoi leggere le pagine di questa guida
--> http://www.html.it/pag/15396/cosa-sono-le-variabili/
--> http://www.html.it/pag/15397/le-variabili-in-c/
e poi il reference di Arduino
--> http://arduino.cc/en/Reference/VariableDeclaration

Lo spiegano molto meglio di come te lo spiegherei io. Credimi.  smiley-mr-green

Solo una cosa non riesco a capire, perché hai commentato il comando analogReference? Se lo decommento i risultati sono diversi! Non riesco proprio a capirlo!
Logged

Genova
Offline Offline
Edison Member
*
Karma: 14
Posts: 2451
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quel reference fissa gli input a 1,1 volt, se lo usi devi inserire sui pin analog tensioni non superiori a 1,1 altrimenti friggi il chip
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

L'ho eliminato e le temperature misurate solo le stesse, ovviamente, che commentato!
Però non riesco a capire perché consigliano di mettere l'analogReference per avere una misura migliore, perché mi dà 80° con l'analogReference e 18° senza!
Logged

Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16509
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

L'analogReference fissa il riferimento di tensione per la lettura analogica.
Se è INTERNAL viene usata una tensione di 1,1V.
Se non è specificata, viene usata DEFAULT che corrisponde alla tensione presente sul pin VCC.

Se VCC è 5V e la tensione sul pin analogico è 1V, la lettura sarà:
1023:x=5:1
x=(1023*1)/5=204

Ma se tu usi INTERNAL, il riferimento è 1,1V. Con la stessa tensione di 1V si avrà:
1023:x=1,1:1
x=(1023*1)/1,1=930

Come vedi, la stessa tensione dà 2 letture differenti
Logged


Cagliari
Online Online
Faraday Member
**
Karma: 49
Posts: 3030
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Con la variazione del reference, in base alla risposta del sensore, è possibile migliorare la risoluzione.
Infatti una cosa è misurare 1024 passi in un intervallo da 0 a 5V, un altre e misurare 1024 passi da 0 a 1,1V. Ogni passo avrà una migliore risoluzione.
Questo è possibile solo se la scala del sensore ha come valore massimo 1,1V. Ogni valore superiore satura l'ADC e da come risultato sempre 1023.
Logged


Genova
Offline Offline
Edison Member
*
Karma: 14
Posts: 2451
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si ma usando il reference non posso mettere un pin analog 1v e un altro analog a 5v, non danneggio il chip? sono poi obbligato a usarli tutti a 1v, forse mi confondo con AREF external.....
« Last Edit: February 05, 2013, 05:18:46 pm by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Pages: 1 [2] 3   Go Up
Print
 
Jump to: