A compact, menu‑driven oven controller for small drying chambers, laboratory ovens, and thermal curing enclosures. Runs on an Arduino Uno (ATmega328P) with real‑time temperature & humidity sensing, PID‑regulated heating, and a 20×4 LCD interface.
flowchart LR
DS18B20[DS18B20 Temp] --> UNO[Arduino Uno]
DHT22[DHT22 Humidity] --> UNO
RTC[DS3231 RTC] --> UNO
UNO --> RELAY1[Heater Relay]
UNO --> RELAY2[Exhaust Relay]
UNO --> LCD[20x4 I²C LCD]
BTN1[UP] --> UNO
BTN2[DOWN] --> UNO
BTN3[SELECT] --> UNO
# 1. Install Arduino IDE (or arduino-cli)
# 2. Install required libraries via Library Manager:
# LiquidCrystal_I2C, OneWire, DallasTemperature,
# DHT sensor library, RTClib, TimeLib, TimeAlarms, PID_v1
# 3. Wire the hardware (see pin map below)
# 4. Open and upload:
arduino-cli compile --fqbn arduino:avr:uno src/uno/OvenController/
arduino-cli upload -p /dev/ttyACM0 --fqbn arduino:avr:uno src/uno/OvenController/| Pin | Function |
|---|---|
| 2 | Heater relay |
| 3 | Exhaust relay |
| 4 | UP button |
| 5 | DOWN button |
| 6 | SELECT button |
| 7 | DS18B20 temperature sensor |
| 8 | DHT22 humidity sensor |
| A4 | I²C SDA (LCD) |
| A5 | I²C SCL (LCD) |
- Power on — LCD shows "Oven Ready" with current temp & set-point
- Press SELECT — enter temperature setup (60–125 °C)
- UP/DOWN — adjust set-point; SELECT — confirm and go to timer
- Set timer (1–180 min); SELECT — confirm
- Review & START — oven runs, PID regulates temperature, exhaust runs continuously
- STOP any time or waits for timer expiry — oven shuts down safely
The firmware is fully modular — each hardware block lives in its own .h/.cpp pair under src/uno/OvenController/:
| Module | Files | Responsibility |
|---|---|---|
| Main | OvenController.ino |
State machine (IDLE→SET_TEMP→SET_TIMER→READY→RUNNING→FINISHED→ERROR), setup(), loop(), button handling, LCD rendering |
| LCD | LCD_CONF.h/.cpp |
20×4 I²C LCD wrapper — initLCD(), clearLCD(), setLCDText() overloads |
| Relays | RELAY_CONF.h/.cpp |
Heater & exhaust relay control via digitalWrite |
| Buttons | TACTILE_CONF.h/.cpp |
Debounced 3-button input with flag system |
| DHT22 | DHT_CONF.h/.cpp |
DHT22Sensor class — readHumidity() |
| DS18B20 | DS18B20_CONF.h/.cpp |
DS18B20Sensor class — readTemperature() |
| DS3231 | DS3231_CONF.h/.cpp |
RTC init, periodic time sync, alarm scheduling |
| PID | PID_CONF.h/.cpp |
PID_v1 controller (P=4, I=0, D=22) with time‑proportional windowing |
Full documentation is available in /docs:
| File | What it covers |
|---|---|
| docs/overview.md | Project purpose, stakeholders, use cases |
| docs/architecture.md | System design, state machine diagram, module breakdown |
| docs/api-reference.md | All functions, classes, globals, and behaviour |
| docs/functions.md | Per-module function reference with input/output specs |
| docs/data-flow.md | Lifecycle flow, sequence diagrams, timing charts |
| docs/setup-guide.md | Hardware wiring, library install, upload steps |
| docs/usage-guide.md | Menu walkthrough, cooking workflow, calibration |
| docs/troubleshooting.md | Common issues, sensor errors, relay problems |
LiquidCrystal_I2C— I²C LCD driverOneWire+DallasTemperature— DS18B20 communicationDHT sensor library— DHT22 humidity sensorRTClib— DS3231 RTCTimeLib— time utilitiesTimeAlarms— alarm & timer schedulingPID_v1— PID control algorithm
- Over‑temperature cutoff — immediate shutdown at >130 °C
- Exhaust always on during RUNNING state
- Relays start OFF in
initRelays()— failsafe on power-up - Over‑temperature error state — requires manual reset via SELECT
Sajed Lopez Mendoza
github.com/qppd | facebook.com/qppd.dev | sajed-lopez-mendoza.vercel.app
MIT — free to use, modify, and distribute.