https://github.com/laenzlinger/reflow-oven
ESP32-S3 controlled reflow soldering oven — Rust firmware, PID temperature control, NTC thermistor, SSR switching, WiFi web UI
https://github.com/laenzlinger/reflow-oven
diy-electronics embedded esp-rs esp32 esp32-s3 ntc-thermistor pid-controller reflow-oven reflow-soldering rust ssr
Last synced: 5 days ago
JSON representation
ESP32-S3 controlled reflow soldering oven — Rust firmware, PID temperature control, NTC thermistor, SSR switching, WiFi web UI
- Host: GitHub
- URL: https://github.com/laenzlinger/reflow-oven
- Owner: laenzlinger
- License: cern-ohl-p-2.0
- Created: 2026-05-07T15:05:39.000Z (about 2 months ago)
- Default Branch: main
- Last Pushed: 2026-05-23T14:05:51.000Z (about 1 month ago)
- Last Synced: 2026-05-23T16:08:06.331Z (about 1 month ago)
- Topics: diy-electronics, embedded, esp-rs, esp32, esp32-s3, ntc-thermistor, pid-controller, reflow-oven, reflow-soldering, rust, ssr
- Language: Rust
- Size: 202 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Reflow Oven
Toaster oven conversion to a reflow soldering oven with a custom controller PCB.
## Goals
- Reliable lead-free reflow profiles (peak ~245°C)
- Thermocouple-based closed-loop temperature control
- Programmable profiles (preheat → soak → reflow → cooling)
- Safe operation (over-temperature protection, door interlock)
## Architecture
```
MAINS → [Emergency Stop] → [Electronics Box] → [Oven]
│
┌─────┴─────┐
│ SSR │──── switches Live to oven elements
│ ESP32-S3 │──── WiFi web UI, PID control
│ MAX31855 │──── thermocouple into oven chamber
└───────────┘
```
## Components
| Component | Part | Role |
|-----------|------|------|
| Toaster oven | Severin TO-2052 (9L, 800W) | Heating chamber |
| Controller | ESP32-S3-DevKitC-1 | Profile management, PID control, WiFi web UI |
| SSR | Solid-state relay (available) | Switches mains to heating elements |
| Temperature sensor | MAX31855 + Type K thermocouple | Temperature sensing inside chamber (±2°C up to 1350°C) |
| Emergency stop | Mushroom-head switch | Mains kill switch |
| Enclosure | Abzweigdose ~180×120mm | Houses ESP32 + SSR + PSU |
| Solder paste | Relife HW21 Sn63/Pb37 (183°C) | Primary paste |
| Solder paste | Sn42/Bi58 low-temp (138°C) | Alternative for heat-sensitive components |
## Wiring
```
MAINS (230V) ─── [Emergency Stop] ─── Kabelverschraubung into box
│
Live ──────────────── SSR input ─── SSR output ──── Oven element (hot)
Neutral ─────────────────────────────────────────── Oven element (neutral)
Earth ───────────────────────────────────────────── Oven chassis
SSR control (+) ──── ESP32 GPIO5
SSR control (-) ──── ESP32 GND
ESP32 3.3V ─── MAX31855 VCC (red)
ESP32 GND ─── MAX31855 GND (black)
ESP32 GPIO17 ── MAX31855 CS (brown)
ESP32 GPIO18 ── MAX31855 SCK (orange)
ESP32 GPIO7 ── MAX31855 SO (yellow)
Type K thermocouple ── MAX31855 T+/T-
ESP32 powered via USB (separate charger)
Thermocouple wires through Kabelverschraubung into oven chamber
```
## Oven Modifications
1. Bypass (short) the built-in thermostat
2. Drill ~4mm hole for thermocouple wire, seal with Kapton tape
## Firmware
Rust (esp-rs) firmware for ESP32-S3-DevKitC in `firmware/`.
### Modules
| File | Purpose |
|------|---------|
| `sensor.rs` | `TemperatureSensor` trait + MAX31855 thermocouple (SPI) |
| `pid.rs` | PID controller (output 0–100%) |
| `profile.rs` | Reflow profile state machine (Preheat→Soak→Reflow→Cooling) |
| `ssr.rs` | Slow PWM driver for solid-state relay |
| `web.rs` | HTTP server with live dashboard + JSON API |
| `main.rs` | WiFi, control loop (4 Hz), wires everything together |
### Wiring
```
GPIO17 (CS) ── MAX31855 CS
GPIO18 (SCK) ── MAX31855 SCK
GPIO7 (MISO) ── MAX31855 DO
GPIO5 ── SSR input (+)
GND ── SSR input (-)
```
### Build & Flash
```sh
# Prerequisites: mise (https://mise.jdx.dev)
make setup
# Build and flash (WiFi secrets sourced from ../home-assistant-config/esphome/secrets.sops.yaml):
make flash
# OTA update over WiFi (no USB needed):
make ota
```
### Web UI
Once running, open `http://reflow-oven.home/` in a browser. Endpoints:

- `GET /` — dashboard with live temperature chart
- `GET /status` — JSON: `{temperature, target, duty_pct, phase, simulating, elapsed_s}`
- `GET /history` — JSON array of `{t, temp, target, phase}` points
- `POST /start` — begin reflow profile
- `POST /stop` — abort
- `POST /simulate` — toggle simulated sensor
- `POST /profile` — set profile (`sn63pb37` or `sn42bi58`)
- `POST /ota` — upload firmware binary for OTA update
## Status
🚧 **Prototype** — firmware scaffolded, hardware assembly pending.
## Safety
| Layer | Protection |
|-------|-----------|
| Hardware | Emergency stop switch (mains kill) |
| Hardware | Oven mechanical timer (backup cutoff) |
| Software | Over-temperature >250°C → heater off |
| Software | Sensor broken (<-10°C or >300°C) → heater off |
| Software | Profile timeout >10 min → heater off |
## Open Questions
- [x] Which toaster oven? → Severin TO-2052 (9L, 800W, fits Granit 92×99.5mm and pedalboard 179×112mm)
- [x] Over-temperature safety cutoff (software watchdog)
- [x] PID tuning for chosen oven → Kp=1.5, Ki=0.005, Kd=15.0 with ramped targets
- [x] Replace NTC with MAX31855 + Type K thermocouple (NTC too inaccurate above 150°C)
## Related
- [Granit project](https://github.com/laenzlinger/granit) — the PCB this oven will reflow
- [df40c-jig](https://github.com/laenzlinger/df40c-jig) — alignment jig used during assembly
## License
[CERN Open Hardware Licence Version 2 - Permissive](https://ohwr.org/cern_ohl_p_v2.txt)