Hardware was chosen for cost and availability: ESP32 DevKit as the main controller, dual MQ-7 sensors for CO, a combined temperature/humidity sensor, a piezo buzzer for local alarm, and a buck converter for stable power from a 9V supply.
Firmware samples sensors on a fixed cadence, computes rolling features and a fused risk signal locally so the alarm path never depends on the cloud. Network upload is a secondary channel for remote monitoring.
The vision path runs on ESP32-CAM frames. A primary model is used when available; a colour-based fallback detector guarantees a detection signal even with limited compute, which is what produced the 0.99 score on the test frame.
The mobile app is Flutter for a single codebase across Android and iOS. State is designed around zones and devices so the UI stays coherent as deployments grow, and live readings degrade gracefully when the link drops.
Backend services handle device identity, zone configuration, alert lifecycle and frame history, keeping the contract between embedded, ML and app layers explicit.