letture errate sensore lm35dz

Grazie tante! :slight_smile:

PaoloP:
Puoi leggere le pagine di questa guida
--> Cosa sono le variabili | Guida C | Programmazione HTML.it
--> Variabili in Double C: float, char, int e double | Guida C e C++ | HTML.it
e poi il reference di Arduino
--> http://arduino.cc/en/Reference/VariableDeclaration

Lo spiegano molto meglio di come te lo spiegherei io. Credimi. :grin:

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!

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

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!

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

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.

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

Di questo problema ne ha parlato Michele in un post. Se lo trovo metto qui il link.

Si può passare da internal ad external ma va messo una R sul pin Aref, altrimenti si crea un corto nel passaggio da un riferimento all'altro. C'è scritto nel datasheet nonché nel reference.

si, ma non hai risposto alla domanda riguardo ai danni, si danneggia o no se metto 5v a un pin con reference 1.1v? o leggo sempre high da 1.2v a 5v?

Da 1,1V in poi legge 1023. I danni avvengono se la tensione fornita al pin è superiore a quella max tollerata dal chip, 5,5V.

Magari dirò delle banalità o delle castronerie, ma giusto per capire se ho appreso il concetto!

Dal datasheed dell'Arduino vien fuori che il valore in uscita dall'analogico è:

ADC =Vin*1024/Vref

Quindi per calcolare la tensione in uscita dal sensore devo calcolare:

Vin = ADC*Vref/1024

con Vref:

  • 5000 (mV) se uso la DEFAULT (in realtà forse 5500 è meglio, visto che il tester in uscita ne segnava 5.5V),
  • 1100 se uso la INTERNAL.

A questo punto, poiché ogni 10 mV ho un grado centigrado misurato, per avere la temperatura non devo far altro che:

temp°C = Vin/10.

Spero di averci azzeccato!

Detto questo, ho dei grossi dubbi con Matlab poiché quando digito a.analogicRead(0), con sensore collegato al pin A0, escono valori totalmente fasulli!

Si.
Ricorda che il valore di Vin da te calcolato è in mV.

Se leggi direttamente il valore da analogRead ti restituisce un numero che varia tra 0 e 1023.

PaoloP:
Si.
Ricorda che il valore di Vin da te calcolato è in mV.

Ti riferisci al mio problema con Matlab?
Perchè su Arduino ne tengo conto, infatti utilizzo 5000(5500) ,1100 e 10 che sono appunto in millivolts!
Sarebbe meglio usare 5000 o 5500?

Per utilizzare il sensore sull'intero range ho visto, sempre dal datasheet, di collegare una resistenza, il cui valore viene calcolato in base alla tensione di entrata, in parallelo all'uscita; quella resistenza deve essere collegata a terra?

ma che sia la forma dei pin del sensore che fa a pugni con le bread-board?

No.
Deve essere collegata a una tensione negativa.
Se ne è parlato in un altro topic.
Ma se non ti serve misurare temperature inferiori allo zero puoi lasciare perdere.

lesto:
ma che sia la forma dei pin del sensore che fa a pugni con le bread-board?

Lo escluso, dalla uscita seriale di Arduino leggo la temperatura corretta!
Poi carico arduino su Matlab, roba di 60 secondi per cui la temperatura non dovrebbe cambiare poiché la misuro in regime stazionario, e i valori che vengono fuori non riesco a ricondurli con nessuna conversione!

Nel file adiosrv.pde (immagino che usi questo) la parte di codice che riguarda gli input analogici è questa

 /* s=30 means ANALOG INPUT *************************** */
      
      case 30:
      /* the second received value indicates the pin 
         from abs('a')=97, pin 0, to abs('p')=112, pin 15    */
      if (val>96 && val<113) {
        pin=val-97;                /* calculate pin          */
        agv=analogRead(pin);       /* perform Analog Input   */
	Serial.println(agv);       /* send value via serial  */
      }
      s=-1;  /* we are done with AI so next state is -1      */
      break; /* s=30 taken care of                           */

In pratica viene letto il valore dell'analogRead e sparato sulla seriale.
Quindi matlab riceve il valore nel range 0-1023.

PaoloP:
Nel file adiosrv.pde (immagino che usi questo) la parte di codice che riguarda gli input analogici è questa

 /* s=30 means ANALOG INPUT *************************** */

case 30:
     /* the second received value indicates the pin
        from abs('a')=97, pin 0, to abs('p')=112, pin 15    /
     if (val>96 && val<113) {
       pin=val-97;                /
calculate pin          /
       agv=analogRead(pin);       /
perform Analog Input   /
Serial.println(agv);       /
send value via serial  /
     }
     s=-1;  /
we are done with AI so next state is -1      /
     break; /
s=30 taken care of                           */



In pratica viene letto il valore dell'analogRead e sparato sulla seriale.
Quindi matlab riceve il valore nel range 0-1023.

Esatto, parlo proprio di questo!
Questa sera faccio ulteriori approfondimenti, grazie ragazzi!

Ovviamente approfondisco...dopo Homeland! XD