Amplifier for PT1000 temperature sensor

Hi all.

I encountered strange problem.
I bought PT1000 3-wired temperature sensor with hope that its 1kOm resistance will allow to connect this sensor to Mega2560 without additional boards or resistors. It seems to be my mistake:).

After some googling I see that the best solution is to buy amplifier like adafruit max31865 BUT I can't find it in version for PT1000 (with delivery to Saint-Petersburg, Russia). Everything what I see is version for PT100 i.e. has resistor on 430 Om since as I understand I need version with resistor on 4300 Om. Maybe anyone could advice replacement for max31865 or something else?

In the worst case I'll be glad to see advice how to connect 3-wire PT1000 to Mega2560 without amplifier considering fact that I need to meausure temperature only in range 0 - 60 Celsium.

Thanks in advance.

The boards are the same with the exception of Rref which is either a 430 Ohm or 4300 Ohm resistor. The Rref designation is clear on the board so you would remove the Rref resistor labeled 4300 and replace it with a 4301 resistor. They use .1% precision resistors. The 4300 is 430 Ohms and the 4301 is 4300 Ohms.

Ron

Just use a 1K resistor (better, 1.1K made from 2 x 2.2K resistors in parallel) in a voltage divider arrangement, similar to the millions of posts and tutorials for Arduino with an LDR or thermistor.

You do not have to use a precision resistor if you are willing to calibrate the temperature sensor yourself. PT1000 sensors have a very linear response over the range 0 to 60 C.

However, if you want to measure temperatures to 1 C or better, you will need to use a better ADC than the one built in to Arduino. I use the absolute ADC ADS1115 (15 bits) module and measure both the input voltage to the divider and the output voltage, in order to form the required resistance ratio.

A ds18b20 is probably a better solution for measuring your temperature ?

jremington:
However, if you want to measure temperatures to 1 C or better, you will need to use a better ADC than the one built in to Arduino. I use the absolute ADC ADS1115 (15 bits) module and measure both the input voltage to the divider and the output voltage, in order to form the required resistance ratio.

Yes, I wanted to get temperature with decimals like 25.4 , 25.5 instead only 25 , 26 and so on. I tried with 1K resistor and it looks like there are big steps on analog input (I mean that analog input shows for example 437 and then 438 and it's bigger difference then 1 C).

I've ordered ADC ADS1115. Could you please share scheme of connection and maybe example of code if it's not difficult for you?

hammy:
A ds18b20 is probably a better solution for measuring your temperature ?

I'm not sure because I didn't find ds18b20 in "flat" form-factor, only in "cylinder". I want to have as much good contact between sensor and floor as possible. And since it will be in visible place then I wanted to have it looking nice (I mean I would like to avoid building some "boxes" for sensor). PT100/PT1000 are ideals because they are produced in "flat" form-factor also and very small and aesthetic:).

The Adafruit ADC 4 Channel Breakout gives a good overview and code samples.

Ron

Here is the code I use to measure temperatures with two PT1000 sensors and the ADS1115 from Adafruit, each in a 1K voltage divider. I calibrated both against a laboratory thermometer, over the range 0-30 C.

You can also use oversampling and averaging to get more bits out of the 10 bit ADC in the Arduino. Add up 64 measurements (as an unsigned long) and divide by 16 to get 12 bit resolution, for example.

#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads;

unsigned long currentM, lastM;
void setup(void)
{
  Serial.begin(9600);
  Serial.println("ADS1115 ADC");
  Serial.println("Single-ended readings from AIN0..3");
  Serial.println("ADC Range: +/- 6.144V (1 bit = 0.1875mV/ADS1115)");
  ads.begin();
}

long adc_long, adc_short, adc_vcc, adc_gnd;

void loop(void)
{

  adc_long = 0;
  adc_short = 0;
  adc_vcc = 0;
  adc_gnd = 0;

// collect and average 100 readings
  for (int i = 0; i < 100; i++) {
    adc_long += (signed long) ads.readADC_SingleEnded(0);
    adc_short += (signed long) ads.readADC_SingleEnded(1);
    adc_vcc += (signed long) ads.readADC_SingleEnded(2);
  }
  adc_long /= 100;
  adc_short /= 100;
  adc_vcc /= 100;

/*  
  Serial.print (adc_long);
  Serial.print( ", ");
  Serial.print (adc_short);
  Serial.print( ", ");
  Serial.print (adc_vcc);
  Serial.println();
*/

  float R_long = 1000.0*adc_long / (adc_vcc - adc_long);
  float R_short = 1000.0*adc_short / (adc_vcc - adc_short);

 float Tc_long = (R_long -1000.8)/3.808 - 0.054; //empirical offset to ice at 0
 float Tc_short = (R_short - 1005.8) / 3.776;  //no offset for this one (short leads)
  Serial.print(Tc_long);
  Serial.print(",");
  Serial.println(Tc_short);
 }