r/ChatGPTArduino

I trained a transformer from scratch on an ESP32-S3. Not inference, actual on-chip training with hand-written backprop.
▲ 190 r/ChatGPTArduino+2 crossposts

I trained a transformer from scratch on an ESP32-S3. Not inference, actual on-chip training with hand-written backprop.

Most ESP32 language model projects run inference: you train on a GPU, quantize, flash it to the board. I wanted the opposite. The chip starts with random weights and trains itself.

Everything happens on board: random init (and no, not seed 42), tokenising the corpus, forward pass, cross-entropy, backprop, SGD with momentum (not Adam, not AdamW), checkpoint to flash, and generation from the weights it learned. Nothing outside the chip.

No PyTorch, no autograd. Every derivative in the backward pass is written out by hand in C.

Setup:

* ESP32-S3 N16R8, about $8

* SH1106 OLED showing the live loss

* Single block transformer, single head causal attention, tied embeddings, ReLU FFN, LayerNorm

* ~319K params, char level, vocab 31, context 32

* 5,000 steps, roughly two days on a phone charger

The training loss moving average went from 2.137 to 1.871 over the stretch I photographed. With vocab 31 a randomly initialised model has to start somewhere around ln(31) ≈ 3.43, but I never photographed the first steps, so I can't prove that part from the OLED.

The interesting constraint isn't the parameter count, it's memory. To train you need weights, gradients, optimizer momentum, activations and scratch buffers all resident at the same time. Inference has it much easier: it still needs activations, but no gradients and no optimizer state.

Where it's weak:

* No validation split. The checkpoint I keep is just the one with the lowest moving average of training loss.

* The corpus is Klingon: small, regular, agglutinative, and published under Apache 2.0. The output shows plausible use of suffixes like `-wI'`, `-Daq` and `-taHvIS`, but it isn't reliably meaningful.

* With a corpus this small I can't cleanly separate generalisation from memorisation.

* No full serial log. It ran unattended, so what I have is the code, the checkpoint and photos of the OLED at three points.

This is not ChatGPT on a microcontroller. It's a small experiment showing that an $8 ESP32-S3 can run the whole training loop of a transformer starting from random weights.

Apache 2.0. The corpus is in the repo so you can reproduce a run, but the fun part is swapping it for your own text.

https://github.com/Carloscodix/qapla

Note: written by me, translated and adapted to Reddit with AI help.

u/flash_speed3412 — 1 day ago
▲ 124 r/ChatGPTArduino+1 crossposts

Turned a wall-switch-box ESP32-S3 module into a desk AI quota display.

I kept hitting my Claude Code quota limit mid-task, so I built a small always-on panel that just shows how much I have left. And I also added later codex and antigravity. Now sits on my desk.

The device is a Waveshare ESP32-S3 Smart 86 Box with a touch 480×480 touch display, 8 MB octal PSRAM. 86×86 mm.

The display was the easy part. Four things that were harder:

1. The panel desynced permanently under load — and only on production builds. Under a sustained full-screen scroll the image would slip into a fixed vertical offset and stay there until reboot. Framebuffers live in PSRAM with a 30-line bounce buffer (28.8 KB) in internal DMA SRAM. At a 12 MHz pixel clock, scan-out alone pulls ~19 MB/s off the octal PSRAM — that buffer is 1.37 ms of runway. Add LVGL in DIRECT mode redrawing the whole framebuffer plus XIP fetches and the refill misses its deadline. It's a runway, not a queue, so the slip never recovers. 8 MHz → 2.06 ms → fixed. Except not quite: flash and PSRAM share the MSPI bus and the cache is off while flash is being programmed, and production has flash encryption on, so each page is AES-256'd and takes longer than the plaintext dev path. That's the entire reason it looked production-specific. 

2. Internal DRAM, not PSRAM, is the thing you actually run out of. I had 8 MB of PSRAM and 6.2 KB of free internal heap. Everything that matters — TLS handshake buffers, DMA descriptors, ISR stacks — has to be internal, and LVGL plus the RGB driver had quietly eaten it in .bss. Moving the cold buffers to PSRAM freed 41,764 bytes and took free internal heap from 6,239 to 48,043. The rule I ended up with isn't "avoid PSRAM", it's "no PSRAM traffic on the live-render path" — which is a much more useful rule.

3. Signed OTA on a secure-boot device needed Ed25519, which IDF doesn't give you. Updates are gated behind a signed manifest, but mbedTLS as shipped in IDF has no EdDSA arithmetic at all. On top of that: anti-rollback, per-version failure records so a bad build can't boot-loop forever, and a check that refuses to start an update on battery — a brownout halfway through a 2.1 MB write is exactly how you brick one of these.

4. The device holds no credentials, which is a design constraint, not a feature list. Putting API keys on a Wi-Fi gadget that sits on a desk seemed like a bad idea, so it doesn't have any. A small broker runs on my own machine, reads the token counts from the CLI logs already on disk, and the device polls it over the LAN — HMAC-SHA256 with a timestamp and nonce so a captured request can't be replayed. Worst case if someone owns the device is they learn how much quota I have left.

Happy to go deeper on any of these. 

u/flash_speed3412 — 1 day ago
▲ 44 r/ChatGPTArduino+1 crossposts

I built an ESP32-S3 desk terminal (3.5in, mic array) — the memory and LVGL gotchas that nearly killed it

Short version: it's a small desk terminal built around an ESP32-S3 that mirrors what my coding agent is doing on my PC . It talks over WebSocket to a small bridge running on my machine. I've had it on my desk for a few months now.

Hardware:

- ESP32-S3
- 3.5" 480x320, ST7796 over SPI, driven through esp_lcd + LVGL 9.2
- ES7210 mic array, ES8311 codec, NS4168 amp
- Rotary encoder + 3 mechanical key switches

The parts that actually cost me time:

  1. Internal RAM. This was the whole war. Display buffers, LVGL, WiFi, WebSocket and the audio pipeline all want internal SRAM and PSRAM doesn't help for most of it. At the worst point I had 4.7 KB free internal heap during a voice session. It sits around 27 KB in the same state now. What actually moved the needle: task stacks into PSRAM where allowed, WiFi TX buffers from 16 down to 8, killing BT in sdkconfig.defaults (it quietly claims ~30 KB even when you never call it), and tracking down a heap_caps alloc/free mismatch that leaked on every reconnect.

  2. PSRAM stacks and flash I/O do not mix. Follow-on from the above: I moved a pile of task stacks into PSRAM, and one of them was the task that reads audio assets off SPIFFS. Instant crash, every time, very confusing. If a task touches flash or SPIFFS, its stack has to stay in internal RAM. That one cost me a day.

  3. Half-drawn characters in LVGL. Text in my cards would occasionally render with a glyph sliced down the middle. Root cause was two render paths disagreeing: the full-frame path skips a glyph entirely when it doesn't fit, the partial-redraw path happily clips it mid-glyph. Same string, different result depending on which path ran. Fixed by truncating to whole characters myself before handing the string to LVGL instead of trusting it to clip.

  4. Regenerating sdkconfig loses things you can't see. I deleted and regenerated sdkconfig once and silently lost two settings I had only ever touched in menuconfig (mbedtls external mem, sys_evt stack size). The result was a boot loop that took a while to trace back to that. Anything load-bearing lives in sdkconfig.defaults now.

Firmware is being open sourced in stages. Happy to go deeper on any of this.

Fair warning: I am turning this into a product eventually, so weigh my enthusiasm accordingly. Nothing to sell yet and no link.

Anyone else fighting the internal-RAM-versus-everything war on the S3? Curious what people cut first.

u/Cold_Arm3819 — 1 day ago
▲ 141 r/ChatGPTArduino+2 crossposts

I trained a 582k-parameter transformer from scratch that runs entirely on an ESP32-S3 and controls GPIO from natural language.

I trained a 582K-parameter transformer from scratch that runs entirely on an ESP32-S3 and controls GPIO from natural language

I wanted to see how small a language model could get if it only had to understand a very narrow domain instead of knowing about the world.

So I trained a \~582K-parameter transformer from scratch that runs entirely on an ESP32-S3 and translates natural-language commands into hardware actions.

No cloud, no API key, and no PC involved during inference.

For example:

\> turn on the led on pin 17

Pin 17 is HIGH.

\> set pin 5 to 75 percent

Pin 5 at 75% PWM.

\> move the servo 30 degrees more

Servo on pin 13 moved +30 degrees.

\> stop everything

Done.

It currently understands things like:

GPIO digital output

PWM / brightness

frequency generation

absolute and relative servo movement

ADC / digital reads

chained commands

English and Spanish

One design decision I thought was especially important: the neural network never decides whether touching a GPIO is safe.

The transformer only translates the sentence into a small DSL representing intent. A deterministic C layer then validates the requested pins and hardware operation before anything is executed.

So if the model hallucinates something like GPIO 30, which is part of the flash bus on my module, the firmware simply refuses to execute it.

The base model is only \~2.2 MB and lives in PSRAM. I also included the complete training pipeline, dataset generator, tokenizer, inference implementation and the trained English/Spanish models in the repository.

The interesting part for me isn't really controlling LEDs with an LLM (I know it's not a LLM maybe I can call this a SML stands for Small Language Model). It's the idea that a very small domain-specific transformer can provide a natural-language interface to embedded hardware without needing an internet connection.

I'm curious what other closed embedded domains this approach could be useful for.

Repository:

https://github.com/BareiroJorge/esp32-llm-commands

u/flash_speed3412 — 1 day ago
▲ 55 r/ChatGPTArduino+4 crossposts

We built a micromouse on perfboard with an ESP32-S3 and placed 3rd at AAMC 2026. Firmware & build log are open source.

Hey everyone,

My teammate and I competed at the All America Micromouse Contest (AAMC 2026) at UCLA IEEE a few months back and took 3rd place overall. We just cleaned up and open-sourced our entire codebase and build log: https://github.com/enkhbold470/neuromouse26

A few interesting engineering details from the build:

  1. The "Ugly Protoboard" Pivot:
    Our V1 was a custom-designed, clean PCB. But every time we had power rail noise or needed to tweak sensor positioning, we were stuck waiting a week for a board respin. We scrapped it and built V2 on raw perfboard with point-to-point soldering and a mechanical keyboard blue switch for mode select. It looked like a rat's nest, but being able to desolder and reposition an IR emitter in 15 minutes is what got us to the competition.

  2. ESP32-S3 instead of STM32:
    Almost every competitive micromouse runs on STM32. We went with an ESP32-S3 running PlatformIO. We used the ESP32 hardware PCNT (Pulse Counter) peripheral for 4x encoder decoding so the CPU didn't choke on interrupts, and cached explored maze walls into ESP32 NVS flash so the fast run could skip sensing entirely.

  3. Motion Control & Algorithms:
    - 16x16 flood-fill BFS solver.
    - 200 Hz PID control loop timed purely with "micros()" 😂
    - no RTOS tasks or "delay()" in the control path.
    - Trapezoidal velocity profiling that fuses consecutive straight cells into a single acceleration corridor so the mouse doesn't brake every 180mm cell.
    - 4x IR emitter/receiver pairs (SFH4545 + TEFT4300) with lookup tables for distance calibration + MPU-6500 gyro for yaw-hold.

  4. 6x3 Home Maze vs 16x16 Real Maze:

We tested at home on a tiny 6x3 grid made of homedepot whiteboard ~$10 board + 3D printed walls. Scaling to the official 16x16 (256 cells) UCLA maze was brutal because millimeter errors compound fast over long straightaways.

The 0.96" OLED display was the real MVP on competition day— like seeing live battery, IR readings, and flood-fill maps on-robot meant we could debug in the 5-minute prep window without opening a laptop.

> 🎬 Competition full run video is on YouTube: https://www.youtube.com/watch?v=2M4ZANPrZ4s

> ⭐️ Repo / Schematics / Firmware: https://github.com/enkhbold470/neuromouse26

Happy to answer any questions about the sensor tuning, flood-fill implementation, or motor control!

▲ 58 r/ChatGPTArduino+3 crossposts

ESPHome MCP server for managing ESPHome devices directly

I tried using a couple of existing ESPHome MCP add-ons recently, but ran into some startup errors with them. Instead of running extra container infrastructure, I created a direct Python MCP server that interfaces right with ESPHome and works seamlessly with AI coding tools like Claude Code, Antigravity, and Cursor.

The nice part about this setup is that it does not require installing any extra Home Assistant add-ons. It just connects over your local network to the ESPHome dashboard you already have running.

Once connected, it lets your AI assistant:

  • List your devices and see what is online
  • Read and edit your device YAML files
  • Check configs for errors
  • Send Over-The-Air (OTA) updates over Wi-Fi

A few examples of things you can ask it in chat:

  • "Check which of my ESPHome devices are currently online"
  • "Show me the YAML file for esp32-shelf.yaml"
  • "Update esp32-shelf.yaml so pressing the door button flashes my LED lights for half a second as feedback, check for syntax errors, and push the OTA update over Wi-Fi"

The project is completely open source (MIT license). If you'd like to try it out, open issues, or suggest features, check out the GitHub repo: https://github.com/saihgupr/esphome-mcp

u/DiggingForDinos — 1 day ago
▲ 13 r/ChatGPTArduino+1 crossposts

Problems with my new esp32c3

So I bought an Esp32C3 Super Mini from Allegro (the Polish equivalent of Amazon) for my new project and soldered the board to the goldpins. Immediately after connecting the board to my computer, unexpected problems began. For some unknown reason, the Arduino IDE claimed I had connected an Ozoobot kit, and every second I heard the sound of a device connecting. The sound calmed down after pressing the boot button and uploading some blank code. Unfortunately, the Arduino IDE still insisted it was the Ozobot kit, leaving me with no other options. I don't know what I did exactly, but I managed to select the correct board. The problems so far aren't the ones that prompted this post. I'm mentioning them because I don't know if they're related. Now the real headache begins. I tried to connect to Wi-Fi, but for some reason the board wouldn't connect. I downgraded the Esp32 firmware to a lower version, like 3.2. Nothing helped. I ran countless mindless tests with the gpt chat without any components connected, uploading a lot of his code to my board and following his advice. He told me it was most likely a faulty board or something wrong with the software. In any case, he couldn't get my board to connect to my Wi-Fi. I'd also previously connected my ESP32S3 to Wi-Fi without any problems. For some reason, the ESP32S3's MAC address was always zero-based in tests. The board detects nearby Wi-Fi networks without any problems. Tests show that the receiver works, but the transmitter doesn't work. Personally, I think it's a faulty board. I'm sending photos because I'm a bit of a soldering amateur and I'm not sure if I've just desoldered the antenna. Here's my latest test connecting to a Wi-Fi network without any security features. Even this is beyond my board's capabilities: Testing code for connecting esp32c3 super mini to wifi network without any security.

PS: sorry for the text in Polish instead of English. I'm too lazy for that.

#include <WiFi.h>

const char* ssid = "TESTESP";

const char* password = "";

void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) {

Serial.print("[EVENT] ");

switch (event) {

case ARDUINO_EVENT_WIFI_STA_START:

Serial.println("STA START");

break;

case ARDUINO_EVENT_WIFI_STA_CONNECTED:

Serial.println("POŁĄCZONO Z AP");

break;

case ARDUINO_EVENT_WIFI_STA_GOT_IP:

Serial.println("DOSTANO IP");

Serial.print("IP: ");

Serial.println(WiFi.localIP());

break;

case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:

Serial.print("ROZŁĄCZONO! reason = ");

Serial.println(info.wifi_sta_disconnected.reason);

Serial.print("reason name = ");

Serial.println(WiFi.disconnectReasonName(

(wifi_err_reason_t)info.wifi_sta_disconnected.reason

));

break;

default:

Serial.print("inne zdarzenie: ");

Serial.println((int)event);

break;

}

}

void setup() {

Serial.begin(115200);

delay(1000);

Serial.println();

Serial.println("========== WIFI DIAGNOSTYKA ==========");

WiFi.onEvent(WiFiEvent);

WiFi.mode(WIFI_STA);

Serial.print("MAC: ");

Serial.println(WiFi.macAddress());

Serial.println();

Serial.print("Łączenie z: ");

Serial.println(ssid);

WiFi.begin(ssid, password);

for (int i = 0; i < 30; i++) {

delay(1000);

Serial.print(i + 1);

Serial.print("s | status=");

Serial.print(WiFi.status());

Serial.print(" | RSSI=");

Serial.println(WiFi.RSSI());

if (WiFi.status() == WL_CONNECTED) {

Serial.println();

Serial.println("***** SUKCES *****");

Serial.print("IP: ");

Serial.println(WiFi.localIP());

break;

}

}

}

void loop() {

}

Output test results:

========== WIFI DIAGNOSTYKA ==========

[EVENT] inne zdarzenie: 101

[EVENT] STA START

MAC: 9C:CC:01:67:A1:F0

Łączenie z: TESTESP

1s | status=6 | RSSI=0

2s | status=6 | RSSI=-71

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

3s | status=6 | RSSI=0

4s | status=6 | RSSI=-70

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

5s | status=6 | RSSI=0

6s | status=6 | RSSI=-67

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

7s | status=6 | RSSI=0

8s | status=6 | RSSI=-70

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

9s | status=6 | RSSI=0

10s | status=6 | RSSI=-68

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

11s | status=6 | RSSI=0

12s | status=6 | RSSI=-69

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

13s | status=6 | RSSI=0

14s | status=6 | RSSI=-69

15s | status=6 | RSSI=-69

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

16s | status=6 | RSSI=0

17s | status=6 | RSSI=-71

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

18s | status=6 | RSSI=0

19s | status=6 | RSSI=-70

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

20s | status=6 | RSSI=0

21s | status=6 | RSSI=-70

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

22s | status=6 | RSSI=0

23s | status=6 | RSSI=-70

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

24s | status=6 | RSSI=0

25s | status=6 | RSSI=-70

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

26s | status=6 | RSSI=0

27s | status=6 | RSSI=-70

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

28s | status=6 | RSSI=0

29s | status=6 | RSSI=0

30s | status=6 | RSSI=-70

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] inne zdarzenie: 117

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 201

reason name = NO_AP_FOUND

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 4

reason name = ASSOC_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 4

reason name = ASSOC_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] ROZŁĄCZONO! reason = 2

reason name = AUTH_EXPIRE

[EVENT] POŁĄCZONO Z AP

[EVENT] inne zdarzenie: 117

[EVENT] ROZŁĄCZONO! reason = 8

reason name = ASSOC_LEAVE

[EVENT] inne zdarzenie: 117

Please help me with this, as I have a 2-year warranty on this board and I'm not sure if I should just use it to get a replacement. Please share your thoughts in the comments.

u/TomorrowOrnery520 — 1 day ago
▲ 33 r/ChatGPTArduino+1 crossposts

AI Pocket Buddy - Waveshare ESP32-S3 Touch LCD 1.46

A self-contained, wearable AI voice companion on an ESP32-S3. Tap the round screen, speak, and it answers back out loud while a reactive face blinks and talks. It calls cloud AI APIs directly over WiFi. No phone app, no server, no Raspberry Pi. The device is the whole product.

reacts to each state (ready, listening, thinking, speaking) and a line of status text.

One specific board, no wiring required. Everything is onboard.

Waveshare ESP32-S3-Touch-LCD-1.46

https://github.com/minkgx1/pocket-buddy

▲ 1 r/ChatGPTArduino+1 crossposts

Beginners experience with Arduino + AI

The post is for people willing to learn and to read about real experience. Not for haters who "I didn't read but I disagree, because 'AI' in the title triggered a toddler me" and not for scared gatekeepers. Read it if you're really interested in learning. And feel free to ask questions. Please just don't read it if you're interested in "teaching".

I consider myself a beginner. I had no idea how Arduino works a year ago. I have a lot of programming experience, but mostly with languages like VBA, nothing firmware-related. I learned some problem-solving decades ago trying to simplify a program so it fit 105 bytes (!) of memory.

For me, AI is really helpful. It's not yet ready for 100% vibe coding. It can be dangerous if you're building a professional product without understanding what AI is doing. It probably can explode your DIY Li-Ion battery pack. It won't help you learn if you don't learn how to ask good questions and how to learn. It helps me with a hobby. I learn and I build a toy for my kids.

Without AI, I would need months to do what I can do in a day with AI. My code is complex for a beginner, almost 3,000 code rows total*, excluding blank lines and comment-only lines. Without AI, this project will take years or be much simpler or abandoned because I did not have the time. This is today's reality. AI does programming, and it does it really well.

I work mostly in the terminal with Copilot CLI and Arduino CLI. I keep VS Code open just to review the code and make some small changes. I don't use Arduino IDE anymore. Any bigger update is made by AI.

Many people still use AI chats to ask programming questions. Agentic programming in a terminal is a different experience where AI really shows its capabilities. Try it. A black terminal looks scary, but it's easy to use when the initial frustration goes away.

What I do (learn to do) by myself:

  • learn to read datasheets
  • draw a circuit in EasyEDA (I still use AI to learn about electronic components and to answer "why" questions, but I don't accept AI answers as a truth that won't burn my circuit)
  • design 3D models that will fit all the electronics I want to use
  • plan what my toy train does, how it reacts to user actions (IR remote), how it processes sensor data, how it calibrates sensors, what it outputs to the serial port for debugging, how it uses fragile EEPROM, how many comments AI adds to the code etc.
  • trying to understand why I need a 4.7uF capacitor in one place and 0.1uF in another place, etc.

* There are a few reasons why my code is long:

  1. a lot of electronic components (motor, LEDs buzzer, tilt sensor, laser distance sensor, RGB color sensor, voltage meter, IR receiver) and features I want to implement (for user = my kids' experience and for my learning)
  2. a lot of debugging output to the serial port, which can be disabled by preprocessor directives; for debugging and learning
  3. a lot of memory optimization to fit everything into 32K; some libraries are being replaced with code that requires less memory - not a beginner's task (without AI)
  4. I need it to learn
  5. AI writes code fast
reddit.com
u/AVatorL — 1 day ago
▲ 9 r/ChatGPTArduino+1 crossposts

Built a fully wireless, standalone dual-display K8s metric monitor using ESP32-C3 & Rust

Hey everyone,
I had some spare parts lying around and decided to build a standalone dual-gauge metric monitor for my personal Kubernetes cluster (specifically tracking CPU and memory on my two worker nodes).

the MetricGauge

Unlike my previous display setups that required an intermediary server to scrape and push frames, this device is completely standalone: the ESP32-C3 scrapes Prometheus endpoints directly over Wi-Fi and renders the UI itself.

The Build Overview

  • MCU: ESP32-C3 Super Mini
  • Displays: Dual GC9A01 240x240 circular LCDs
  • PCB & Enclosure: Designed the custom PCB in KiCad and coded the parametric case in OpenSCAD.
  • Firmware: Written in Rust using AI coding agents (Zed + Cursor)
  • Power: Upgraded to an internal Li-ion battery + charging module for a completely wire-free desk setup.

The Fun Challenges (Troubleshooting)

  1. Font Porting: Initially prototyped the UI on macOS with TTF fonts, which the AI agent quickly helped convert to lightweight bitmap fonts for the ESP32 environment.
  2. SRAM Constraints & AI Over-Optimization: The ESP32-C3 has 400KB of SRAM. Between HTTPS overhead for Prometheus scraping and display buffers (taking ~120KB), the AI agent panicked and "over-optimized" by quartering the buffer and drawing in 4 passes, which caused terrible screen flickering. Since the MCU isn't running heavy background tasks, I dialed it back to render one full display buffer at a time, completely fixing the flicker.
  3. Case Iteration & Wireless Mod: My initial 3D print sizing was slightly off, allowing only the front panel to fit. Seeing the extra space needed, I iterated the design to pack a Li-ion cell, a charge/discharge protection board, and a power switch inside, turning it into a truly wireless desktop gauge.

Everything is open source. If you're interested in the code, KiCad schematics, or 3D models, feel free to check out the repo below:

Let me know what you think or if you have any questions about the Rust on ESP32 setup!

reddit.com
▲ 2 r/ChatGPTArduino+1 crossposts

DIY Ereader project

I love the XTEink devices, but I want to make my own little 4 inch E reader device. I have purchased the Waveshare ESP32-S3 dev board. Was wondering if anyone else has looked at these yet, or know of a firmware I could use on it before I start vibe coding my own

reddit.com
u/devofreck — 1 day ago
▲ 12 r/ChatGPTArduino+1 crossposts

Review Request: ESP32-S3 Devkit Sled PCB for Filament Dryer Control

Hello,

I'd love a second set of eyes on this board before I order. This is a simple sled PCB that replaces the DC control board in a Sovol SH03 filament dryer and routes its IO ribbon cable pins to GPIO pins on an esp32-s3-devkit-c1 running ESPHome that controls the dryer and exposes sensor data.

I currently have a very similar setup on an electrocookie proto board with the ends of the stock wiring and an esp32 devkit soldered in, which is what I normally do, but for this project there are many fine connections to make that are weak and break easily, and designing a PCB that has receptacles for the 14 and 15 pin JST GH-clone ribbon cables coming from the upstream driver board seemed to me to be the most reliable and safe way to avoid having to resolder every time I open it up. When I say "similar", I mean specifically that I relocated some of the pins to make routing easier in KiCAD. There is also a JST XH connector that provides 5V/GND/UART to a second ESP32-S3-based touchscreen. UART is currently unused as both devices are are independent but I wanted to have a direct connection available in the future. At full brightness, I observed the display esp32 drawing ~260mA-~300mA in normal operation and a max of 418mA on boot, which I believe should be enough headroom on the 5V lead to operate the controller and the screen off of the upstream 5V rail, but this is something I would like to get feedback on. From what I can see the budget is about 1A continuous.

This is my first PCB project and first time using KiCAD, and I did use AI assistance to help me work through the program. I want to be up-front about that. These are the reasons I am requesting a sanity check.

Inputs:

TH1 chamber thermistor to GPIO2 (ADC1_CH1) + 33k pullup resistor to 3v3

TH2 chamber thermistor to GPIO1 (ADC1_CH0) + 33k pullup resistor to 3v3

Vent A hall position sensor (analog) to GPIO4 (ADC1_CH3)

Vent B hall position sensor (analog) to GPIO10 (ADC1_CH9)

Vent C hall position sensor (analog) to GPIO7 (ADC1_CH6)

Vent D hall position sensor (analog) to GPIO6 (ADC1_CH5)

Fan 1 tach to GPIO47

Fan 2 tach to GPIO48

Fan 3 tach to GPIO38 (this fan was on the original control board but doesn't actually seem to exist within the device itself, I left it connected but undriven in software in case I missed something in my teardown. )

Display UART RX to GPIO39

Outputs:

GPIO12 to heater 1 PWM + 10k pulldown resistor to gnd

GPIO11 to heater 2 PWM + 10k pulldown resistor to gnd

GPIO13 to fan 1 PWM

GPIO14 to fan 2 PWM

GPIO21 to fan 3 PWM (spare)

GPIO41 / GPIO40 to vent A motor drive pair (OEM H-bridge)

GPIO3 / GPIO18 to vent B motor drive pair (OEM H-bridge)

GPIO15 / GPIO17 to vent C motor drive pair (OEM H-bridge)

GPIO5 / GPIO42 to vent D motor drive pair (OEM H-bridge)

GPIO16 to display UART TX

Bidirectional:

GPIO8 / GPIO9: I2C SDA/SCL to humidity sensors

Images attached. The 3d view of the bottom of the PCB is missing the 15-pin GH port but the 14-pin + the SMD resistors and 5v rail caps are all there. Any feedback would be appreciated!

u/flash_speed3412 — 1 day ago
▲ 2 r/ChatGPTArduino+1 crossposts

I built an e-paper dashboard to keep my AI coding quotas on my desk — need help testing it!

Got tired of opening yet another tab just to check my Codex / Claude / Zhipu quota, and I had a Seeed reTerminal E1003 sitting around doing nothing. So… now I have a tiny e-paper "quota cockpit" on my desk, and I genuinely can't go back

What it does: shows two providers side by side — rolling 5h session quota, 7-day weekly quota, used %, remaining %, reset countdown. Optional local Python service can also read your CLI logs and show today's tokens + top models.

Stack: ESP32-S3, PlatformIO, HTTPS + OAuth refresh, NVS persistence. Builds for E1001 / E1002 / E1003 + a Simplified Chinese E1003. Refreshes every 5 min, falls back to last good snapshot on failure.

Honest bit: the repo lists adapters for Codex, Claude, Zhipu, Copilot, MiniMax, and Kimi — but I've only actually tested Codex and Zhipu on my own device. If you've got a reTerminal (or any ESP32-S3 + e-paper) and use the others, please flash it and tell me what breaks! Issues / PRs very welcome 🙏

Huge thanks to [tddworks/ClaudeBar](https://github.com/tddworks/ClaudeBar) — a lot of the API understanding came from reading their code.

Repo 👉 https://github.com/limengdu/ePaper_vibe_coding_ai_usage_track

Would love feedback from anyone into e-paper, ESP32-S3, or just tired of clicking through 4 dashboards a day. Cheers!

https://preview.redd.it/fwwucywrcz4h1.jpg?width=4080&format=pjpg&auto=webp&s=f8ae7f2ee862f4a19141f93626496e2abc46d01a

reddit.com
u/MengDuLi — 1 day ago
▲ 9 r/ChatGPTArduino+1 crossposts

ESP32 CYB + Raspberry pi

Set up a raspberry pi3b with home assistant, Claude and Codex token status tracker, hooked up wifi light all within a old Ikea organizer box

u/Speed_Crawler — 1 day ago
▲ 3 r/ChatGPTArduino+1 crossposts

Built a browser-based Arduino/ESP32 workbench after it placed at a national science fair — now trying to make it something other people actually use

Hey r/SideProject,

Backstory: I'm a high school student in Kenya. FUNDI started as my project for the Kenya Science and Engineering Fair — won Regional Merit, went on to Nationals, and did considerably well there. That validation is basically what convinced me to keep building it into something real instead of letting it die as a school project.

What it is now: a workbench that puts a visual circuit canvas, a multi-file code editor, and an AI assistant in one place for Arduino/ESP32 development. You can describe what you want to build ("blink an LED," "read a temperature sensor") and it generates the wiring and code together. The backend actually compiles your code with Arduino CLI and simulates it with AVR8js — it's not a mockup.

Where it's at:

  • Live demo (https://jamesdesign.me/F.U.N.D.I./) — this is UI-only right now, no backend, so you can explore the design/interaction but nothing actually compiles or runs there yet.
  • The real thing (https://github.com/jamesthegreati/F.U.N.D.I./) works end-to-end when you run the frontend and backend directly — that path is fully tested. There's also a Docker Compose option in progress that isn't fully reliable yet.

Solo build, MIT licensed, definitely has rough edges. What I want most right now is feedback — does the concept make sense, is the UI confusing, would you actually use something like this over Wokwi/Tinkercad if the backend were solid?

One caveat: I'm about to disappear into exam prep and won't be able to respond quickly until around Nov 22. I'll still read every comment, so don't hold back — I'll just be slow to reply for a bit.

reddit.com
u/No_Tone_8226 — 1 day ago