Intro
This has been an interesting challenge, but very rough. I got ill and have not been able to bounce back.. However the challenge requires 2 blogs, so I will attempt to publish what I have accomplished so far in this second blog. The 2 applications I had intended to build to demonstrate thermistor usage were a thermistor thermometer and a filament annealing oven. I did manage to get these together even though I did not get to do anywhere near the amount of testing I had planned.
Steinhart-Hart Coefficients
Here are the Steinhart-Hart coefficients calculated from the Molex datasheets for the parts in the kit:
Part# | R @ 25C | Beta | Epoxy Bead | Wire | Steinhart-Hart a | Steinhart-Hart b | Steinhart-Hart c |
2152723507 | 5K | 3892K | Black | Red | 0.0013297176 | 0.0002283299 | 1.282877672E-007 |
2152723307 | 3K | 3892K | Black | Black | 0.0014393219 | 0.0002304973 | 1.343585899E-007 |
2152723407 | 4.7K | 3892K | Blue | Black | 0.0013438721 | 0.0002284692 | 1.293070851E-007 |
2152723607 | 10K | 3892K | Black | Black | 0.0012756503 | 0.0002101366 | 1.820609429E-007 |
2152723707 | 12K | 3892K | Blue | Red | 0.0012411046 | 0.0002090866 | 0.000000179 |
2152723807 | 30K | 3892K | Blue | Yellow | 0.0009319708 | 0.0002246373 | 0.000000098 |
2138601637 | 10K | 3500K | ring | Black | 0.0008369564 | 0.0002638196 | 1.117434251E-007 |
2138602637 | 10K | 3500K | ring | Black | 0.0008369564 | 0.0002638196 | 1.117434251E-007 |
2138622637 | 10K | 3500K | ring | Black | 0.001002052 | 0.0002484052 | 8.289534666E-008 |
Thermistor Thermometer
The thermistor thermometer uses an Arduino Uno with 320x240 display connected to an SPI 24 bit A/D converter module. Hopefully this high resolution converter will provide good resolution when the thermistor resistance is not changing much. In conjunction with the Steinhart-Hart equation, this should allow the system to work well over a wide temperature range.
Here are the Arduino pin connections:
UNO pin | ADS1220 pin | Display pin |
5V | ||
Reset | ||
3.3V | ||
5V | DVDD | |
GND | DGND | |
GND | ||
Vin | ||
A0 | LCD_RD | |
A1 | LCD_WR | |
A2 | LCD_CD | |
A3 | LCD_CS | |
A4 | CS | |
A5 | DRDY | |
Rx | ||
Tx | ||
D2 | D2 | |
D3 | D3 | |
D4 | D4 | |
D5 | D5 | |
D6 | D6 | |
D7 | D7 | |
D8 | D0 | |
D9 | D1 | |
D10 | ||
D11 | MOSI | ASD |
D12 | MISO | |
D13 | SCLK | |
GND | ||
AREF | ||
SDA | ||
SCL |
3D Printed Case
The first video shows the 3D printed case parts from all angles:
Thermistor Thermometer Demo
The next video shows the thermometer assembly and demonstrates it in operation.
The thermometer really seems to work well, although I have not tested it enough yet.
Filament Annealing Oven
The other application I wanted to build was a low temperature thermally controlled oven. This prototype is a proof of concept using materials I had in-house. If it works well, I will build an oven out of a giant cookie tin.
This video shows the concept:
Once the concept is proven and the final build is complete the ring thermistor will end up bolted in an appropriate location.
Firmware
Here is the firmware for the thermometer, such as it is....
// Thermistor Thermometer // Doug Wong 2022 // #include <Elegoo_GFX.h> // Core graphics library #include <Elegoo_TFTLCD.h> // Hardware-specific library #include "Protocentral_ADS1220.h" // The control pins for the LCD can be assigned to any digital or // analog pins...but we'll use the analog pins as this allows us to // double up the pins with the touch screen (see the TFT paint example). #define LCD_CS A3 // Chip Select goes to Analog 3 #define LCD_CD A2 // Command/Data goes to Analog 2 #define LCD_WR A1 // LCD Write goes to Analog 1 #define LCD_RD A0 // LCD Read goes to Analog 0 //#define ADCS A4 // A/D CS pin goes to Analog 4 #define DRDY A5 // A/D DRDY pin goes to Analog 5 #define PGA 1 // Programmable Gain = 1 #define VREF 2.048 // Internal reference of 2.048V #define VFSR VREF/PGA #define FULL_SCALE (((long int)1<<23)-1) #define LCD_RESET A4 // just connect to Arduino's reset pin // Arduino Uno - LCD display : // D0 connects to digital pin 8 // D1 connects to digital pin 9 // D2 connects to digital pin 2 // D3 connects to digital pin 3 // D4 connects to digital pin 4 // D5 connects to digital pin 5 // D6 connects to digital pin 6 // D7 connects to digital pin 7 // Assign human-readable names to some common 16-bit color values: #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); // If using the shield, all control and data lines are fixed, and // a simpler declaration can optionally be used: // Elegoo_TFTLCD tft; Protocentral_ADS1220 myADC; int32_t AD; //raw A/D reading float AV; //A/D voltage reading float TC; //thermistor current double TR; //thermistor resistance float TT = 20.0; //thermistor temperature float a = 0.001329717596; //thermistor constant float b = 0.0002283299097; //thermistor constant float c = 0.0000001282877672; //thermistor constant float lnr; float bln; float cln; float lnt; void setup(void) { tft.reset(); uint16_t identifier; identifier=0x9328; //could be 0x9341 0x9328 0x7575 0x8357 tft.begin(identifier); tft.fillRect(0, 0, 240, 320, BLACK); tft.setRotation(0); DisplayTitle(); digitalWrite (LCD_CS, 0); //disable display delay(2000); myADC.begin(LCD_RESET, DRDY); //myADC.begin(CS_PIN, DRDY_PIN); myADC.set_data_rate(DR_20SPS); myADC.set_pga_gain(PGA_GAIN_1); myADC.set_conv_mode_single_shot(); //Set Single shot mode } void loop(void) { AD = myADC.Read_SingleShot_SingleEnded_WaitForData(MUX_SE_CH0); AV = AD * 0.0001220703125; //voltage in millivolts TC = (4350 - AV) / 33; //current in milliamps TR = AV / TC; //thermistor resistance TR = TR * 2398; //resistance correction lnr = log(TR); //ln(T) bln = b * lnr; lnt = lnr * lnr * lnr; //ln(T)^3 cln = c * lnt; TT = 1/ (a + bln + cln) - 273; //Steinhart-Hart equation digitalWrite (LCD_CS, 1); //enable display DisplayT(); digitalWrite (LCD_CS, 0); //disable display delay(500); } unsigned long DisplayT() { tft.fillRect(50, 100, 146, 102, BLACK); tft.setTextColor(YELLOW); tft.setTextSize(5); tft.setCursor(50, 100); tft.println(TT); } unsigned long DisplayTitle() { tft.fillRect(50, 100, 220, 300, BLACK); unsigned long start = micros(); tft.setCursor(0, 10); tft.setTextColor(GREEN); tft.setTextSize(4); tft.println("THERMISTOR"); tft.setTextColor(YELLOW); tft.setTextSize(3); tft.setCursor(20, 50); tft.println("Thermometer"); tft.setTextColor(YELLOW); tft.setTextSize(5); tft.setCursor(50, 100); tft.println(TT); }
Discussion
I can't say this project went the way I planned it or wanted it to go - getting ill really messed up the plan. I also had some issues with supply chain - the 24 bit A/D barely made it here in time to be used. That chip also seems to get unexpectedly warm, so I'm not sure if I'm loading it somehow, or it is just a bad knock-off chip. (It cost a small fraction of what I would expect a 24 bit A/D to cost). The Uno barely has enough pins to handle both the display and the A/D module. I had to hard-wire the display reset to the Uno reset line just to free up a pin.
I am impressed with the response time of these little epoxy bead thermistors, and the Molex datasheets provide excellent data to allow correction for their non-linear response. I am happy the thermistor thermometer came together and worked in time to publish before the deadline, but I am also disappointed I could not complete more testing. Fortunately some of the other contestants did a stellar job of testing.
I definitely learned a lot more about thermistors than I knew before this project. I would like to thank Molex and element14 for the opportunity to participate.
Relevant Links:
Thermistor Thermometer - blog 1
challenges-projects/design-challenges/experimenting-with-thermistors/"/a>
https://challenges-projects/design-challenges/experimenting-with-thermistors/w/documents/27632/experimenting-with-thermistors?ICID=expThermistors-DCH-topban
https://www.molex.com/molex/search/partSearch?query=215272&pQuery=