Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read temperature using arduino uno board with PT100 RTD sensor?

I am new to arduino programming. And almost inexperienced.

I am looking to program my arduino Uno board to read 2/3/4 wire configuration of PT100 RTD sensor (in accuracy levels of atleast 0.5°C). The temperature range is 0 to 400°C and -50 to 100°C.

Since I am totally new to this field I would appreciate a rather descriptive information with circuits and images and code.

I have researched a lot on the subject, but couldn't get anything useful or substantial to solve my problem.

Moreover, I cannot use thermistor or any IC to read the temperatures as the machine on which the RTD is installed has PIDs, but I would like to create a datalogger that can fetch temperatures on computer itself.

like image 320
Mayur Agarwal Avatar asked May 03 '15 10:05

Mayur Agarwal


People also ask

How do you find the temperature of a PT100 resistance?

The temperature coefficient (indicated by the Greek letter Alpha => α) of the Pt100 sensor is the difference between the resistance at 100°C and 0°C, divided by the resistance at 0°C multiplied by 100°C. We get a result of 0.003851 /°C.


1 Answers

PT100 increases its resistance as heat is applied. The temperature vs. resistance characteristic is described in pt100 resistance table

Arduino can read voltage on analog input. To get celsius degree readings we must:

  1. read analog input as voltage
  2. calculate resistance value (voltage divider)
  3. lookup celsius degree from table based on resistance

voltage divider

Vin is 5 volt from arduino R1 is a resistance of known value in my program it is 220 Ohm actually R2 is the pt 100 Vout has to be connected to arduino analog input pin (A0 for instance)

R2 = R1 * 1 / ( Vin / Vout - 1)

The circuit can be done based on the picture above it is fairly simple.

The sketch I wrote contains resistance data from 0C - 80C (can be extended easily) To get the degrees from resistance value I use my version of MultiMap function that uses one float array as resistance values and uses linear interpolation to calculate exact degrees

float in[] = { 100.00, 100.39, 100.78, 101.17, 101.56, 101.95, 102.34, 102.73, 103.12, 103.51,
               103.90, 104.29, 104.68, 105.07, 105.46, 105.85, 106.24, 106.63, 107.02, 107.40,
               107.79, 108.18, 108.57, 108.96, 109.35, 109.73, 110.12, 110.51, 110.90, 111.29,
               111.67, 112.06, 112.45, 112.83, 113.22, 113.61, 114.00, 114.38, 114.77, 115.15,
               115.54, 115.93, 116.31, 116.70, 117.08, 117.47, 117.86, 118.24, 118.63, 119.01,
               119.40, 119.78, 120.17, 120.55, 120.94, 121.32, 121.71, 122.09, 122.47, 122.86,
               123.24, 123.63, 124.01, 124.39, 124.78, 125.16, 125.54, 125.93, 126.31, 126.69,
               127.08, 127.46, 127.84, 128.22, 128.61, 128.99, 129.37, 129.75, 130.13, 130.52 };

// known resistance in voltage divider
int R1 = 217;

float MultiMap(float val, float* _in, uint8_t size)
{
  // calculate if value is out of range 
  if (val < _in[0] ) return -99.99;
  if (val > _in[size-1] ) return 99.99;

  //  search for 'value' in _in array to get the position No.
  uint8_t pos = 0;
  while(val > _in[pos]) pos++;  

  // handles the 'rare' equality case
  if (val == _in[pos]) return pos;

  float r1 = _in[pos-1];
  float r2 = _in[pos];
  int c1 = pos-1;
  int c2 = pos;

 return c1 + (val - r1) / (r2-r1) * (c2-c1);
}

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);

}
void loop() {
  // put your main code here, to run repeatedly:
   int pt100 = analogRead(A0);


   float Vout = pt100 * (5.0 / 1023.0);
   float R2 = R1 * 1/(5.0/Vout - 1);

float c =  MultiMap(R2,in,80);

Serial.print("Resistance: ");
Serial.print(R2);
Serial.println(" Ohm");

Serial.print("Temperature: ");
Serial.print(c);
Serial.println(" C");


delay(400);
}
like image 196
Chris Avatar answered Sep 22 '22 02:09

Chris