Problema con il sensore di misura TMP36 (Starter kit)

Salve a tutti,
sono un nuovo utente di questo forum. Mi presento, sono Giacomo Bellazzi e sono uno studente del secondo anno della Facoltà di Ingegneria Elettronica e Informatica a Pavia. Ho da poco conosciuto Arduino, però mi sono già appassionato. Avevo in mente di creare una piccola stazione meteo in casa. Tuttavia, ho dei problemi con il sensore di temperatura presente nello starter kit. Infatti, utilizzando il condice presene sul sito Google Code Archive - Long-term storage for Google Code Project Hosting., dal seriale ottengo lettere a caso e non i valori della temperatura. Con altri codici, ottengo delle temperatura, che non sono corrette. Ora ho collegato l'Arduino via USB, con tre cavi, che vanno dal 5V, A0, Ground a rispettivamente, il lato sinistro, centrale e destro del sensore di temperatura. Secondo voi, qual'è il problema ? Grazie in anticipo.

Ne stiamo discutendo in un'altro post --> http://arduino.cc/forum/index.php/topic,142945.0.html
anche se il sensore è leggermente diverso.

Paolo, forse conviene che resti qui, altrimenti quando lì si ricomincia ci incasiniamo con le differenze di calcolo e di sketch :sweat_smile:
jack, intanto comincia a postare lo schema dei collegamenti, il datasheet del componente e lo sketch che stai usando, mica ti si può leggere nel pensiero!! Per caso il sensore riscalda?

Ciao Michele, grazie per la risposta. Si in effetti scalda abbastanza. Ecco lo schema del circuito:
Dropbox - Error - Simplify your life (Vettoriale) e Dropbox - Error - Simplify your life (Quello Reale, da notare che ho provato sia a collegare il + a 3.3 V, che a 5 V)

Ci sono alcune varianti, ho installato la scheda WiFi, e c'è lo schermo ed un potenziometro, che sono solo inseriti, ma non rivestono nessun ruolo nel circuito (non volevo rovinar i pin). In allegato c'è il main del programma (è lo stesso di quello presente nella sezione playground). Quale programma viene utilizzato per creare i circuiti, come quello che ho postato (vettoriale) ? Grazie in anticipo per l'assistenza.

jackbell16:
Ciao Michele, grazie per la risposta. Si in effetti scalda abbastanza

Scalda perché l'hai connesso al contrario, l'immagine di fritzing delle connessioni è giusta, nella foto si vede che il TMP36 è montato girato di 180°, ovvero hai messo il +5V su GND e viceversa.

Ciao jackbell16,
un piccolo appunto.
Quando viene chiesto lo sketch che si sta usando è buona norma copiare quello scritto sull'IDE di Arduino, che poi verrà compilato e caricato sul microcontrollore.
E' abbastanza inutile copiare i codici o le immagini da siti internet o da altre fonti.
Infatti nella trascrizione o modifiche del codice potrebbe essere sfuggito qualcosa.
E' come se andassi dal meccanico ed invece di portagli la macchina gli portassi il deplian preso in concessionaria... tanto è uguale. :astonished:

Per riportare i codici sul forum usa i tag CODE che trovi premendo il tastino # sopra le faccine dell'editor.

così :-)

Grazie. :smiley:

Grazie Paolo per i consigli su come scrivere correttamente un post. Ecco il main che vado a compilare e che mi da dei problemi:

#include "TemperatureTMP.h"

TemperatureTMP Temperature;
float temperature;

void setup()
{
  Serial.begin(115200);
  Temperature.begin(A0);
}

void loop()
{
  temperature = Temperature.getTemperatureCelcius();
  Serial.print("Temperature: ");
  Serial.println(temperature,1);
  delay(500);
}

Lo schema del circuito è il seguente:
Ho ruotato il sensore di temperatura, il 5 volt va al segno +, il ground va al segno -. Da li vanno due cavi che vanno rispettivamente al lato sinistro e destro dal sensore/trasduttore. Il cavo il centrale, va al pin A0. L'output è una riga di lettere a caso. A cosa può essere dovuto ? Grazie in anticipo.

jackbell16:
pin A0. L'output è una riga di lettere a caso. A cosa può essere dovuto ? Grazie in anticipo.

Molto probabilmente hai fritto il sensore alimentandolo al contrario.

Cambia questo:

Serial.println(temperature,1);

In questo:

Serial.println(temperature, DEC);

Esce qualcosa di sensato?
(DEC vale 10), quell'"1" non so cosa faccia stampare)

leo72:
(DEC vale 10), quell'"1" non so cosa faccia stampare)

Temperature è stato definito come float, il ",1" vuol dire che stampa il valore con una sola cifra decimale.

No, purtroppo non cambia nulla. Ecco l'output in allegato. Non escludo che il sensore si sia bruciato, a causa del cambiamento del polo. Cosa consigliate come sostituto, qualora sia effettivamente bruciato ? Può andare bene il DHT11 ?

Dal punto di vista teorico avrei qualche domanda/curiosità. Il circuito così formato, risulta composto da un generatore e da una resistenza in serie. La resistenza in serie vale: $$ R=\frac{1}{\sigma} \frac{l}{A} $$, qualora la temperatura fosse costante. La variazione di temperatura, porta a questa formula: $$ R=R_0 [1 + \alpha(T-T_0)] $$. Quanto vale, la resistenza a 20° ?

jackbell16:
No, purtroppo non cambia nulla. Ecco l'output in allegato.

Nello sketch la seriale è impostata a 115200 bps, il terminale seriale a 300 bps, è più che normale che vedi "monnezza", imposta tutti e due allo stesso valore, consigliato 9600 per le prove.

Ecco l'errore ! Io cambiavo solo tali valori ne seriale, mentre avrei dovuto notare il valore diverso nel main ! Ora funziona tutto alla perfezione. La temperatura è giusta, penso ci sia al massimo una differenza di 1°. Il passo successivo, è quello di impostare una piccola stazione meteo. Se volessi vedere i valori della temperatura da remoto (anche in LAN), cosa cambia all'interno del codice ? Basta inserire la parte di codice per la componente WiFi ?

Salve a tutti,
dopo un periodo in cui ho provato a visualizzare correttamente la temperatura sul seriale, ho deciso da qualche giorno ad installare un display LCD, per visualizzare la temperatura. Purtroppo, il valore della temperatura è diverso da quello reale. Ecco il codice del programma:

// An example of displaying temperature on LCD.
// Temp sensor is TMP36.
// TMP36 --- Arduino --- LCD.
// by MHLAB
// 5/2012
// 
// References
// http://arduino.cc/en/Tutorial/LiquidCrystal
// http://www.ladyada.net/learn/sensors/tmp36.html

#include <LiquidCrystal.h>
#define aref_voltage 3.30 // To set the aref to ~3.3v

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// Variables to control the reading time interval and to average the reading:
int index = 0; // the index of the current reading
int readings = 0; // the readings from the analog input
unsigned long total = 0; // the sum of total readings
float average = 0.0; // the average of readings
float temp1 = 0.0; // temp oC of sensor 1

unsigned long time1 = 0; // Timing 1
unsigned long time2 = 0; // Timing 2

// constants won't change
const int numReadings = 1000; // sampling numbers for analog readings
const unsigned long timeInterval = 1000; // Setting for the interval of the output

// Pin numbers asignment TMP36 sensors
int inputPin1 = A1; // Read voltage of sensor tmp36

void setup()
{
  analogReference(EXTERNAL); // To set the aref to something other than 5v
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD starting at [0,0]
  lcd.print("--Temperature--");
}

void loop() {
  // Get the time by millis()
  time1 = millis();

  // reading average ADC of sensor 1
  average = averageTempAd(inputPin1);
  // convert ADC and convert it to Celsius
  temp1 = temperatureSensorTMP35(average); 

  // Print out to LCD
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(temp1);
  lcd.print(char(223));
  lcd.print("C");
  lcd.print("/");

  // Print out to LCD (oF)
  // set the cursor to column 8, line 1
  lcd.setCursor(8, 1);
  lcd.print(temp1*9/5+32.0);
  lcd.print(char(223));
  lcd.print("F");

  // Controll the data output timing: Using millis()
  while(time1 + timeInterval > millis()){
    // do nothing
  }
}

// Average temp function
float averageTempAd(int pinNumber){
  int aveADC;
  while (index < numReadings){
    readings = analogRead(pinNumber);
    // add the reading to the total:
    total= total + readings; 
    // advance to the next position in the array: 
    index = index + 1;
  }

  // Average AD number of temp
  aveADC = total / numReadings;

  // ...reset, wrap around to the beginning:
  index = 0; 
  total = 0;

  return aveADC;
}

// --- Convert to digit number to Temp oC ---
// TMP35 Temperature sensor calculation
// rawADC (10bit = 1024) to Temp (oC)
// Schematic:
// [Arduino] -- {TMP35}
// [Vcc (5 or 3.3v)] -- {Pin#1}
// [A1] -- {Pin#2} 
// [Ground] -- {Pin#3}
// converting from 10 mv per degree wit 500 mV offset
// to degrees ((volatge - 500mV) times 100)
 
float temperatureSensorTMP35(float rawADC) {
  float Temp; // Dual-Purpose variable to save space
  Temp = rawADC*aref_voltage/1024.0; // convert from Digital to voltage.
  Temp = (Temp - 0.5) * 100.0 ; // convert to oC
  return Temp; 
}

Ed ecco com'è composto il piccolo circuito.

Secondo voi, qual'è il problema ?

Ascolta, il modo più semplice per trovare una soluzione che, nello specifico, è quasi certamente nella manipolazione della formula di conversione, consiste nell'usare un foglio di calcolo e creare due colonne, nella prima inserisci il valore di temperatura "reale", ovvio che ti serve come riferimento un misuratore SERIO, nella seconda inserisci i valori letti dal tuo circuito; queste due colonne devono abbracciare l'intero range di tuo interesse, p.es. da -10°C a +45°C ed i valori li metti in ordine di temperatura reale, così:
Reale Misura
-3 2
0 4
3 6
8 11
15 16
18 20
...... .....
...... .....
40 38

poi fai due bei grafici di comparazione e posti qui un'immagine con tabella misure e grafici. Ecco questo è il modo di porre correttamente la domanda:

....il valore della temperatura è diverso da quello reale.....Secondo voi, qual'è il problema?

:sweat_smile: