help with Temperature sensor TMP36

Hey guys,

im trying to build an arduino project to send temperatures from my temperature sensor TMP36 to my webserver.
But there is one problem.
In the first step i get the voltage of my sensor. Its around 0.74 V. When i now add the ethernet Shield on my arduino uno und check the voltage again i get 3.22 V. Both times my read from analog port A0. To calculate the temperature i must substract 0.5 from my voltage and multiplicate it with 100. But with the ethernet shield there are wrong values. I tryed to substract 2.48 V from my Voltage value. But there is the next problem. When i touch the sensor my voltage goes down. When i do the same without ethernetShiel my Voltage goes up. That is correct.

Can you explain me, why i get this problem and to fix it ?

That is the Code i used:

"
//TMP36 Pin Variables
int sensorPin = 0; //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 ((voltage - 500mV) times 100)
Serial.print(temperatureC); Serial.println(" degrees C");

// now convert to Fahrenheit
float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
Serial.print(temperatureF); Serial.println(" degrees F");

delay(1000); //waiting a second
}
"

You haven't said which ethernet shield you are using, but does it use any of the pins that you are using in this project?

Im using Ethernet Shield w5100 and using the ports A0 (Analog) 5V and Ground (Gnd)

And D0 & D1 for serial comms? There are several different ethernet shields, I don't know which one you have - not that it would make much difference, I was only offering a suggestion for you to consider.

Im using the ethernet Shield in Version V1 . There are no Pins D0 and D1 for serial communication. :frowning:

Sounds like the shield is putting 3.22 volts on your A0 pin, can you connect the TMP36 to a different analog pin?

Some shields (e.g. LCD shields with buttons) use A0, but I don't think an ethernet shield does.
Not a good idea to measure a TMP36 with the potentially unstable 5volt default Aref.
Try this sketch. It uses the internal 1.1volt Aref. And no silly intermediate voltage steps.
Power the TMP36 from the potentially cleaner 3.3volt pin.
Change to a different analogue input if needed.
Or use the less problematic digital DS18B20 if you can't get it right.
Leo..

// TMP36 temp
// calibrate temp by changing the last digit(s) of "0.1039"

float tempC; // Celcius
float tempF; // Fahrenheit

void setup() {
  analogReference(INTERNAL); // use internal 1.1volt Aref
  Serial.begin(9600);
}

void loop() {
  tempC = ((analogRead(A0) * 0.1039) - 50.0); // calibrate here
  tempF = tempC * 1.8 + 32; // C to F

  Serial.print("Temperature is  ");
  Serial.print(tempC, 1); // one decimal place
  Serial.print(" Celcius  ");
  Serial.print(tempF, 1);
  Serial.println(" Fahrenheit");

  delay(1000); // use a non-blocking delay when combined with other code
}

P.S. only downside with a TMP36 and 1.1volt Aref is a temp limit of about 55C (~130F).