WiFi Thermometer

I got myself a smoker a last year. While trying the first pulled pork and brisket I always ran in the same kind of problem - my radio thermometer's range was not sufficient and it supported only one thermometer.
Whenever I went to the other end of the house, I lost signal and if I left the building to run some errands there was no chance to have control of the smoker. So I decided there must be a better approach which gives me the possibility to monitor the thermometers from all over the world.

In the end, I started to build a WiFi Thermometer based on an Arduino Yun as well as an app.

Architecture

The architecture is straight forward whereby the Thermometer itself behaves like a REST server which is actually only returning the temperatures in a JSON format.

The JSON Schema:

    

    

So an example JSON which is returned might look like:

    
{ "temperatures": [100, 60, 60, 110] }
    

Electrical Schema

To explain the electrical schema a bit. 

  • POWER-1 is Vcc
  • POWER-2 is GND
  • OUTLET-x-y are the connectors to the Arduino
  • THERMOMETER-x-y are the connectors to the thermometer sensors (in & out)
  • Rx are the series restistances (10k Ohm)

Steinhart-Hart - Coefficients

What took me a while what that there is something which is called Steinhart-Hart-Coefficients. With these coefficients it is possible to calculate the resistance of the thermometer by temperature as well as the temperature by the resistance of the thermometer.

Based on the documentation my thermometer sensor works in a range of 0C to 250C, so I took the resistance values at: +14C, +110C, +220C. Then I entered these values in this wonderful website [1] which calculated the coefficients A, B & C for me.

For the Arduino I created following method to calculate the temperature:

    
#define COEFFICIENT_A 0.0006244454685488767
#define COEFFICIENT_B 0.00022591604519320394
#define COEFFICIENT_C -1.833995646313987e-8

#define Vcc 5000.0f
#define RFix 10000.0f // series resistance

float getTemperatureNew(int pin_to_read) {
	int sensorValue = analogRead(pin_to_read);
	double R = RFix * ( 1023 - sensorValue ) / sensorValue; // resistance on thermometer sensor
	double temperature = 1.0f / ( COEFFICIENT_A + COEFFICIENT_B * log(R) + COEFFICIENT_C * pow(log(R), 3) ) - 273.15f;
	return temperature;
}
    

References