IoT · Real-time · 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
Sensors on the same network
~$4
Cost per sensor node
±2 dB
Calibrated accuracy

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.

🔌

Truly wireless sensors

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

🗺️

Multi-location heatmap

Name each sensor after its physical location — "Reading Room," "Café Corner," "Study Hall 2B" — and the dashboard maps noise level to place.

📈

Historical bar charts

Every reading is timestamped and stored indefinitely. View the full noise history of any location — peak hours, quiet windows, recurring patterns.

🧮

Regression-calibrated dB

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

⚙️

Sensor management API

The admin REST endpoints let you rename sensors, update their location photos, and toggle them active or inactive — no database client needed.

🔐

12-factor config

Database credentials and server port live in a .env file, never in source control. A checked-in .env.example documents every variable.

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.

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
Express 4
React 16
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