Several types of converters are available on Aliexpress to connect thermocouples. Thermocouples allow measuring very low and very high temperatures.
The inexpensive module MAX6675 send the data taken from the thermocouple via the SPI bus. It has 12-bit ADC on the board. It measures only positive temperatures from 0 to + 700 oC and can detect the breakage of the thermocouple. The price is about 1.5 USD.
A modern and more expensive module MAX31855, replacing MAX6675 also send data via the SPI bus. The features are better than MAX6675:
- 14-bit ADC.
- Apart from the definition of the breakage, the thermocouple output is further determined by VCC or GND.
- The range of measured temperatures from -270 to +1768 oC (max ranges).
- The price is about 1.9 USD with delivery to Russia.
There’s one problem with that board. The screw connector does not allow to fasten thermocouple terminals as it is intended by developers. It is necessary to clamp screws one of half of a terminal but holds normally.
On Aliexpress available at least three variants of boards with MAX31855. The most expensive comes with extensive strapping. Costs about 8 USD. I did not know the difference between the inexpensive option. Except that there are a separate entrance 3V and Vin. I used the 1.9 USD board and supply with 3.3V. In the description of the Chinese comparison, expensive board with the budget did not find.
- https://datasheets.maximintegrated.com/en/ds/MAX6675.pdf
- https://datasheets.maximintegrated.com/en/ds/MAX31855.pdf
In one of the articles, I wrote about circuitry for automatic cheese cooking. To measure the temperature of the milk and the temperature of the liquid in the steam bath just used a thermocouple.
Wemos D1 min and MAX6675K
MAX6675K | Wemos D1 Mini |
Vcc | 3.3 V (I used BP) |
SO | D6 (GPIO12) |
SS/CS | D7 (GPIO13) |
Csk | D8 (GPIO15) |
The Earth (GND) MAX6675 and (GND) Wemos D1 Mini must be connected if the MAX6675 is powered by a separate power source.
The SPI Interface uses 4 lines for data exchange:
- SCLK-Serial Clock: Clock signal (from lead) Ot
her designations: SCK, CLK - MOSI-Master Output, Slave Input: Data from leading to Vedomo
mudrugie notation: SDI, DI, SI - MISO — Master Input, Slave Output: Data from the Vedushhemudrug
ie-driven notation: SDO, do, SO - SS-Slave Select: Slave selection; is established by the
Other designations: nCS, CS, CSB, CSN, nSS, STE
The https://github.com/YuriiSalimov/MAX6675_Thermocouple library is used To remove the thermocouple data from the MAX6675 card. It is based on the older Library of Adafruit Max6675 Library
#include "MAX6675_Thermocouple. H"//https://github.com/YuriiSalimov/MAX6675_Thermocouple #define SCK_PIN 15//D8 #define CS_PIN 13//D7 #define SO_PIN 12//D6 /** How Many readings are taken to determine a mean temperature. The more values, the longer a calibration is performed, But the readings will be more accurate. */ #define READINGS_NUMBER 20 /** Delay time between a temperature readings From the temperature sensor (ms). */ #define DELAY_TIME 20 MAX6675_Thermocouple * Thermocouple = NULL; void Setup () { Serial. Begin (9600); Thermocouple = new MAX6675_Thermocouple (SCK_PIN, CS_PIN, SO_PIN, Readings_number, DELAY_TIME); } void Loop () { Const double Celsius = thermocouple-> readCelsius (); Const DOUBLE Kelvin = thermocouple-> readKelvin (); Const double Fahrenheit = thermocouple-> readFahrenheit (); Serial. Print ("Temperature:"); Serial. Print (String (Celsius) + "C,"); Serial. Print (String (Kelvin) + "K,"); Serial. println (String (Fahrenheit) + "F"); Delay (500); }
The Result of the program:
19:14:01.820-> Temperature: 28.50 C, 301.65 K, 83.30 F 19:14:05.538-> Temperature: 28.75 C, 301.90 K, 83.75 F 19:14:09.278-> Temperature: 28.50 C, 301.65 K, 83.30 F 19:14:13.025-> Temperature: 28.50 C, 301.65 K, 83.30 F 19:14:16.730-> Temperature: 28.75 C, 301.90 K, 83.75 F
Sensors should be calibrated because the temperature in the room was not 28.5 Oc, but lower.
ESP32 DevKit and MAX6675K
This fee is used as The ESP32 board.
MAX6675K | ESP32 DevKit |
Vcc | 3.3 V (I used BP) |
SO | 12 (IO12) |
SS/CS | 13 (IO13) |
Csk | 15 (IO15) |
The Code unchanged works on ESP32.
#include "MAX6675_Thermocouple. H"//https://github.com/YuriiSalimov/MAX6675_Thermocouple #define SCK_PIN 15 #define CS_PIN 13 #define SO_PIN 12 /** How Many readings are taken to determine a mean temperature. The more values, the longer a calibration is performed, But the readings will be more accurate. */ #define READINGS_NUMBER 20 /** Delay time between a temperature readings From the temperature sensor (ms). */ #define DELAY_TIME 20 MAX6675_Thermocouple * Thermocouple = NULL; void Setup () { Serial. Begin (9600); Thermocouple = new MAX6675_Thermocouple (SCK_PIN, CS_PIN, SO_PIN, Readings_number, DELAY_TIME); } void Loop () { Const double Celsius = thermocouple-> readCelsius (); Const DOUBLE Kelvin = thermocouple-> readKelvin (); Const double Fahrenheit = thermocouple-> readFahrenheit (); Serial. Print ("Temperature:"); Serial. Print (String (Celsius) + "C,"); Serial. Print (String (Kelvin) + "K,"); Serial. println (String (Fahrenheit) + "F"); Delay (500); }
Result:
21:16:42.882-> Temperature: 26.25 C, 299.40 K, 79.25 F 21:16:46.554-> Temperature: 26.75 C, 299.90 K, 80.15 F 21:16:50.256-> Temperature: 26.50 C, 299.65 K, 79.70 F 21:16:53.926-> Temperature: 26.25 C, 299.40 K, 79.25 F 21:17:30.707-> Temperature: 26.50 C, 299.65 K, 79.70 F
Strange, but ESP32 reads a more correct temperature than ESP8266. The Temperature in the room is just somewhere around 26.5 Oc.
ESP32 and MAX31855
No problem at ESP32 earned library from Adafruit C software emulation. GPIO used the same as for the example with MAX6675.
#include < SPI. h. #include "Adafruit_MAX31855. H"//https://github.com/adafruit/Adafruit-MAX31855-library/ Default connection is using software SPI, but comment and uncomment one of The two examples below to switch between software SPI and hardware SPI: Example creating a Thermocouple instance with software SPI on any three Digital IO pins. #define MAXDO 12 #define MAXCS 13 #define MAXCLK 15 Initialize the Thermocouple Adafruit_MAX31855 thermocouple (MAXCLK, MAXCS, MAXDO); Example creating a Thermocouple instance with hardware SPI On a given CS pin. #define MAXCS 10 Adafruit_MAX31855 thermocouple (MAXCS); void Setup () { Serial. Begin (115200); Serial. println ("MAX31855 test"); Wait for MAX chip to stabilize Delay (500); } void Loop () { Basic readout test, just print the current temp Serial. Print ("Temperature:"); Double c = thermocouple. readCelsius (); if (isNaN (c)) { Serial. println ("Something wrong with thermocouple!"); Else Serial. Print (String (c) + "C,"); Serial. Print (String (thermocouple. readFarenheit ()) + "F,"); Serial. println (String (thermocouple. readInternal ()) + "C (internal)"); } Delay (1000); }
Result:
15:39:44.805-> Temperature: 24.25 C, 77.90 F, 25.94 C (internal) 15:39:45.977-> Temperature: 24.25 C, 77.45 F, 25.88 C (internal) 15:39:47.190-> Temperature: 25.50 C, 77.90 F, 25.94 C (internal) 15:39:48.396-> Temperature: 25.25 C, 77.90 F, 25.94 C (internal) 15:39:49.618-> Temperature: 25.00 C, 78.35 F, 25.94 C (internal)
Let’s try to run the library with hardware SPI:
- SPI MOSI-GPIO23
- SPI MISO-GPIO19
- SPI SCK-GPIO18
- SPI SS (CS)-GPIO5
The Code is much simpler, but everything works fine.
#include < SPI. h. #include "Adafruit_MAX31855. H"//https://github.com/adafruit/Adafruit-MAX31855-library/ #define MAXCS 5 Adafruit_MAX31855 thermocouple (MAXCS); void Setup () { Serial. Begin (115200); Serial. println ("MAX31855 test"); Wait for MAX chip to stabilize Delay (500); } void Loop () { Basic readout test, just print the current temp Serial. Print ("Temperature:"); Double c = thermocouple. readCelsius (); if (isNaN (c)) { Serial. println ("Something wrong with thermocouple!"); Else Serial. Print (String (c) + "C,"); Serial. Print (String (thermocouple. readFarenheit ()) + "F,"); Serial. println (String (thermocouple. readInternal ()) + "C (internal)"); } Delay (1000); }
The https://github.com/SV-Zanshin/MAX31855/Library works fine with the SPI hardware.
#include &lt; MAX31855. h >//https://github.com/SV-Zanshin/MAX31855/ /******************************************************************************************************************* * * Declare All Program Constants * * *******************************************************************************************************************/ Const uint32_t SERIAL_SPEED = 115200; &lt; Set the baud rate for Serial I/O Const uint8_t SPI_CHIP_SELECT = 5; &lt; Chip-Select PIN for SPI Const uint8_t SPI_MISO = MISO; &lt; Master-In, Slave-Out PIN for SPI Const uint8_t SPI_SYSTEM_CLOCK = SCK; &lt; System Clock PIN for SPI /******************************************************************************************************************* * * Declare Global variables and instantiate classes * * *******************************************************************************************************************/ MAX31855_Class MAX31855; &lt; Create an instance of MAX31855 /***************************************************************************************************************//*! * @brief Arduino method called once at startup to initialize the system * @details This is an Arduino IDE method which is called first upon boot or restart. It is only called one time * And then control goes to the main "loop ()" method, from which control never returns * @return void *******************************************************************************************************************/ void Setup () { Serial. Begin (SERIAL_SPEED); #ifdef __Avr_atmegea32u4__//If This is a 32U4 processor, then wait 3 seconds for the interface to initialize Delay (3000); #endif Serial. println (F ("Starting software SPI demo program for MAX31855")); Serial. Print (F ("Initializing MAX31855 ensorn")); /******************************************************************************************** * * Uncomment out either the hardware or software SPI call, depending upon which is in use * * ********************************************************************************************/ while (! MAX31855. Begin (SPI_CHIP_SELECT))//Hardware SPI for MAX31855 while (! MAX31855. Begin (SPI_CHIP_SELECT, SPI_MISO, SPI_SYSTSEM_CLOCK))//Software SPI for MAX31855 { Serial. println (F ("Unable to start MAX31855. Waiting 3 seconds. ")); Delay (3000); }//of loop until device is located Serial. println (); }//Of method Setup () /***************************************************************************************************************//*! * @brief Arduino method for the main program loop * @details This is the main program for the Arduino IDE, it is an infinite loop and keeps on repeating. * @return void *******************************************************************************************************************/ void Loop () { int32_t ambientTemperature = MAX31855. readAmbient (); Retrieve MAX31855 die Ambient temperature int32_t probeTemperature = MAX31855. readProbe (); Retrieve Thermocouple Probe Temp uint8_t faultCode = MAX31855. Fault (); Retrieve any error codes if (faultCode)//Display error code if present { Serial. Print ("Fault Code"); Serial. Print (faultCode); Serial. println ("returned."); } Else { Serial. Print ("Ambient Temperature is"); Serial. Print ((float) ambientTemperature/1000,3); Serial. println ("xC2xB0" "C"); Serial. Print ("Probe Temperature is"); Serial. Print ((float) probeTemperature/1000,3); Serial. println ("xC2xB0" "Cn"); }//Of If-then-else an error occurred Delay (5000); }//Of method Loop ()
Useful Links
- Library to work with MAX6675K. Based on the code of the older library from Adafruit.
- Adafruit Library for working with MAX6675K.
- Adafruit Library for working with MAX31855.
- Library to work with MAX31855 newer than Adafruit.
- https://www.instructables.com/id/Power-and-Temperature-Data-Logger-With-ESP32-and-A/
- http://www.esp8266learning.com/wemos-max6675-example.php
- http://www.esp32learning.com/code/esp32-and-max6675-example.php
- http://henrysbench.capnfatz.com/henrys-bench/arduino-temperature-measurements/max6675-temp-module-arduino-manual-and-tutorial/
- http://www.electronoobs.com/eng_arduino_tut24.php
- https://protosupplies.com/product/max6675-thermocouple-temperature-module/