Air-Quality Monitoring System
A full-stack IoT air-quality monitor: ESP32 firmware reading four I²C sensors, MQTT into TimescaleDB, and Grafana dashboards — all Dockerized on a Raspberry Pi.
The build runs end to end: an Arduino Nano ESP32 reads four I²C sensors — CO₂ (Infineon XENSIV PAS), particulate matter (Sensirion SPS30), temperature/humidity/pressure (Bosch BME280), and VOC (Sensirion SGP40) — and shows a color-coded live view on a small TFT display. Readings travel over MQTT to a Dockerized backend where they land in TimescaleDB; outdoor readings come from a PurpleAir node polled through its API, with EPA-corrected PM2.5 for honest indoor-versus-outdoor comparisons.

Design notes:
- Non-blocking firmware — each sensor polls on its own interval, with ring-buffer averaging to tame noisy readings.
- Reproducible backend — Mosquitto, ingestion, TimescaleDB, and Grafana are composed with Docker, including auto-provisioned dashboards.
- Data-quality monitoring — Wi-Fi signal strength, sensor uptime, and reading intervals are tracked alongside the measurements themselves.