Plug-and-play ESP8266 sensor nodes map ambient decibel levels across any shared space — library, office, campus — and stream it to a live dashboard you can read at a glance.
Live-simulated spectrum — real hardware samples at 1 Hz
The React dashboard pulls every sensor's reading history from the backend and renders each location as a colour-coded decibel chart — green is quiet, red is painful, all against a fixed 0–120 dB scale. This is the real UI, shown with sample library data.
Live dashboard — one card per sensor, each bar coloured by noise level with a dashed line at the 85 dB harmful threshold. Click the preview to explore the full floor.
Sensors discover the backend by IP. The backend discovers sensors by MAC. The dashboard discovers everything automatically.
An ESP8266 node reads its KY-038 microphone 60 times per minute, applies a regression calibration to convert raw ADC counts to decibels, then averages the batch into one clean reading.
The node POSTs { mac, data } to POST /iot/receive. The Express API looks up the registered sensor by MAC and writes the reading to MySQL with a timestamp.
The React dashboard fetches all sensor histories from GET /client/data and renders each location as a colour-coded bar chart — quiet is calm, loud is loud.
Built specifically for the "plug it into a wall and forget about it" deployment model.
Each node runs on a standard USB power adapter. No batteries to change, no cables to route. Stick it on a bookshelf and leave.
Name each sensor after its physical location — "Reading Room," "Café Corner," "Study Hall 2B" — and the dashboard renders one labelled chart per place.
Every reading is timestamped and stored in MySQL. The dashboard draws the full noise history of each location with a dependency-free inline-SVG chart.
A linear regression in firmware converts the cheap KY-038 microphone's raw ADC output into decibel readings — close enough for environmental monitoring.
Admin REST endpoints exist to rename sensors, update location photos, and toggle them active — but there's no dashboard UI for them yet. Call them with curl.
There is no authentication today — the API is open on the local network. Fine for a closed LAN demo, not for public deployment. Auth middleware is the next step.
The dashboard flags any reading above 120 dB. Here's the full scale DeciWatcher was built around.
The KY-038 condenser microphone outputs a raw 10-bit ADC value (0–1023) that scales non-linearly with sound pressure. A linear regression was performed by recording the sensor's output against known reference levels from a calibrated sound level meter across a range of environments.
The two constants — 83.2073 (intercept shift) and 11.003 (scale factor) — are the regression coefficients. The resulting readings sit within ±2 dB of a reference meter for the 40–90 dB range that matters for workspace monitoring. Methodology adapted from Raj, A. (2018), Circuit Digest.
Each reported reading is the average of 60 samples taken one second apart, smoothing out transient spikes (a dropped book, a laugh) so the dashboard reflects sustained ambient noise rather than momentary peaks.
Each node costs roughly $4 in components and draws less power than a phone charger.
The main microcontroller. Handles WiFi, HTTP POST to the backend, and runs the sampling loop. Flashed via Arduino IDE over USB.
Analog output connected to the A0 pin. Sensitivity is fixed at the hardware level — calibrated via regression in firmware.
Any standard phone charger works. The NodeMCU draws ~80 mA at idle. No batteries, no interruptions — plug it in and forget it.
DeciWatcher started as a 2019 IUPUI computer-science senior capstone and works end-to-end as a prototype. Here's exactly where each piece stands today — no roadmap theatre.
Samples the microphone, applies the calibration, and POSTs an averaged reading every ~60 seconds. WiFi credentials are hardcoded and require a reflash to change.
POST /iot/receiveValidates the packet, resolves the sensor by MAC, and writes the reading to MySQL. Returns clear 400/404/500 status codes.
Fetches all sensor histories from GET /client/data and renders per-location charts. Recently migrated off Create React App to Vite; the production bundle now ships zero known-vulnerable dependencies.
The endpoints work and are documented, but nothing in the dashboard calls them yet — you drive them with curl or a REST client.
No auth — the API is open on the LAN. Readings grow unbounded with no archival job. Both are known gaps, suitable only for a trusted local network today.
A React Native app for SoftAP sensor setup was in the original proposal but was cut for time. Not started.
No exotic dependencies. If you've run a Node app before, you can deploy this in under five minutes.
Clone the repo, flash a sensor, run the stack. The whole thing takes about 20 minutes end-to-end.