This repository is my latest attempt to make home coffee roasting simple, reliable, scientific, and affordable.
The tagged v1 release preserves a legacy Nextion-based hardware design. This branch intentionally documents only the current controller, tooling, and firmware layout.
- PID temperature control with profile-based roast automation
- Dual MAX6675 thermocouple monitoring
- Integrated JC4827W543C touchscreen UI using LVGL
- Web console, REST API, and OTA firmware updates
- Artisan integration for roast logging
- Safety systems for over-temperature, sensor faults, and emergency shutdown
For complete setup, build, and deployment instructions, see roaster-firmware/README.md.
Hardware assembly guidance and the project bill of materials should live at the repository root because they span the whole build, not just the firmware:
The tagged v1 release remains the reference for the legacy hardware design. This branch should document only the current controller and any current-generation enclosure or PCB assets that are restored into the repository.
git clone https://github.com/fredvisser/coffee-roaster.git
cd coffee-roaster/roaster-firmware
./tools/bootstrap.sh
./tools/firmware.sh build --board jc4827w543cCanonical developer entrypoints:
./tools/bootstrap.sh./tools/firmware.sh./tools/tests.sh
- Web console:
http://roaster-dev.local/console - OTA update page:
http://roaster-dev.local/update - Profile editor:
http://roaster-dev.local/profile - PID workflow:
http://roaster-dev.local/pid
The firmware can stream roast data to Artisan over WebSockets. For setup and connection steps, see ARTISAN.md. The repository includes an Artisan settings file in Artisan/.
For full details see roaster-firmware/README.md. Key endpoints (id-based):
- GET
/api/profiles→{ profiles: [{ id, name, active }], active: id } - POST
/api/profiles→ Create profile{ name, setpoints?, activate? }→ returns{ ok, id, name, setpoints } - GET
/api/profiles/:id→{ id, name, setpoints, active? } - PUT
/api/profiles/:id→ Update{ name, setpoints, activate? }(id from path wins) - POST
/api/profiles/:id/activate→ Activate profile - DELETE
/api/profiles/:id→ Delete (409 if active)
Notes:
- Times are seconds in API/UI; firmware stores milliseconds.
- Temp bounds 0–500°F; Fan bounds 0–100%.
- Names are display-only; storage is keyed by opaque ids.
For complete Artisan setup, settings import, and connection steps, see ARTISAN.md.