Gridspin IoT ships two production devices on one disciplined stack: a 7-day biosignal wearable with 8-ch EMG, multi-wavelength PPG, 9-DOF IMU and GSR — and a 32-sensor smart-shelf that knows which serum bottle just left the pad. Same FreeRTOS uploader, same packed binary, same cloud.
The platform thesis
Every Gridspin IoT device — wearable, shelf, whatever comes next — uses the same firmware spine: a FreeRTOS uploader pinned to Core 0, a packed binary log on SD, OTA over Wi-Fi, NVS-persistent config, per-device token auth into a single cloud ingest. Pick the sensor stack. Reuse the platform.
Product · Biosignal wearable
A multimodal wearable on ESP32-S3 — 8-channel EMG, multi-wavelength PPG, 9-DOF IMU, dual temperature, and GSR. Packed at 131 bytes per record on SD, log-rotated every 15 minutes, uploaded over HTTPS with a per-device token. OTA-flashable, field-recoverable.
# struct-packed, little-endian, 131 bytes / record FORMAT = "<QIII16fbffI8iBB" # │ │ │ │ │ │ │ │ │ # │ │ │ │ │ │ │ │ └── 2× lead-off (bytes) # │ │ │ │ │ │ │ └───── 8× EMG ch (int32) # │ │ │ │ │ │ └─────── GSR (uint32) # │ │ │ │ │ └───────── temp_contact / temp_ir # │ │ │ │ └─────────── (lead-off byte flag) # │ │ │ └─────────────── IMU + euler + quat (16 float) # │ │ └─────────────────── PPG RED · IR · GREEN # │ └────────────────────── sample index # └───────────────────────── timestamp_us (uint64)
Product · Smart-shelf inventory pad
A silicone tray with 32 force-sensitive cells under your high-value SKUs. ESP32-S3 + 2× analog multiplexer in a back-central brain enclosure. Every pull, every replacement, every "did someone actually move this?" — timestamped, uploaded, and ready to alert.
FSR baseline + delta. Every lift, every replacement, every "did this bottle actually get touched today?" — timestamped to the millisecond, logged to SD, pushed to the cloud.
Built for the $80-and-up shelf — medspa serums, Premium, Pro Lab, LashLab, Med Skin, Glow Co., Clear Co.. Drop in your brand mix; the grid adapts.
Shrinkage you can prove, restocks you don't forget. Cells that go empty trigger Slack/SMS; pulls outside hours flag for review.
One platform · two devices · same spine
The discipline below is the recipe. Different sensors, same firmware spine, same cloud path. Add a third device tomorrow — the spine doesn't change.
Dual-core MCU, SPI + I²C peripherals, SD card local logging. Same MCU, same toolchain across every device.
Background uploader task pinned so the capture loop on Core 1 never blocks for Wi-Fi. Multipart HTTPS, retry on the next window.
Struct-packed records, 15-min file rotation, 100 MB max → auto-rotate. 256-entry RAM buffer, flush every ~512 ms at 500 Hz.
DEVICE_INGEST_TOKEN in firmware secrets.h, validated server-side at every /api/data/ingest-esp POST. TLS 1.2/1.3 only.
ArduinoOTA hostname + password gated; onStart halts active capture before flashing so no record is half-written.
Wi-Fi, device ID, server URL persist across reboots via Preferences. Serial commands push live updates — field-recoverable.
From silicon to dashboard
How it works
Three steps from a sensor on a wrist or under a bottle to a number in your dashboard.
On-device sensors stream into a packed binary log on SD. Records are timestamped at the ISR — every byte tells you when it was captured.
A FreeRTOS uploader pushes every 15 minutes over HTTPS with a per-device token. Records sit on SD until the cloud acks — retries on the next window.
Cloud feature extraction lands in your dashboard and your APIs — per-session, per-beat, per-window for biosignals; per-cell, per-pull, per-shift for shelves.
API surface
No MQTT. No WebSockets. Straight HTTPS multipart from the FreeRTOS uploader; clean REST for your apps.
# Ingest a packed binary record from the wearable or shelf curl -X POST https://api.gridspin.xyz/api/data/ingest-esp \ -H "X-Device-Token: $DEVICE_INGEST_TOKEN" \ -H "X-Device-Id: pad-04" \ -H "Content-Type: application/octet-stream" \ --data-binary @/sd/log_20260620_154200.bin # → 200 OK {"records": 487, "session_id": "s-2026-06-20-..."}
Ready when you are
Wearable, smart shelf, or your own device built on the same spine — we'll spec it, scope it, ship it. Kits go out within two weeks.