{"id":50953952,"url":"https://github.com/laenzlinger/reflow-oven","last_synced_at":"2026-06-18T04:32:33.225Z","repository":{"id":356526423,"uuid":"1232075004","full_name":"laenzlinger/reflow-oven","owner":"laenzlinger","description":"ESP32-S3 controlled reflow soldering oven — Rust firmware, PID temperature control, NTC thermistor, SSR switching, WiFi web UI","archived":false,"fork":false,"pushed_at":"2026-05-23T14:05:51.000Z","size":207,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-23T16:08:06.331Z","etag":null,"topics":["diy-electronics","embedded","esp-rs","esp32","esp32-s3","ntc-thermistor","pid-controller","reflow-oven","reflow-soldering","rust","ssr"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cern-ohl-p-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/laenzlinger.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-07T15:05:39.000Z","updated_at":"2026-05-23T14:05:55.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/laenzlinger/reflow-oven","commit_stats":null,"previous_names":["laenzlinger/reflow-oven"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/laenzlinger/reflow-oven","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laenzlinger%2Freflow-oven","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laenzlinger%2Freflow-oven/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laenzlinger%2Freflow-oven/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laenzlinger%2Freflow-oven/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/laenzlinger","download_url":"https://codeload.github.com/laenzlinger/reflow-oven/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laenzlinger%2Freflow-oven/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34476727,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-18T02:00:06.871Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["diy-electronics","embedded","esp-rs","esp32","esp32-s3","ntc-thermistor","pid-controller","reflow-oven","reflow-soldering","rust","ssr"],"created_at":"2026-06-18T04:32:32.433Z","updated_at":"2026-06-18T04:32:33.191Z","avatar_url":"https://github.com/laenzlinger.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Reflow Oven\n\nToaster oven conversion to a reflow soldering oven with a custom controller PCB.\n\n## Goals\n\n- Reliable lead-free reflow profiles (peak ~245°C)\n- Thermocouple-based closed-loop temperature control\n- Programmable profiles (preheat → soak → reflow → cooling)\n- Safe operation (over-temperature protection, door interlock)\n\n## Architecture\n\n```\nMAINS → [Emergency Stop] → [Electronics Box] → [Oven]\n                                  │\n                            ┌─────┴─────┐\n                            │ SSR       │──── switches Live to oven elements\n                            │ ESP32-S3  │──── WiFi web UI, PID control\n                            │ MAX31855  │──── thermocouple into oven chamber\n                            └───────────┘\n```\n\n## Components\n\n| Component | Part | Role |\n|-----------|------|------|\n| Toaster oven | Severin TO-2052 (9L, 800W) | Heating chamber |\n| Controller | ESP32-S3-DevKitC-1 | Profile management, PID control, WiFi web UI |\n| SSR | Solid-state relay (available) | Switches mains to heating elements |\n| Temperature sensor | MAX31855 + Type K thermocouple | Temperature sensing inside chamber (±2°C up to 1350°C) |\n| Emergency stop | Mushroom-head switch | Mains kill switch |\n| Enclosure | Abzweigdose ~180×120mm | Houses ESP32 + SSR + PSU |\n| Solder paste | Relife HW21 Sn63/Pb37 (183°C) | Primary paste |\n| Solder paste | Sn42/Bi58 low-temp (138°C) | Alternative for heat-sensitive components |\n\n## Wiring\n\n```\nMAINS (230V) ─── [Emergency Stop] ─── Kabelverschraubung into box\n                                              │\n  Live ──────────────── SSR input ─── SSR output ──── Oven element (hot)\n  Neutral ─────────────────────────────────────────── Oven element (neutral)\n  Earth ───────────────────────────────────────────── Oven chassis\n\n  SSR control (+) ──── ESP32 GPIO5\n  SSR control (-) ──── ESP32 GND\n\n  ESP32 3.3V ─── MAX31855 VCC    (red)\n  ESP32 GND  ─── MAX31855 GND    (black)\n  ESP32 GPIO17 ── MAX31855 CS    (brown)\n  ESP32 GPIO18 ── MAX31855 SCK   (orange)\n  ESP32 GPIO7 ── MAX31855 SO     (yellow)\n  Type K thermocouple ── MAX31855 T+/T-\n\n  ESP32 powered via USB (separate charger)\n  Thermocouple wires through Kabelverschraubung into oven chamber\n```\n\n## Oven Modifications\n\n1. Bypass (short) the built-in thermostat\n2. Drill ~4mm hole for thermocouple wire, seal with Kapton tape\n\n## Firmware\n\nRust (esp-rs) firmware for ESP32-S3-DevKitC in `firmware/`.\n\n### Modules\n\n| File | Purpose |\n|------|---------|\n| `sensor.rs` | `TemperatureSensor` trait + MAX31855 thermocouple (SPI) |\n| `pid.rs` | PID controller (output 0–100%) |\n| `profile.rs` | Reflow profile state machine (Preheat→Soak→Reflow→Cooling) |\n| `ssr.rs` | Slow PWM driver for solid-state relay |\n| `web.rs` | HTTP server with live dashboard + JSON API |\n| `main.rs` | WiFi, control loop (4 Hz), wires everything together |\n\n### Wiring\n\n```\nGPIO17 (CS)  ── MAX31855 CS\nGPIO18 (SCK) ── MAX31855 SCK\nGPIO7 (MISO) ── MAX31855 DO\n\nGPIO5        ── SSR input (+)\nGND          ── SSR input (-)\n```\n\n### Build \u0026 Flash\n\n```sh\n# Prerequisites: mise (https://mise.jdx.dev)\nmake setup\n\n# Build and flash (WiFi secrets sourced from ../home-assistant-config/esphome/secrets.sops.yaml):\nmake flash\n\n# OTA update over WiFi (no USB needed):\nmake ota\n```\n\n### Web UI\n\nOnce running, open `http://reflow-oven.home/` in a browser. Endpoints:\n\n![Web UI](docs/web-ui.png)\n\n- `GET /` — dashboard with live temperature chart\n- `GET /status` — JSON: `{temperature, target, duty_pct, phase, simulating, elapsed_s}`\n- `GET /history` — JSON array of `{t, temp, target, phase}` points\n- `POST /start` — begin reflow profile\n- `POST /stop` — abort\n- `POST /simulate` — toggle simulated sensor\n- `POST /profile` — set profile (`sn63pb37` or `sn42bi58`)\n- `POST /ota` — upload firmware binary for OTA update\n\n## Status\n\n🚧 **Prototype** — firmware scaffolded, hardware assembly pending.\n\n## Safety\n\n| Layer | Protection |\n|-------|-----------|\n| Hardware | Emergency stop switch (mains kill) |\n| Hardware | Oven mechanical timer (backup cutoff) |\n| Software | Over-temperature \u003e250°C → heater off |\n| Software | Sensor broken (\u003c-10°C or \u003e300°C) → heater off |\n| Software | Profile timeout \u003e10 min → heater off |\n\n## Open Questions\n\n- [x] Which toaster oven? → Severin TO-2052 (9L, 800W, fits Granit 92×99.5mm and pedalboard 179×112mm)\n- [x] Over-temperature safety cutoff (software watchdog)\n- [x] PID tuning for chosen oven → Kp=1.5, Ki=0.005, Kd=15.0 with ramped targets\n- [x] Replace NTC with MAX31855 + Type K thermocouple (NTC too inaccurate above 150°C)\n\n## Related\n\n- [Granit project](https://github.com/laenzlinger/granit) — the PCB this oven will reflow\n- [df40c-jig](https://github.com/laenzlinger/df40c-jig) — alignment jig used during assembly\n\n## License\n\n[CERN Open Hardware Licence Version 2 - Permissive](https://ohwr.org/cern_ohl_p_v2.txt)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaenzlinger%2Freflow-oven","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flaenzlinger%2Freflow-oven","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaenzlinger%2Freflow-oven/lists"}