Three extra lines of code, and every sensor, GPIO, and motor streams to the cloud. Automatically, every run. So when your robot breaks, the data is already there.
#include <AlloyLogger.h> AlloyLogger alloy; void setup() { alloy.wifi("ssid", "pass"); alloy.begin("ALLOY_API_KEY", "robots/sbr"); } void loop() { alloy.log("bno055") .set("heading", heading) .set("pitch", pitch) .set("roll", roll); alloy.log("battery", volts); }
| t_ns | heading | pitch | roll |
|---|---|---|---|
| …694… | 182.4 | -1.2 | 0.6 |
| …695… | 183.1 | -1.0 | 0.7 |
| …696… | 184.9 | -0.7 | 0.9 |
| …697… | 186.2 | -0.4 | 1.1 |
Connect WiFi and AlloyLogger streams everything you log in the background: every GPIO, sensor, and motor, on one timeline, across every run and every version of your code. No serial monitor. No SD card. Nothing to babysit.
Arduino IDE: Sketch → Include Library → Add .ZIP Library. Or via CLI. Depends on ArduinoJson.
$ arduino-cli lib install ArduinoJson $ git clone https://github.com/hughminhphan/alloy-logger-arduino \ ~/Arduino/libraries/AlloyLogger
Create an Alloy account, then: Dashboard → Mesh Storage → API key. One key per rig is fine; use per-device keys for a fleet.
Connect WiFi, call begin() with your key and a mesh path, then log name → value pairs anywhere in your loop. That is the whole integration.
alloy.wifi("ssid", "pass"); alloy.begin("ALLOY_API_KEY", "robots/sbr"); alloy.log("env").set("temp_c", t).set("humidity", h);
Every run lands as its own queryable table. Hit it with SQL or DuckDB, or connect Claude or ChatGPT over MCP and ask it straight: why did my robot fall this time, and has it happened before?
SELECT t_ns, heading FROM bno055 WHERE roll > 1.0;
Open source, and free for your first 10 GB. That is more than enough to log every run, then ask your data why it broke.