Design project · 2024

Thermoelectric
Cooling Bath.

A sub-zero laboratory bath built from four Peltier modules, a 3D-printed body and an Arduino — no compressor, no refrigerant, no dry ice.

−9.9 °C
Liquid temperature at 17 °C room temperature
4 × TEC1-12705
Peltier modules around a 3D-printed cube
$105
Total cost with off-the-shelf parts

1Overview

Cold traps usually rely on ice, dry ice or a compressor chiller. This project replaces them with a compact thermoelectric bath that has an adjustable set point and no moving refrigerant, built only from parts that are easy to find.

2The Build

The body is a 3D-printed ABS cube with insulating air pockets in its walls and four windows that hold the 40 mm Peltier modules. The inside is sealed with epoxy.

The cube being printed — the cellular infill forms insulating air gaps.
Figure 1. The cube being printed — the cellular infill forms insulating air gaps.
The sealed cube with inserts for mounting the heatsinks.
Figure 2. The sealed cube with inserts for mounting the heatsinks.
A Peltier module in its seat, with glass-wool insulation and thermal paste.
Figure 3. A Peltier module in its seat, with glass-wool insulation and thermal paste.

A Peltier module pumps heat from its cold face to its hot face when a current flows through it. Its net cooling power is the Peltier heat minus half of the Joule heat generated in the module and the heat conducted back from the hot side, so the hot side has to be cooled well for the cold side to get cold (Goldsmid, 2016, Eqs. 2.3–2.5; Rowe, 2006). Each module is bonded in with silicone and cooled by a heatsink and fan. A small magnetic stirrer under the cube keeps the liquid mixed.

The completed cooling bath.
Figure 4. The completed cooling bath.

3Control

An Arduino reads a K-type thermocouple and switches the 12 V, 20 A Peltier supply through a solid-state relay, using on–off control with a small deadband. On–off control is the simplest feedback law; the deadband keeps the relay from chattering at the cost of a small, steady oscillation around the set point (Seborg et al., 2011, Sec. 8.4).

Circuit diagram of the control unit.
Figure 5. Circuit diagram of the control unit.
Show the bill of materials
QtyItemPrice (Türkiye)USD (32 ₺ = $1)
116×2 LCD screen with I²C module₺80$2.50
1Arduino Uno (clone)₺150$4.69
4TEC1-12705 Peltier module, 12 V 49 W, 40×40 mm₺400$12.50
4Peltier heatsink with fan₺700$21.88
2Push button₺20$0.63
1DC–DC solid-state relay, 5 V (40 mA) gate / 12 V (40 A)₺350$10.94
2Toggle switch ON–OFF₺20$0.63
1230 V switch₺10$0.31
1DC power supply (min. 12 V, 41 A)₺800$25.00
1K-type thermocouple₺80$2.50
1MAX31855 thermocouple amplifier₺550$17.19
1Magnetic stir bar₺100$3.13
70 gABS filament₺32$1.00
1Cables, leads and pins₺50$1.56
Total₺3,342$104.44

4Results

The lowest liquid temperature follows the room temperature almost linearly, reaching −9.9 °C at 17 °C.

Room temperature vs. minimum liquid temperature

Stirring cut the time to steady state from 27 to 20 minutes.

Cooling with and without the stirrer

The bath reached a 0 °C set point in 11 minutes and held it within about ±0.5 °C.

Approach to a 0 °C set point

5Moisture Trapping

Humid air was passed through a glass tube immersed in the bath and the ice collected in the tube was weighed. At low flows the bath removed practically all of the moisture. The limit is set by the frost point: gas leaving a tube wall at −10 °C can carry at most the vapour pressure of ice at that temperature, about 2.6 hPa, which is roughly 11 % relative humidity once the gas is back at 20 °C (WMO, 2018; Sonntag, 1990). At higher flows the gas leaves before it has cooled to the wall temperature, so more water passes.

Test setup: humid air enters the cold tube, its moisture freezes out and dry air leaves.
Figure 6. Test setup: humid air enters the cold tube, its moisture freezes out and dry air leaves.
Air pump and humidifier.
Figure 7. Air pump and humidifier.
Flow measurement unit and the bath controller.
Figure 8. Flow measurement unit and the bath controller.
Air flow (cm³/s)Water removed (g/min)Outlet humidity (%)
5.30.006< 2
10.60.007< 2
61.80.02745
2000.04274
The test tube after 15 minutes, with frozen moisture on its walls.
Figure 9. The test tube after 15 minutes, with frozen moisture on its walls.

6Modelling

The follow-up work models the Peltier together with its heatsink, so the cold-side temperature can be predicted from the room temperature and the heatsink's thermal resistance alone. The module is described by a constant-parameter model whose resistivity, thermal conductivity and geometry factor were fitted to measurements, which predicts real modules much better than the parameters derived from datasheet maxima (Lineykin & Ben-Yaakov, 2007; Goldsmid, 2016, Ch. 2). That model runs in the Peltier + heatsink calculator.

Show the Arduino code
#include <Adafruit_MAX31855.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define MAXDO   5
#define MAXCS   6
#define MAXCLK  7

Adafruit_MAX31855 thermocouple(MAXCLK, MAXCS, MAXDO);
const int RELAY = 10;
const int up_key = 13;
const int down_key = 12;
int SetPoint = 0;
int deadband = 0.5;
LiquidCrystal_I2C lcd(0x27, 16, 2);

const int numReadings = 5;     // moving-average window
double readings[numReadings];
int readIndex = 0;
double total = 0;
double averageTemperature = 0;

void setup() {
  pinMode(RELAY, OUTPUT);
  pinMode(up_key, INPUT_PULLUP);
  pinMode(down_key, INPUT_PULLUP);
  lcd.begin();
  lcd.backlight();
  lcd.setCursor(0,0); lcd.print("Bhdr WORKS");
  lcd.setCursor(0,1); lcd.print("TEC COOLER");
  digitalWrite(RELAY, HIGH);
  delay(4000);
  Serial.begin(9600);
  for (int i = 0; i < numReadings; i++) readings[i] = 0;
}

void loop() {
  // moving average of the thermocouple reading
  total -= readings[readIndex];
  readings[readIndex] = thermocouple.readCelsius();
  total += readings[readIndex];
  readIndex = (readIndex + 1) % numReadings;
  averageTemperature = total / numReadings;

  unsigned long seconds = millis() / 1000;
  Serial.print("Average Temperature: ");
  Serial.print(averageTemperature);
  Serial.print(" C | Time: ");
  Serial.print(seconds);
  Serial.println(" seconds");

  lcd.clear();
  lcd.setCursor(0,0); lcd.print("Temp: ");  lcd.print(averageTemperature); lcd.print(" C");
  lcd.setCursor(0,1); lcd.print("SetPt: "); lcd.print(SetPoint);           lcd.print(" C");

  if (digitalRead(down_key) == LOW && SetPoint > -50)  SetPoint--;
  if (digitalRead(up_key)   == LOW && SetPoint < 150)  SetPoint++;

  // on–off control with deadband
  if (averageTemperature > SetPoint + deadband)      digitalWrite(RELAY, HIGH);
  else if (averageTemperature < SetPoint - deadband) digitalWrite(RELAY, LOW);

  delay(1000);
}

7References

  • Goldsmid, H. J. (2016). Introduction to Thermoelectricity (2nd ed.). Springer, Berlin.
  • Lineykin, S., & Ben-Yaakov, S. (2007). Modeling and analysis of thermoelectric modules. IEEE Trans. Ind. Appl., 43(2), 505–512.
  • Rowe, D. M. (Ed.) (2006). Thermoelectrics Handbook: Macro to Nano. CRC Press, Boca Raton, FL.
  • Seborg, D. E., Edgar, T. F., Mellichamp, D. A., & Doyle, F. J. (2011). Process Dynamics and Control (3rd ed.). Wiley, Hoboken, NJ.
  • Sonntag, D. (1990). Important new values of the physical constants of 1986, vapour pressure formulations based on the ITS-90, and psychrometer formulae. Z. Meteorol., 40(5), 340–344.
  • WMO (2018). Guide to Instruments and Methods of Observation (WMO-No. 8), Vol. I: Measurement of Meteorological Variables, Annex 4.B. World Meteorological Organization, Geneva.
Next project
Zeolite Bed Temperature Profile
›