Skip to content

Peltier Bottle Warmer

Every bottle warmer you can buy is a hot plate with a timer. Set it for four minutes, come back, and hope. This one is a Peltier module clamped under a copper mug with a thermocouple on the plate, so it warms to a temperature and then sits there — and because a Peltier is a heat pump rather than a heater, running the current the other way chills the bottle instead.

That last part is the whole reason the driver is an H-bridge and not a MOSFET.

The prototype Peltier bottle warmer on the bench: a copper mug standing on a Noctua low-profile CPU cooler that is clamped to a printed base, with the H-bridge module and dev board wired up alongside

How it works

A Peltier module does not make heat, it moves it. Put current through the 40 × 40 mm wafer and one ceramic face gets hot while the other gets cold. The face touching the mug is the hot one; the cold one has to be bolted to something that can feed it, and that something is a CPU cooler.

The cooler is not optional and it is not a place to economise. A Peltier’s ability to pump heat falls off as the difference between its two faces grows, and at its maximum ΔT it pumps nothing at all — it just sits there dissipating its own electrical losses. Starve the cold side and the module stalls. Give it a 120 mm tower of fins and a quiet fan and the cold face stays near room temperature, the module keeps pumping, and everything it pumps plus everything you put in electrically ends up in the bottle.

Using a CPU cooler buys you the second thing too: its mounting hardware. A Peltier is a thin ceramic sandwich that needs firm, even pressure across its whole face and cracks if you crank down one corner. A cooler’s spring-loaded mounting screws are a calibrated clamp that already solves that, with a backplate you can replace with a printed plate.

Parts

Some links below are Amazon affiliate links. As an Amazon Associate I earn from qualifying purchases — at no extra cost to you. It helps keep these guides free. Outside the US, they should send you to your own Amazon store; if one doesn't, searching the part number there will find it.

Run the module at 12 V. A TEC1-12712 is a 12 V part and the BTS7960 will happily accept a 24 V supply, which is a tempting way to get more power out of a brick you already own. PWM does not fix it: chopping 24 V still puts 24 V across the junctions on every pulse, and the thermal cycling that comes with it is what kills Peltiers early. If you want more heat, buy the bigger 12 V supply.

Wiring

The prototype has no sketch or ESPHome config in this folder, so there are no GPIO numbers on this page — pick your own and write them into your firmware. What is fixed is which module pin does what, and that part is worth having in one place.

FromToNotes
12 V supply +BTS7960 B+Screw terminal, 18 AWG
12 V supply −BTS7960 B−
BTS7960 M+ / M−Peltier red / blackSwap these and heat becomes cool
ESP32 PWM outBTS7960 RPWMOne direction
ESP32 PWM outBTS7960 LPWMThe other direction
3.3 VBTS7960 R_EN, L_EN, VCCEnables tied high; logic rail, not motor rail
GNDBTS7960 GNDCommon with the ESP32
MAX6675 SO / CS / SCKThree ESP32 GPIOsSPI, read-only — the module has no MOSI
MAX6675 VCC / GND3.3 V / GND
Noctua fan12 V, GND, PWM, tach4-pin; the tach line is optional

Never drive RPWM and LPWM high at the same time. On a 43 A bridge that is a short across the supply through both half-bridges, and the module has the current capability to make it memorable.

The fan can be left running flat out on 12 V and ignored — it is a Noctua, it is inaudible, and a bottle warmer that runs for four minutes has no thermal reason to modulate it. Wire the PWM line anyway if you want the option later.

Assembly

  1. Find the hot face. Wire the module to the bench supply for ten seconds and put a finger on each side. Do not trust the printed marking or a diagram on the internet; mark the hot face yourself with a Sharpie and move on.

  2. Bond the hot face to the mug plate. Thermal glue here, because this joint has no clamp holding it — the plate, the module and the glue become one part.

  3. Clamp the cold face to the cooler. Paste or a thermal pad on this side, and let the cooler’s own spring screws provide the pressure. Tighten the screws in diagonal pairs, a turn at a time, until the springs are compressed and no further. Ceramic does not warn you before it cracks.

  4. Print a plate to stand in for the motherboard. The cooler’s backplate assumes there is a PCB between it and the mounting bars; a flat printed plate with the right hole pattern does the same job. That is what the white part in the photo is.

  5. Fill the gap around the module. The wafer is only a few millimetres thick, so once it is clamped there is a 40 mm square window of air between two plates at very different temperatures. Anything closed-cell packed into that gap raises efficiency and cuts the condensation. Do not let it press on the ceramic hard enough to take load off the clamp.

  6. Wire it, and test with water before milk. A mug of water and a kitchen thermometer tells you what the plate reading actually corresponds to.

Calibration

The thermocouple reads the plate, not the milk, and the plate always runs hotter than what is in the bottle — by more at the start of a cycle than at the end. Put a thermometer in a bottle of water, run the warmer, and log both numbers until you know the offset at the temperature you care about. Then set the target from the bottle’s number, not the plate’s.

The MAX6675 goes to 1024 °C, which is absurd for this and is not the problem it looks like: it resolves 0.25 °C and it is reading a probe bolted to metal, which is a far more stable measurement than a sensor dangling in air.

Milk goes in the bottle, the bottle goes in the mug. The mug is unlined copper — it is a heat-transfer sleeve, not a vessel. Nothing anybody drinks should touch it.

And set your ceiling in firmware, not in your head. Body temperature is the target, and nothing in this stack has an upper limit of its own — the module will keep pumping heat into the plate for as long as you give it current. That needs a hard limit in code and a cut-out you have actually tested, by unplugging the thermocouple mid-run and watching what the code does when the reading goes away.

Two traps

The cold side sweats. In warming mode the fin stack sits at or below room temperature while it feeds the module, and on a humid day it will collect water and drip. Everything electrical belongs beside the cooler, not under it, and the base wants to be a tray rather than a flat plate.

PLA is the wrong material here. PLA starts going soft around 60 °C, and the hot side of a loaded Peltier goes past that without trying. The printed parts are what hold the clamp, so the failure is not a part visibly sagging — it is the clamp relaxing, contact going, and the warmer quietly getting worse. PETG or ABS. The white parts in the photo are PLA+, which is fine on a bench and not fine in a finished unit.

What isn’t here yet

This page documents a working bench prototype, not a finished build. The printed base has no STL in the repo, and there is no sketch or ESPHome config — which is why there are no pin numbers above and why the project is still flagged as pending. Everything in the parts list is real and everything in the wiring table is fixed by the modules themselves, so the electronics are buildable today; the mechanical half is a photo and a description.

Files & downloads

The source files for this project aren't in the repo yet — there's nothing to download beyond the notes. They land in projects/peltier-bottle-warmer/ when they do, and this section fills itself in.

Every file for this project on GitHub →