Working prototype · IoT · Open source

Know the noise.
Find your focus.

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.

⭐ View on GitHub How it works ↓

Live-simulated spectrum — real hardware samples at 1 Hz

60s
Update interval per sensor
60
Samples averaged per reading
~$4
Parts cost per sensor node
±2 dB
Calibration target, 40–90 dB

One page.
Every sensor.

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.

Three-layer stack,
zero configuration.

Sensors discover the backend by IP. The backend discovers sensors by MAC. The dashboard discovers everything automatically.

01
🎙️

Sense

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.

02

Store

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.

03
📊

Visualize

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.

Everything you need,
nothing you don't.

Built specifically for the "plug it into a wall and forget about it" deployment model.

🔌

Wall-powered sensors Stable

Each node runs on a standard USB power adapter. No batteries to change, no cables to route. Stick it on a bookshelf and leave.

🗺️

Per-location cards Stable

Name each sensor after its physical location — "Reading Room," "Café Corner," "Study Hall 2B" — and the dashboard renders one labelled chart per place.

📈

Historical bar charts Stable

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.

🧮

Regression-calibrated dB Stable

A linear regression in firmware converts the cheap KY-038 microphone's raw ADC output into decibel readings — close enough for environmental monitoring.

⚙️

Sensor management API only

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.

🔐

Access control Planned

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.

What the numbers mean.

The dashboard flags any reading above 120 dB. Here's the full scale DeciWatcher was built around.

30–45 dB Quiet library, whispered conversation Ideal
45–55 dB Recommended office background level Good
55–70 dB Normal conversation, busy café Moderate
70–85 dB Loud office, approaching harmful range Loud
85–120 dB Machinery, concerts — sustained exposure harmful Harmful
120+ dB Threshold of pain — immediate risk Danger

Cheap mic,
accurate readings.

dB = (analogRead(A0) + 83.2073) / 11.003

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.

Three parts.
One sensor node.

Each node costs roughly $4 in components and draws less power than a phone charger.

🧠

ESP8266 (NodeMCU / Wemos D1 Mini)

The main microcontroller. Handles WiFi, HTTP POST to the backend, and runs the sampling loop. Flashed via Arduino IDE over USB.

🎙️

KY-038 Condenser Microphone

Analog output connected to the A0 pin. Sensitivity is fixed at the hardware level — calibrated via regression in firmware.

🔌

5V USB Power Supply

Any standard phone charger works. The NodeMCU draws ~80 mA at idle. No batteries, no interruptions — plug it in and forget it.

Honest about
what's built.

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.

Sensor firmware (ESP8266)

Samples the microphone, applies the calibration, and POSTs an averaged reading every ~60 seconds. WiFi credentials are hardcoded and require a reflash to change.

Stable

Ingest API · POST /iot/receive

Validates the packet, resolves the sensor by MAC, and writes the reading to MySQL. Returns clear 400/404/500 status codes.

Stable

Dashboard · React 18 + Vite

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.

Stable

Admin API · rename / relocate / toggle

The endpoints work and are documented, but nothing in the dashboard calls them yet — you drive them with curl or a REST client.

API only

Authentication & data retention

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.

Planned

WiFi provisioning companion app

A React Native app for SoftAP sensor setup was in the original proposal but was cut for time. Not started.

Planned

Built on boring,
reliable technology.

No exotic dependencies. If you've run a Node app before, you can deploy this in under five minutes.

Node.js 18+
Express 4
React 18
Vite 6
MySQL / MariaDB
Arduino
ESP8266

Ready to map your space?

Clone the repo, flash a sensor, run the stack. The whole thing takes about 20 minutes end-to-end.

View on GitHub → Read the docs