An IoT home automation system built with ESP32 microcontrollers - sensor data streaming into Firebase, surfaced through a web frontend and React Native app.
Built with two teammates, the goal was simple: take home automation out of consumer black-box territory and build it ourselves - from the hardware up. That meant writing firmware, designing a real-time data pipeline, and shipping two separate frontends that work together.
ESP32 microcontrollers sit at the edge, reading sensors and controlling devices. Firebase Realtime Database acts as the sync layer between hardware and software. A custom web frontend and a React Native mobile app both subscribe to that data stream - showing live readings and sending control commands back to the device.
The system has three layers: hardware, sync, and interface. Firebase RTDB is the glue - it decouples the firmware from the frontends so either side can be updated independently.
The ESP32 occasionally drops its WiFi connection. A naive implementation hard-resets on disconnect, causing missed sensor readings and dropped commands. We wrote reconnection logic in MicroPython with exponential backoff - the firmware waits progressively longer between retries rather than hammering the network, then resumes normal operation once it reconnects.
Raw DHT22 temperature readings consistently read about 4–5°C higher than a reference thermometer - a known issue with the sensor's self-heating inside enclosed casings. We added calibration offsets in the firmware. This taught us that hardware tolerances are real: you can't just trust a sensor's datasheet at face value in a specific physical installation.
Firebase's onValue() fires every time a node changes. If you put all sensor data in one flat node, a single temperature update triggers a full re-render of everything. We restructured the database into separate sensor nodes so each listener only fires when its specific data changes.
The system ran reliably in a real home environment over several weeks of continuous use. We demonstrated it to assessors and peers - live sensor readings updating in real time on both the web dashboard and mobile app, with device control working in the other direction.
For me the biggest takeaway was how different hardware engineering is from pure software. Timing, tolerances, physical installation - things you can't unit test. You have to build, measure, and iterate.
Real-time temperature, humidity, and motion data visible in both app and web frontend.
Device switching works from both the web dashboard and the React Native mobile app.
System ran continuously after WiFi reconnection logic was implemented.