Go Down

Topic: Problema con il sensore di misura TMP36 (Starter kit) (Read 1 time) previous topic - next topic

jackbell16

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° ?

astrobeed


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.


jackbell16

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 ?

jackbell16

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:

Code: [Select]
// 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.

https://www.dropbox.com/s/l4c8iniuhmxzaa2/Foto%2026-02-13%2016%2041%2021.jpg

Secondo voi, qual'è il problema ?

Michele Menniti

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:
Quote
....il valore della temperatura è diverso da quello reale.....Secondo voi, qual'è il problema?

:smiley-sweat:
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Go Up