An open API service indexing awesome lists of open source software.

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

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:

![Web UI](docs/web-ui.png)

- `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)