| # | Workstream | Status | Scope |
|---|---|---|---|
| 01 | Wireless BLE Rain Simulator | ● Complete | Generate simulated rain events |
| 02 | BLE Rain Monitoring System | ● Complete | Transmit and monitor rain events |
| 03 | Tipping-Bucket Tip Calculation | ● In Progress | Calculate simulated tips on Arduino Nano 33 BLE |
| 04 | Real-Time Tipping Bucket Counting | ● Next Development | Physical prototype + real water + TinyML |
Established the baseline point-to-point wireless link between an Arduino Nano 33 BLE and a PC. Computes simulated raindrop acoustic parameters in software on the MCU and broadcasts GATT notifications to a real-time Python audio listener.
ArduinoBLE. Advertises as Nano33_Rain with custom Rain Service UUID and 32-bit unsigned drop counter characteristic.sounddevice and numpy. Features downward frequency sweep, exponential decay envelope, and spatial stereo panning.
Expanded from a single point-to-point link into a true multi-node wireless IoT monitoring hub. The Arduino Nano 33 BLE concurrently broadcasts live droplet events to both an ESP32-S3 round AMOLED smart display and a PC Python listener simultaneously.
Arduino_GFX_Library for the round CO5300 466x466 AMOLED panel (offset parameters 6, 0, 0, 0, brightness 220).while (lastProcessedCount < targetRainCount)). Every drop sound is played and counted even under RF delays.[HH:MM:SS]) across the Python listener matching the requested management format.
This workstream will enhance the existing monitoring system to translate simulated or acoustic droplet events into standard meteorological tipping-bucket rainfall metrics.
The conversion ratio is formally defined as:
Standard physical tipping-bucket rain gauges tip after accumulating a precise volume of water (typically 0.2 mm or 0.1 mm of precipitation). Translating 126 acoustic droplets into 1 mechanical tip bridges micro-droplet detection to macro-level rainfall depth.
floor(dropCount / 126) and remaining drops = dropCount % 126.TIPS: 3 | DROPS: 42).
The project follows a rigorous phased progression: starting with pure software simulation, establishing robust wireless telemetry, expanding into multi-node edge IoT, prototyping physical enclosures, and finally transitioning to real-world TinyML physical sensing.
The following entries reflect real, documented engineering issues encountered during development, verified from commit logs, video frame-by-frame analysis, and terminal debugging.
vid1_delay.mp4 showed PC at Drop #21 while AMOLED was lagging at #13. Incoming BLE notifications only set a boolean flag newRainEvent = true. When drop #22 arrived while #21 was still computing audio, the event flag was overwritten and lost. Furthermore, i2s_zero_dma_buffer() was abruptly cutting off the audio tail mid-DMA transfer.
while (lastProcessedCount < targetRainCount).
(2) Pre-computed a 256-sample sine wave lookup table (sineTable[256]) in setup() to eliminate heavy floating-point math during audio loop.
(3) Increased I2S DMA buffers to 8 and removed i2s_zero_dma_buffer(), allowing hardware DMA auto-clearing without clipping.
(4) Replaced periodic 2-second advertising restarts on Nano 33 BLE with event-driven advertising so active central packets are never disrupted.
COM8.
ctypes.windll.ole32.CoInitializeEx(None, 0x0)) before loading audio libraries.
(2) Added an active 10-second periodic bidirectional GATT heartbeat ping (read_gatt_char) in the Python loop to keep the Windows BLE scheduler active.
(3) Configured connection interval (40–80ms) and supervision timeout (6.0s) on Nano 33 BLE.
handleRainGeneration() in Nano 33 BLE firmware (if (!isConnected) return;). Droplets are only generated when at least one central is actively connected.
Practical hands-on experience in 3D enclosure prototyping adapted from a MakerWorld reference model, alongside foundational competencies developed in multi-central BLE, real-time audio DSP, and embedded AMOLED displays.
This project marked my first time working with 3D CAD model files and physical 3D printing. Rather than designing the complex circular snap-fit enclosure completely from scratch, I leveraged an existing community design on MakerWorld as an engineering reference model.
I studied the model's dimensions, adapted it to our project requirements, sliced the file, and successfully printed the physical prototype monitor clamp using my personal 3D printer. This provided invaluable practical experience in tolerance fit, FDM printing layer orientation, and physical device packaging.
🔗 Reference Model: MakerWorld #3190305 — Waveshare ESP32-S3 AMOLED 1.75 Monitor Holder ↗Mastered Nordic nRF52840 connection parameter negotiation, multi-peer advertising re-arming, and low-latency GATT throughput (15–35ms).
Implemented real-time software acoustic droplet synthesis across both high-level Python (continuous stream) and bare-metal ESP32-S3 (ES8311 I2S DMA).
Successfully driven the round 466x466 CO5300 AMOLED panel over QSPI with Moon On Our Nation's GFX library, implementing zero-flicker partial updates.
Applied structured rapid engineering cycles for firmware architecture, root-cause diagnosis of RF synchronization bottlenecks, and disciplined GitLab version control workflows.
The immediate next steps focus on completing Workstream 03 (software tipping-bucket calculation) and executing physical hardware testing for Workstream 04.