Go Down

Topic: Reading decimals of milivolts (Read 4908 times) previous topic - next topic


Jul 03, 2012, 06:35 pm Last Edit: Jul 11, 2012, 04:04 am by arka Reason: 1
Hi, I'm trying to read data from a pyrometer which gives me very low voltages as input.
The range is about 0 to 12mV, and  this represents temperatures from 0 to 1200ºC, so the decimals of milivolts are quite important to have some accuracy.
Problem is, how may I do this with Arduino?
I read a little about making a circuit with operational amplifiers (opamps), but it's quite a wild world to me as a beginner, so I'd love to have some specific help for this task.
I also wondered if I just could interface a digital polymeter, or some specific instrument to measure low voltages.


Multimeter, not polymeter.   Yes, that might be possible although the only Multimeter I have that can be interfaced takes USB rather than serial.

Pyrometer? You mean a thermocouple interface I think rather than a pyrometer (which is usually a radiation thermometer) - also search on these forums for people who've interfaced successfully to a thermocouple
[ I will NOT respond to personal messages, I WILL delete them, use the forum please ]


Thanks MarkT, and yes, both corrections are pertinent: it's a thermocouple what I'm trying to read. And eventually a multimeter what I may interface...


On board ADC has ~4.88mV/bit with onboard ADC and Aref at 5V.
If you use the internal 1.1V reference that can be brought down to 1.07mV/bit.
See section 24 of the '328 datasheet.

If your signal only goes to 12mV, you will not have much range, only 0 to 12.
Might want to look at a higher bit count ADC, or amplify your signal to  better match the Vref that is being used.
For example, a 12 Bit ADC would get you 1.22mV/bit, while a 16-bit ADC would provide 0.076mV/bit, assuming a 0-5V range on both.

MCP3208 is pretty easy to use for 12 bit

I haven't used this one, I don't imagine it would too much more difficult, altho the sampling rate is a lot slower.
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.


Not sure what device you are using that gives you only 12mv at 1200 C.  A K type thermocouple will give you about 50 mv at that temp and there is lots of devices that you can use to hook up to an Arduino to get the full benefit of  it's capabilities. There is also lots of code and diagrams on the net that will help you get something up and running.


You also need to read about "cold junction compensation" to allow the error that occurs due to ambient temperature at the display/amplifier device.


Normally for thermocouples you use an instrumentation amp specialised for the purpose - there are some that work from a single 5V rail which is ideal.  The amp boosts the thermocouple output to a sensible range and deals with cold junction compensation.  Search these forums for examples.
[ I will NOT respond to personal messages, I WILL delete them, use the forum please ]


has anyone tried the MAX31855 yet? ... I think that will allow temperature reads up to 1200C
I've seen code for it but haven't  protoed it up yet.


Even higher:

The MAX31855 performs cold-junction compensation and digitizes the signal from a K-, J-, N-, T-, S-, R-, or E-type thermocouple. The data is output in a signed 14-bit, SPI-compatible, read-only format. This converter resolves temperatures to 0.25°C, allows readings as high as +1800°C and as low as -270°C, and exhibits thermocouple accuracy of ±2°C for temperatures ranging from -200°C to +700°C for K-type thermocouples. For full range accuracies and other thermocouple types, see the Thermal Characteristics specifications in the full data sheet.

Need to read 4 bytes back every time, so like this for SPI interface:

Code: [Select]

    // read MAX31855 with 4 byte transfer
    digitalWrite (SS, LOW);
    dummyTemp = SPI.transfer (0);  // send anything out - MOSI not even connected - read in dummy data
    byte0 = SPI.transfer (0);          // dummy 0 byte out, read in 8 bits
    byte1 = SPI.transfer (0);          // dummy 0 byte out , read in 8 bits
    byte2 = SPI.transfer (0);          // dummy 0 byte out , read in 8 bits
    byte3 = SPI.transfer (0);          // dummy 0 byte out , read in 8 bits
    digitalWrite (SS, HIGH);

What you need to do with those 4 bytes all depends on what you have connected, as described on pages 9 & 10 of the datasheet:
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.


You may find something you can use here.  Open source hardware and software built around MCP3424 with CJC.



WOW! Thanks guys... I may have to retire my AD595.


I don't want to steal this thread  arca, but the following link is for a really inexpensive module that might do a real good job for you. I purchased one of these boards and have not gotten around to using it but from what others have said, it may be the best option for you as it is cheap,a simple hookup to the Arduino, and it looks like there is already a lot of code around that you could use.



Jul 11, 2012, 03:44 am Last Edit: Jul 11, 2012, 04:06 am by arka Reason: 1
Thanks a lot guys, I really think the Max31855 should do it. It really seems a fabulous option .

By the way, my thermopair is type -S (although it says it can read up to 1200ºC), and the goal it's to control an electric ceramic oven, so it will make nice temperature curves and the glazes will be happy.

Thanks again and may your wisdom be within my project. I'll try to keep this post updated with some results and (hopefully) the code I will use.


I'm stuck again. It seems I can't find the MAX interface for type S. I mean, i found the bare chip here
It's the 700-MAX31855SASA+ but I guess I'll need to build a suitable breadboard to work with...
But I'm not sure if I will need anything else apart form resistors and regular electronic stuff...
any idea?

Go Up