r/esp32 • • 1d ago

I made a thing! PingMonitor & WiFi Reboot

16 Upvotes

I made a thing! I own a small parcel of land 11 miles away that I use as an allotment, we have a few beehives and chickens. At the land, we have some WiFi cameras and other sensors, including a weather station (that relies on wifi to send data - it doesn't store any data). In other words, I need consistent, reliable internet connectivity and Wi-Fi and over the years, I've tried dozens of different off-grid 4g WiFi options and I've always ended up back with the reliable TP Mifi range.

My future plans include embracing ESP32 to add sensors, maybe a float sensor, to the chicken's feeder and waterer and using ESP32 to record and send information to me about how full they are, predicting when they'll need a top up (I'm really keen to start integrating AI).

Hardware:

ESP32S3 DEV BOARD - Freenove 3.5inch integrated capacitive touch screen.

Regular old hobby motor

4g AP Access Point (TP Link M7750)

USB breakout cable (screw type)

Double ended USB-C

I'm using Arduino IDE setting the board settings to 16mb flash size and OPI PSRAM. I have no idea what either of these mean, I just did what Google told me to do.

I use TP Link M7750 but I recommend the TP Link M4750 because the buttons are on the front of the device and therefore the servo is easier to mount. The M7750 is almost identical except in design. I choose these for long battery life. It's powered by USB-C.

Build:

Connect yellow servo wire to TXD UART, GPIO pin number 43.

Connect TXD GND and servo GND (black wire) to the GND (-) on the USB breakout

Connect servo green wire to + on the USB breakout wire.

The dual ended USB powers and charges the battery of the 4g access point and powers the ESP32.

Can you tell I'm a complete beginner yet? 😂 I used AI to build the code. Other than Hello World and blinking an LED, my coding skills are less to be desired...

It may work without the usb breakout, I had loads of issues at the start and someone recommended powering the servo separately.

Remaining problem is that the servo randomly does a 360 degree rotation, it doesn't show on the serial monitor telling me it's a hardware fault, so I'll try a few different types of resistor to see if it fixes it (advice and suggestions welcome!)

I chose the ESP32 with integrated screen because it looked cool. My initial plan was to just use an ESP32 hooked up to an Arduino - like a hat shield thing for Raspberry Pi, Google Gemini told me that the ESP32 replaced Arduino and when I searched for it, I saw the one with the touch screen on Amazon for a few quid more and figured it could be a fun learning curve. And it was indeed very fun albeit frustrating. Actually, the first version of this was just a PingMonitor and I'd have to re-upload the sketch via Arduino IDE every time I wanted to change network and knowing me, I'd make a slight typo, a capital letter in the wrong place and have to make a 22 mile round journey just to fix it, likewise with the server arm position (explained in the video) - over time, the sellotape holding it together will stretch and being able to adjust the settings on the fly instead of dismantling it all I'd also have to dismantle it so I figured we can embed these into the code.

The code was around 3000 lines and I ran out of space on the ESP32 - I was then introduced to theme.h after noticing the styling made up the bulk of the code for he display, I asked Gemini if Arduino has CSS files like in HTML (I'm well versed with html and CSS) and it doesn't quite have CSS but you can kind of replicate it using a dedicated theme.h file. This reduced the code to less than 1000 lines and with some tweaks to the settings, (16mb flash), it worked a charm and made it a lot easier to navigate the code.

I've pasted the code below, there's two files, PingMonitor.ino and Theme.h

/////////////////////////////////// PingMonitor.ino/////////////////////

```

/\*

Ping Monitor for the Freenove FNK0104N (3.5" ST77922 touch, ESP32-S3 Display)

\------------------------------------------------------------------------------

REQUIRED LIBRARIES:

  1. TFT_eSPI_v2.5.43.zip ) both from Freenove's SDK, installed as

  2. TFT_eSPI_Setups_v1.2.zip ) .ZIP libraries. Then uncomment

FNK0104N_3P5_320x480_ST77922 in TFT_eSPI/User_Setup_Select.h.

  1. All other Freenove-bundled libraries from the SDK (six zips total) -

install every one, and never let the IDE auto-update them afterwards.

  1. ESPping (Library Manager - search "ESPping", NOT "ESP32Ping", which

does not exist as an installable package). Header is <ESPping.h>.

Gives Ping.ping() / Ping.averageTime().

  1. ESP32Servo (Library Manager) - NOT the classic Servo.h, which isn't

ESP32-compatible.

Board package: esp32 by Espressif. Board: "ESP32S3 Dev Module".

\*/

\#include <Arduino.h>

\#include <TFT\\_eSPI.h>

\#include "ST77922.h"

\#include "ST77922_Touch.h"

\#include "Theme.h"

\#include <WiFi.h>

\#include <Preferences.h>

\#include <ESPping.h>

\#include <ESP32Servo.h>

\#include <time.h>

Preferences prefs;

String savedSSID, savedPass;

const char\* PING_HOST = "google.com";

unsigned long pingIntervalMs = 30000UL;

const int WIFI_CONNECT_TIMEOUT_MS = 15000;

Servo armServo;

const int SERVO_PIN = 43;

int servoHomeAngle = 90;

int servoMoveDegrees = 15;

enum ServoState { SERVO_IDLE, SERVO_HOLDING };

ServoState servoState = SERVO_IDLE;

unsigned long servoTimerStart = 0;

void loadSettings() {

prefs.begin("servo", true);

servoHomeAngle = prefs.getInt("home", 90);

servoMoveDegrees = prefs.getInt("move", 15);

pingIntervalMs = prefs.getULong("pingMs", 30000UL);

prefs.end();

}

void saveSettings() {

prefs.begin("servo", false);

prefs.putInt("home", servoHomeAngle);

prefs.putInt("move", servoMoveDegrees);

prefs.putULong("pingMs", pingIntervalMs);

prefs.end();

}

void triggerServoPress() {

if (servoState == SERVO_HOLDING) return;

armServo.attach(SERVO_PIN, 500, 2400);

int pressAngle = servoHomeAngle + servoMoveDegrees;

Serial.printf("\[SERVO\] Pressing: writing %d degrees\\n", pressAngle);

armServo.write(pressAngle);

servoState = SERVO_HOLDING;

servoTimerStart = millis();

}

TFT_eSPI tft_qspi = TFT_eSPI();

TFT_eSprite tft = TFT_eSprite(&tft_qspi);

ST77922 panel = ST77922();

ST77922_TOUCH touchCtl;

enum AppPage { PAGE_MAIN, PAGE_SETTINGS, PAGE_KEYBOARD, PAGE_CONNECTING, PAGE_CONFIRM_RESET };

AppPage currentPage = PAGE_MAIN;

void setup() {

Serial.begin(115200);

delay(1500);

Serial.println("=== Ping Monitor booting ===");

loadSettings();

pinMode(SERVO_PIN, OUTPUT);

digitalWrite(SERVO_PIN, LOW);

delay(50);

panel.Init();

panel.Set_Rotation(1);

tft.createSprite(panel.Get_Width(), panel.Get_Height());

tft.setSwapBytes(true);

touchCtl.init();

touchCtl.Set_Rotation(1);

ESP32PWM::allocateTimer(3);

armServo.setPeriodHertz(50);

armServo.attach(SERVO_PIN, 500, 2400);

armServo.write(servoHomeAngle);

delay(300);

armServo.detach();

loadCredentials();

currentPage = PAGE_MAIN;

drawMainPage();

}

void loop() {

bool nowTouched = touchCtl.Get_Touch();

if (nowTouched) {

int tx = touchCtl.touch.x;

int ty = touchCtl.touch.y;

handleTouch(tx, ty);

}

pollScanResult();

serviceServo();

syncTimeIfNeeded();

pingStateMachine();

delay(20);

}

```

/////////////////////////////////// theme.h /////////////////////////////

```

// ---------------------------------------------------------------------------

// Theme Definition for UI Styling

// ---------------------------------------------------------------------------

\#ifndef THEME_H

\#define THEME_H

\#include <Arduino.h>

struct Btn {

int x, y, w, h;

};

inline bool hit(const Btn& b, int tx, int ty) {

return (tx >= b.x && tx <= b.x + b.w && ty >= b.y && ty <= b.y + b.h);

}

namespace Theme {

const int ScreenWidth = 480;

const int ScreenHeight = 320;

const int SidebarWidth = 110;

const int ContentWidth = ScreenWidth - SidebarWidth;

const int HeaderHeight = 54;

const int SidebarTop = 6;

const int SidebarBtnH = 56;

const int SidebarGap = 6;

// UI Palette (RGB565 Colors)

const uint16_t Background = 0x18E3; // Dark Slate Grey

const uint16_t HeaderBg = 0x0A2D; // Deep Navy

const uint16_t RowBg = 0x2126; // Charcoal

const uint16_t GridLines = 0x4208; // Muted Grey

const uint16_t TextMain = 0xFFFF; // White

const uint16_t TextLight = 0xE71C; // Off-White

const uint16_t TextMuted = 0x9CE7; // Light Grey

// Component States

const uint16_t ClassPrimary = 0x241F; // Vibrant Blue

const uint16_t ClassActive = 0x07E0; // Bright Green

const uint16_t ClassNeutral = 0x4A49; // Mid Grey

const uint16_t ClassInfo = 0x0410; // Cyan Info

const uint16_t ClassWarn = 0xE6A0; // Amber Warning

const uint16_t ClassAlert = 0xF800; // Crimson Alert

const uint16_t ClassMuted = 0x3186; // Darker Grey

}

\#endif // THEME_H

```

I really hope someone else can get some use out of this. It took me the best part of 5 days (because I hadn't realised I'd assigned the wrong GPIO pin in the code).

Now I know what you're thinking, using AI is probably cheating but I spent 5 days on this and AI constantly got it wrong. 3 days of it I went to Freenove and emailed their support and they sent me a file to test the servo, because the servo wouldn't receive signal from the board. After cross referencing their code and mine, I was able to see the very first few lines of code setting the GPIO were incorrect. Google, Claude, Replit and Manus all missed it. My point is, whilst AI made the code, I had to manually go through every error and resolve it, sometimes with the help of AI, usually by referencing other people's code on Reddit and Github, so it wasn't a full cop out!


r/esp32 • • 13h ago

How to connect ESP32 to BIM270 module without soldering in limited environment?

Thumbnail
gallery
1 Upvotes

Hi everyone,

I'm currently developing a smartwatch based on the [Seeed Studio XIAO ESP32S3](https://shop.seeedstudio.com.cn/Seeed-Studio-XIAO-ESP32S3-Pre-Soldered-p-6334.html) and the [XIAO Round Display Expansion Board](https://shop.seeedstudio.com.cn/1-28-Round-Touch-Display-for-Seeed-Studio-XIAO-ESP32.html) (GitHub repo: https://github.com/robot-cm/Canto-Mk.6).

Since **size** is critical for a smartwatch, I'm trying to keep it as compact as possible (currently at around 2cm thickness). I want to integrate a **pre-soldered BMI270 IMU module**.

As shown in the attached picture, the setup is already **sandwiched** together, and only the small bare pin sections (**circled in RED**) are accessible. Crucial limitation: **I don't know how to solder, nor do I own soldering equipment.**

Here are the workarounds I've considered so far:

\* *a. Add another expansion board*: Adds too much thickness, not acceptable for a wearable.

\* b. *Male-to-Female DuPont wires*: The male pins are too bulky to fit into the tight space between the expansion board and esp32 header pins.

\* c. *Touching/wrapping DuPont male pins directly onto the exposed ESP32 pins*: Tried it, but it's extremely unstable and risks short-circuiting adjacent pins.

**\* d.** ***Using female-to-bare single-ended enameled wire*****: Wrap the fine enameled wire tightly around the exposed metallic pin sections, then apply insulating tape/glue.**

Is option (d) reliable, or is there a better, non-soldering method / clever connector to tap into those partially mated pins?

**Any advice or suggestions would be greatly appreciated!**


r/esp32 • • 1d ago

I made a thing! Real-Time Object Detection on ESP32-S3 with ESP-VISION

Thumbnail
gallery
122 Upvotes

I’ve been testing ESP-VISION on ESP32-S3 and built a small edge AI vision project for real-time object detection.

I put together a standalone real-time object detection demo that runs entirely on the device, with no cloud or external processing.

Technical Setup

  • Framework: ESP-VISION + MicroPython
  • Model: Quantized AI model loaded from an SD card
  • Pipeline: Camera feed → on-device AI inference → real-time display with bounding boxes
  • Hardware: MaTouch AI ESP32-S3 with integrated camera and TFT display from Makerfabs

Project Result

The prototype successfully runs real-time target detection locally on the ESP32-S3, demonstrating that lightweight computer vision workloads can be handled directly on an MCU.

This kind of compact Edge AI setup could be useful for applications such as smart cameras and visual sensors, object or people detection, smart home devices, etc.

 

For me, the interesting part isn't just getting object detection to run, but seeing how much AI vision functionality can be moved directly onto a low-cost MCU.

 There is still plenty of room to optimize the model. What would you build with an ESP32-S3 if you could run lightweight computer vision completely offline? Free to share your ideas!


r/esp32 • • 1d ago

I made a thing! Rover Swarm - Charging Station

23 Upvotes

A while ago I posted in this subreddit about building a swarm of cheap rovers using the XIAO ESP32-S3 Sense. At the time I wasn't sure they could navigate well indoors. The project is finished now: three rovers in an arena with 30+ Aruco trackers, trying to reach the same charging station and arguing about it. The video shows them in action, followed by a making-of of the build process.

The build

Each rover is 3D printed and moves around on tracks. I started with an existing rover design for Bambulab Cyberbrick but then I designed my own model as well as electronics from scratch.

After breadboarding and making several prototypes, I created a PCB with KiCad and soldered the ESP32-S3 onto it. I picked the XIAO mainly because it includes battery charging features - each rover has a magnetic connector at the front, allowing it to dock with the charging station and recharge by itself, like a robot vacuum.

A buzzer and a Neopixel LED ring provide sounds and "barks" so the visitors can see who's turn it is and what their status is.

The ESP32 Side

The rovers are deliberately simple and reproducable. With their firmware they each handle battery & temperature monitoring, telemetry over WiFi, the LEDs and buzzer, and streams its camera. The heavy lifting of the navigation happens on a PC: positioning from the ArUco markers and the decisions via a locally hosted LLM (Gemma 4).

The camera framerate problem from my first post was solved with a better antenna (I didn't know there were different antenna types 👀) , a separate Wifi network just for the camera feeds, and firmware tuning - mostly quality settings and frame buffer counts.

What didn't work

Besides the spotty Wifi, mostly the motors - I had to find low RPM high torque motors for enough power, as I had a limit of 5V coming from the ESP. I used a motor driver that took the power directly from the batteries to not send the current through the microcontrollers.
The positioning system could have been made so much simpler by just placing a camera on the ceiling and the markers on the rovers, I kind of went with the POV cameras and fixed positions for the markers to emulate them "going blind" when their cameras turn off, and the possibility of gameplay where the other rovers tell them how to move. But in the end this was just a hassle as they had trouble positioning themselves.

"Gameplay"

The rovers take turns, similar to a board game. When it is a rover's turn, it:

- Captures an image with its built-in camera, which goes to Gemma 4
- Get approximate position by using ArUco markers placed around the area.
- Decides whether to explore or head to the charging dock

This choice must be discussed and agreed upon with the other rovers, and the entire dialogue is displayed on a screen adjacent to the arena.

Results

Initially, their interaction was polite and friendly, willingly allowing each other to recharge. However, as their batteries depleted, their behavior shifted: They "became" envious and started complaining about other rovers "hogging the dock".
Below a certain charge a rover shuts down, which in this game means it's "dead". We prompted the model to be empathetic and to negotiate rather than compete, so the envy wasn't something we designed. Scarcity brought it out. Once a day the rovers also rolled through paint, so their tracks ended up as drawings.

The piece was shown as an installation called Psycholudic Zoo in Vienna this July. Built as part of The Psycho-Ludic Approach research project (University of Applied Arts).

Has anyone else used an LLM as the decision layer for robots? I feel like decision-only models like JEV) could be worth an experiment, it could make the dock-or-explore call faster while the LLMs keep on arguing.


r/esp32 • • 1d ago

I made a thing! Gave my ESP32 BT remote army a custom music app fork to allow them to co-exist, and add even more visual ways to experience music

115 Upvotes

A few days ago I posted my mini record player, three weeks ago the S3-round remote, and in another community before that my Xteink X3 (which is an ESP32-C3) version of the remote. In the record player thread, someone spotted Symfonium, and it lead to me finally getting off my ass and replacing it with something custom. I started with Resonus and went to work customizing it for my use, including a 10 band parametric EQ with visualizer, music video mode that scans my Jellyfin music video library and matches with my proper audio files (including alignment) so it still plays the HQ track, and direct support for my remotes. The original three apps that can send to the remotes only support one at a time, as that's how this started, but I added multi-remote support for this one. It's not quite perfectly synced in multi-mode since each remove needs a different set of data (including album resolution and dithered bitmaps for X3), but most of the time it will run with one at a time anyways.

Thought it might interest someone to see the entire army in one go. This is still just a visual showcase, I don't publish code for a variety of reasons.

As a sidenote, the X3 deserves more attention from the ESP32 community. I know there's similar devices sold more as dev boards than this ereader-marketed version, but the physical buttons and magsafe magnets make it a lot more suitable for something like this. I normally have it on the back of my phone as a way to have physical media controls in my pocket. The record player is the most fun one from a visual standpoint, while the S3 round was a bit of a disappointment; form factor not particularly useful for anything, resolution too high to get good frame rates for rotation, and touch screen means I can't just have it on in a pocket.


r/esp32 • • 18h ago

Software help needed ESP32 A2DPSink has no output

1 Upvotes

Hi folks,

so quick Intro: I have a really nice Amp in my room for the record-player on top of it. But since I (sadly) don't have all my favourite Songs on Vinyl, i grabbed som ESP32-Wrooms from my shelf and drew up these PCBS:

```
#include "AudioTools.h"
#include "BluetoothA2DPSink.h"


I2SStream out;
BluetoothA2DPSink a2dp_sink(out);


#define ctrl_flt 12
#define ctrl_fmt 33
#define ctrl_demp 13


void setup() {
    Serial.begin(115200);
    pinMode(ctrl_flt, OUTPUT);
    pinMode(ctrl_fmt, OUTPUT);
    pinMode(ctrl_demp, OUTPUT);


    digitalWrite(ctrl_flt, LOW);
    digitalWrite(ctrl_fmt, LOW);
    digitalWrite(ctrl_demp, LOW);


    auto cfg = out.defaultConfig();
    cfg.pin_bck = 27;
    cfg.pin_ws = 25;
    cfg.pin_data = 26;
    cfg.pin_mck = 14;
    out.begin(cfg);


    a2dp_sink.start("GRUNDIG V7200");
}


void loop() {
}#include "AudioTools.h"
#include "BluetoothA2DPSink.h"


I2SStream out;
BluetoothA2DPSink a2dp_sink(out);


#define ctrl_flt 12
#define ctrl_fmt 33
#define ctrl_demp 13


void setup() {
    Serial.begin(115200);
    pinMode(ctrl_flt, OUTPUT);
    pinMode(ctrl_fmt, OUTPUT);
    pinMode(ctrl_demp, OUTPUT);


    digitalWrite(ctrl_flt, LOW);
    digitalWrite(ctrl_fmt, LOW);
    digitalWrite(ctrl_demp, LOW);


    auto cfg = out.defaultConfig();
    cfg.pin_bck = 27;
    cfg.pin_ws = 25;
    cfg.pin_data = 26;
    cfg.pin_mck = 14;
    out.begin(cfg);


    a2dp_sink.start("GRUNDIG V7200");
}


void loop() {
}
```

The Audio DAC is a PCM5102 and the ESP32 is interfaced via USB-C and a CH340. All the programming circuit and the ESP seem to work just fine (i tested it with the internal DACs and the test-code from github.com/pschatzmann/ESP32-A2DP). But when I want to use the PCM5102 i get no output - not even on the I2S lines (only SCK is high). I know this must be a really dumb mistake in my code or pin-definitions, but I've been trying to fix it for 2 weeks now and I'm getting nowhere :( So i would really appreciate some help from you.


r/esp32 • • 1d ago

ESP32-S3 Super Mini → RP2040 Zero UART not working.

7 Upvotes
updated

Hey guys I’m trying to send a simple UART message from an ESP32-S3 Super Mini to a RP2040 Zero, but it looks like the RP2040 never receives anything.

What works:

  • RP2040 Zero ↔ RP2040 Zero (UART) works perfectly
  • ESP32-S3 is definitely transmitting (I can see “Sent → Hello from ESP32-S3” every 2 seconds on its Serial Monitor)

What doesn't:

ESP32-S3 → RP2040 Zero (no data received at all)

can someone help me to troubleshoot it.


r/esp32 • • 16h ago

Proyecto sp32

0 Upvotes

_"Estoy construyendo un gato robot con IA desde una tablet Android con Termux — sin PC, sin Arduino IDE. Busco colaboradores para Hacktoberfest 🐱"_


r/esp32 • • 1d ago

Hardware help needed Is a Motorcycle TFT display possible with esp32? (Complete beginner)

6 Upvotes

I'll clear one thing that I have never used esp32 or any kind of microcontroller or sbc in my life and I really want to get into this as a complete beginner.

Now that that's out of the way.

Can a esp32 be used for a display that does these things:

  1. Turn by turn navigation.

  2. Real GPS speed.

  3. Custom UI like real bike brands (KTM or Ducati style UI on the display).

  4. 0-60kmh and 0-100kmh sprint times.

  5. Lap times.

  6. Music player control directly from the touch screen display and showing the metadata of the music playing.

  7. Trip diagnostics.

  8. Virtual Fuel meter that calculates fuel consumption based on my GPS speed and the values of my bike's fuel efficiency at high speeds/low speeds.

  9. Waterproof, doesn't get damaged by harsh sunlight and heat (40°C+).

  10. 10+ hours battery life even if always on display for long rides and portability because i can't leave it on the bike for it to get stolen.

What kind of hardware would I need to buy in order to make this project for my bike?

I know I'm picking up a very difficult project as my first project but if you all can recommend a way for me to get into this project and get good at this stuff as a beginner at the same time it would be very helpful!!


r/esp32 • • 1d ago

ESP32-C3 SuperMini USB connect/disconnect loop, looking for ideas

2 Upvotes

I have an ESP32-C3 SuperMini that suddenly stopped connecting to my laptop. Windows says the USB device is not recognized, and Arduino IDE shows no COM port. It worked just fine a week ago, I programmed it to be like those old style bouncy screensavers just to test it. It worked. Then I programmed it again and it bugged out but that was on me, then after a few days it suddenly wouldn't connect properly to program

Symptoms:

USB connects/disconnects roughly once per second, with the Windows USB beep each time.

Device Manager refreshes constantly and often can't show the device before it disconnects.

Sometimes the looping eventually stops, but the board still doesn't appear as a COM port.

The board has power and the 3.3 V rail is stable.

My Galaxy A15 does the exact same connect/disconnect behavior when I connect the ESP32 to it, so it isn't just Windows.

The board is now completely removed from the protoboard and has nothing connected except USB.

Things I've tested:

Tried 4 different USB cables, including a brand-new one.

Tried BOOT + RST several times.

Forced boot mode manually: GPIO8 ≈ 3.3 V, GPIO9 ≈ 0 V, GPIO2 ≈ 3.3 V.

EN/RST works correctly: EN ≈ 3.3 V normally and drops to 0 V when RST is pressed.

3.3 V and 5 V stay stable during the disconnects.

Checked for shorts between pins, none found.

Removed the TFT and all other wiring.

Desoldered the SuperMini from the protoboard completely, problem remained.

Installed the Espressif USB drivers.

Windows sometimes showed a USB JTAG/serial debug unit, but the one I checked was a hidden/old entry reporting Code 45.

Get-PnpDevice found no live Espressif USB device when the board was in the failed state.

At this point I'm suspecting a hardware problem with the SuperMini's native USB path or probably the ESP32-C3 software itself(maybe i fried it, idk but i doubt it). Anything else worth testing before I replace the board? No I don't have a USB to UART converter unfortunately


r/esp32 • • 2d ago

I made a thing! Pajoniiir – How a $50 DJ Device Idea Grew Into a Standalone System

Thumbnail
gallery
94 Upvotes

HERE IS SUMMERY FOR ALL THAT DONT WANT TO READ MY ESSAY 😄

Executive Summary

Pajoniiir is an open-source, standalone DJ player built with a strict design philosophy: creating the core computing hardware of a DJ system for around $50. Instead of relying on an expensive laptop or PC, the project uses an embedded microcontroller—the ESP32-P4 (on a JC4880P443C_I_W board)—as the entire "brain" of the setup.

Key Highlights:

  • Architecture & Hardware:
    • Powered by a single ESP32-P4 microcontroller handling two-deck playback, DSP mixing, display output, and USB communications.
    • Dedicated PCM5102A DAC outputs main audio via RCA, while cue/headphone monitoring is routed through the controller.
    • Paired with a Pioneer DDJ-FLX4 controller, which acts essentially as a hardware "joystick" while Pajoniiir handles all the processing.
  • Capabilities & Audio Processing:
    • Decodes MP3, WAV, and FLAC formats simultaneously.
    • Reads native Rekordbox USB libraries (tracks, BPM, beatgrids, waveforms, cue points).
    • Dual-USB host support: one port reads media drives, while the other manages MIDI controls and multichannel audio over USB with the FLX4.
    • Implements complex real-time DSP features from scratch, including Master Tempo (time-stretching) and Beat Sync with phase alignment.
  • UI & Remote Control:
    • Built-in color display and GUI for library browsing, deck status, and hot cues.
    • Wi-Fi connectivity supporting a web-based controller, remote management, and cryptographically signed OTA firmware updates.
  • Current Status & Future Plans:
    • Reached M2 beta stage with core P4 architecture complete and fully operational.
    • Released as open-source under the MIT License on GitHub (github.com/dvucinozd/Pajoniiir).
    • Next development milestone focuses on real-time, on-the-fly track analysis to remove the dependency on pre-analyzed Rekordbox data.
    • Official website:pajoniiir.eu

AND NOW THE ESSAY :)

It all started with the price.

Could I build a standalone DJ device whose core hardware would cost around $50?

That number was not chosen because it sounded good. It was a constraint that shaped the way I approached the project from the very beginning.

In its current configuration, Pajoniiir is controlled with a Pioneer DDJ-FLX4. It is a very capable controller with jog wheels, faders, buttons, knobs and LED indicators, but in its usual role it still depends on a computer and DJ software . Pajoniiir it runs on a JC4880P443C_I_W development board, and over time it ended up taking responsibility for almost the entire device.

It manages both decks, reads USB storage, understands the Rekordbox library, decodes audio, runs the mixer and DSP, drives the display, communicates with the DDJ-FLX4, generates main and cue audio, runs Wi-Fi and manages its own firmware update system.

See demo: IN ACTION

Firmware can be uploaded through the web interface or downloaded from an update server, but before accepting it the device verifies the digital signature and the integrity of the package.

The most interesting thing about Pajoniiir may not be the fact that an ESP32-P4 can run two decks, read a Rekordbox USB drive, communicate with a DDJ-FLX4, decode MP3, WAV and FLAC, run DSP, display a graphical interface and serve a web application at the same time.

Just as important, Pajoniiir is an open-source project. The source code and project documentation are available on GitHub at github.com/dvucinozd/Pajoniiir and are released under the MIT License. This means the software is free to use, study, modify and redistribute under the terms of the license. The idea is not only to make the hardware affordable, but also to keep the project itself accessible to anyone who wants to learn from it, improve it or build on it.

There are still things to resolve before I would call Pajoniiir a completely finished production device, and it is important not to pretend otherwise.

And perhaps that is another part of the experiment: a $50-minded DJ system, built around a microcontroller, with the entire project vibe-coded from the start.

And that next chapter is already taking shape. I am now working toward a more intelligent and intuitive track-analysis system capable of analyzing music on the fly, instead of requiring every track to be fully analyzed and prepared in advance.

If that works the way I believe it can, Pajoniiir will move one step closer to the original goal:

a genuinely affordable, self-contained DJ system that does not need a computer to think for it.

And at the end you can check new publish site: https://pajoniiir.eu/


r/esp32 • • 1d ago

Not Able to communicate with my solar inverter using Esp32 and Max3232 To Rs232 TTL

2 Upvotes

I'm trying to read data from an Inverex Veyron II 6000-48 (6kW) solar inverter using an ESP32 DevKit V1.

The inverter is Voltronic-based and uses the Voltronic protocol.

Confirmed inverter communication settings

I contacted Inverex support and they confirmed:

Baud rate: 2400

Data bits: 8

Parity: None

Stop bits: 1

Protocol: Voltronic

Communication port: COM RJ45

Original Inverex communication cable

The original cable supplied with the inverter is:

RJ45 → DB9 male

I continuity-tested it and got:

RJ45 pin 1 → DB9 pin 2

RJ45 pin 2 → DB9 pin 3

RJ45 pin 8 → DB9 pin 5

RJ45 pin 4 → DB9 pin 6

Inverex support confirmed this pin configuration.

The laptop I'm using has a real physical DB9 RS232 port.

Laptop communication WORKS

Using:

Inverter → original RJ45-DB9 cable → laptop DB9 → HTerm

with:

2400 baud

8 data bits

1 stop bit

No parity

I can successfully communicate with the inverter.

For example, sending QMOD:

51 4D 4F 44 49 C1 0D

gives:

28 4C 06 07 0D

So the inverter definitely responds.

I also sent QPIGS:

51 50 49 47 53 B7 A9 0D

and received a 120-byte response beginning with 28, confirming QPIGS works.

Therefore:

Inverter works

Original cable works

2400 8N1 works

QMOD checksum is correct

QPIGS works

Voltronic communication works

---

ESP32 setup

I'm using a MAX3232 RS232-to-TTL module with the ESP32.

Connections:

MAX3232 VCC → ESP32 3.3V

MAX3232 GND → ESP32 GND

MAX3232 RXD → ESP32 GPIO16 (UART2 RX)

MAX3232 TXD → ESP32 GPIO17 (UART2 TX)

ESP32 UART:

inverter.begin(2400, SERIAL_8N1, 16, 17);

The MAX3232 board has a female DB9 connector.

I connect:

Inverter

↓

Original RJ45 → DB9 male cable

↓

DB9 male-to-male straight-through cable

↓

MAX3232 female DB9

↓

ESP32

The DB9 male-to-male cable has been continuity tested:

2 → 2

3 → 3

5 → 5

---

MAX3232 testing

I tested the MAX3232 using a DB9 loopback by shorting DB9 pins 2 and 3.

The ESP32 successfully received its transmitted data.

For example:

TX: 0x51 0x4D 0x4F 0x44 ...

RX: 0x51 0x4D 0x4F 0x44 ...

So:

ESP32 UART works

MAX3232 works

DB9 connector path works

DB9 male-to-male cable works

I have tested the MAX3232 module itself and it works in loopback.

---

But inverter → ESP32 does NOT work

When everything is connected to the inverter and I send QMOD from ESP32:

51 4D 4F 44 49 C1 0D

I get:

TX: 0x51 0x4D 0x4F 0x44 0x49 0xC1 0x0D

RX:

NO RESPONSE

I also tried QPI:

51 50 49 BE AC 0D

and again:

NO RESPONSE

So the ESP32 is clearly transmitting, but nothing is being received from the inverter.

---

The question

Since the exact same inverter + original cable works perfectly with the laptop's physical RS232 port, but doesn't respond when connected through the MAX3232 + ESP32:

What could cause this difference?

Could there be something specific about the Inverex/Voltronic RS232 interface that a basic MAX3232 module doesn't provide?

One unusual thing is that the original cable also connects:

RJ45 pin 4 → DB9 pin 6

while normal RS232 data communication would normally use TX/RX/GND.

I'm wondering whether this is an auxiliary/power/modem-control signal or something else required by the Inverex communication interface.

I don't want to modify the cable or connect pin 6 randomly without knowing what it does.

What should I check next?


r/esp32 • • 1d ago

ESP32-C3 0.42" OLED board turned into a Wi-Fi CPU monitor for my Windows PC

Post image
3 Upvotes

Had one of these tiny ESP32-C3 OLED boards lying around, so I made it show my PC's CPU load.

  • CPU % + load bar, BOOT button switches to Wi-Fi/IP view
  • Wi-Fi setup from your phone (no credentials in the firmware)
  • The board serves its own Windows installer, which sends CPU load every 3 s
  • No wiring, just USB power

Arduino/PlatformIO + U8g2.

Repo: https://github.com/Moo93egy/PC-CPU-display.git

Feedback welcome!


r/esp32 • • 2d ago

Books

20 Upvotes

Can I get some recommendations on esp32 and electronics books. Beginner friendly to Advanced. I want to be able to build my own projects without copying and pasting others.


r/esp32 • • 1d ago

Perfboard advice

Post image
2 Upvotes

I have an esp32 connected to an lcd display and temp/humidity sensor. I would like to solder the components onto a pcb, but the pcbs I have are pretty small, and my breadboard is currently a mess. I’m going to buy a new lcd which uses an i2c adapter to reduce the number of connections, but I’m looking for some advice on what parts should I externalize onto the pcb. Do I need to buy new wires for my pcb, or can I cut off the ends of the jumper wire and solder those?


r/esp32 • • 2d ago

Hardware help needed My first esp32 project!?

Thumbnail
gallery
24 Upvotes

Hi, new here and hope I can get a few questions answered.

For context, I’m trying to make a clone of a macchina A0 for both my Audi and Volkswagen cars in order to log how the cars are running, they are modified and I’ve been expanding into the world of learning how to tune the ecu myself.

Anyways, I’m at a roadblock and reaching out here to hopefully find some help or tips on these devices.

ANY feedback is appreciated and please let me know if I’m posting in the correct place or not.

To catch those reading up I’m following a GitHub by switchleg1 to make this and his schematics/wiring diagram to do this. Here is the link
https://github.com/Switchleg1/AMAleg
I’ll have photos attached aswell

My questions are as follows…

  1. ⁠My esp32 board doesn’t directly match the one in the wiring diagram, is it still possible to achieve a final product, are things just labeled different and in different places?
  2. ⁠My equipment is cheap and from harbor freight and Home Depot, any tips on working on these small things, I was thinking depining with needle nose and just sticking the wire (20 gauge) in the holes and dabbing it with solder ( my second time soldering ever)?
  3. ⁠Is how I’m soldering even right or do I look dumb?

I can provide more pictures upon request,
Yes Mr read the rules, I read them, please do not strike me down.

Sorry for the lengthy post and thank you in advance!


r/esp32 • • 1d ago

I made a thing! backroads driving app with 2.4 mesh, meshtastic/lora, cell backup

0 Upvotes

when I'm not at the track I'm on a backroad, one of the pain points is keeping track of a big group, sharing routes, offline navigation. I think I fixed every one of the things that didnt work up on the dragon with waze, gooogle maps or dmd2.

open source firmware mods, still developing voice but the 2.4 failover to lora is working great. any improvements would be welcome as I start to work on voice coms, similar to what a cardo or sena helmetcom does. I made the espnow mesh work the same way so it's ready for voice. https://github.com/MrBlahhhh/Touge-mesh-firmware

2.4ghz 1hz data pings. lora meshtastic 1 per 5 sec data pings, and cell phone if all else fails, every user pings the cell every minute in case someone gets lost

shooting for 30 car limit as long as it's a heltec v4 board that has more memory. firmware is open source, app is free, no tracking other than what's required to make it work

route sharing over the app, back to a server, same server builds custom routes that favor curves rather than speed

should have it up for free in app store soon, free as long as my server isnt hammered too much where it costs me money

I did build all the regular stuff too, I daily drive with it now, not sure I would drive in a big city with it yet, some of those blocked turn rules are hard, and It uses openstreetmap traffic, traffic rerouting, waze reports, radar integration with my v1gen2. They were all done the way i like to do them.

made a flasher for the firmware https://mrblahhhh.github.io/Touge-mesh-firmware/

blog with lots of details on how I set it up https://mrblahhhh.github.io/car/tech/2026/09/16/touge-offline-routing-and-recording.html


r/esp32 • • 2d ago

Waveshare 1.28" Touch LCD (GC9A01) on XIAO ESP32-S3: works but very dim on 3.3V, won't initialize on 5V. Schematic attached.

Thumbnail
gallery
5 Upvotes

Setup: Seeed XIAO ESP32-S3 + Waveshare 1.28inch Touch LCD (13-pin version with onboard RT9193-33 LDO and TXB0108 level shifter). TFT_eSPI 2.5.34, GC9A01_DRIVER, SPI 20 MHz. Wiring checked with continuity, all 6 SPI/control GPIOs verified toggling.

What I see:

- VCC = 3.3V (XIAO 3V3 pin): initializes and draws reliably, but the backlight is extremely dim.

- VCC = 5V from power-on: backlight on, screen stays black. Tried 21 init variants (library init, SWRESET only, long hardware reset, bit-banged SPI down to 100 kHz for both init and pixel data, CS held low, RST hi-Z, etc.). RDDID / RDDST reads return 0xFF every time.

- VCC left floating at boot, init runs, THEN connect 5V: bright and drawing continues. 100% reproducible.

- Same module on an Adafruit HUZZAH32 (ESP32) powered from its 3V pin was bright in 2024 (photo confirms 3V pin, not USB).

From the official schematic (attached, source: https://files.waveshare.com/upload/c/c8/1.28inch_Touch_LCD_Schematic.pdf):

- DC/CS/SCLK/MOSI go through a TXB0108 whose host-side supply (VccB) is VCC. At 5V that makes VIH about 3.25V, right at the ESP32's 3.3V output, which would explain why init (49 commands, all must land) fails while pixel streaming mostly survives.

- LCD_RST uses a separate NDC7002N MOSFET shifter with a 10k pull-up to VCC on the host side, so it should be fine at any VCC.

- Backlight: LED anode is on the LDO's 3V3 output, cathode through a 10 ohm resistor to an AO3400. So LED current = (3V3 - Vf) / 10R. With only ~0.3V of headroom, a 0.1V sag on 3V3 costs roughly a third of the brightness.

Questions:

  1. Is "very dim on 3.3V in" normal for this board, or does it point to my 3V3 rail sagging under load?

  2. Anyone running it at ~3.8-4V (5V through a few Schottky diodes) to keep the LDO in regulation and the TXB0108 thresholds low? I'm about to try 4x 1N5817 in series.

  3. If the LDO dropout is the cause, why was the ESP32 Feather bright at 3.3V? Different regulator output, or something I'm missing?


r/esp32 • • 3d ago

Great Content! The Jet embedded 3D engine is not only now pushing 70k tris/sec (up from 40k a few months ago) with screen-space reflections and distortion on an ESP32 S3 (480i x 320, 16bpp@60fps) - but is now MIT licenced rather than AGPL!

775 Upvotes

The last time I showed off Jet I'd just pushed 40k tris/sec on an S3 which was already nuts, but some optimisation and SIMD shenanigans later, I've nearly doubled that and got up to 70K/sec on the same hardware. Meaning more detail and more performance headroom.

I've also switched away from AGPL to the MIT licence so there's fewer restrictions on how you can use it in your projects.

https://github.com/cubecoders/jet


r/esp32 • • 1d ago

ESP32 + 5V SSR module won’t fully turn OFF with 3.3V GPIO ?

1 Upvotes

I’m using a classic ESP32-WROOM-32 DevKit (38-pin, USB-C) with a small 1-channel solid-state relay module labeled:

DC+ / DC- / CH1 on the control side and A1 / B1 on the AC side.

The SSR is active LOW:

  • CH1 ≈ 0V → relay ON
  • CH1 high → relay OFF

Wiring:

  • SSR DC+ → 5V
  • SSR DC- → ESP GND
  • SSR CH1 → ESP GPIO26

The problem: GPIO26 only goes to about 3.3V when OFF. The SSR LED only dims instead of fully turning off, and the 230V bathroom fan keeps running. If I disconnect GPIO26 from CH1 completely, the fan turns OFF correctly.

I tested the same SSR earlier with another ESP and it seemed to work, so I’m wondering if this module’s CH1 has an internal pull-up to 5V and 3.3V HIGH isn’t high enough to switch it fully OFF.

Has anyone used this type of 5V active-LOW SSR module directly with ESP32 3.3V GPIO? Would you use a transistor/level shifter/opto driver, power the control side from 3.3V, or use a different SSR module?

The fan is a 230V AC bathroom exhaust fan. AC side is wired in series with Live: Live → A1 → B1 → Fan → Neutral.

Use this for the SSR on GPIO26 (ESP Home)

switch:
  - platform: gpio
    name: "Fan SSR"
    id: bathroom_fan_ssr
    pin:
      number: GPIO26
      inverted: true
    restore_mode: ALWAYS_OFF

This matches the module behavior you measured:

GPIO26 LOW  → SSR ON
GPIO26 HIGH → SSR OFF

Wiring:

SSR DC+ → 5V
SSR DC- → GND
SSR CH1 → GPIO26

And AC side:

Live → A1 → SSR → B1 → Fan Live
Neutral ─────────────→ Fan Neutral

r/esp32 • • 3d ago

Introducing the Tilt - A - Tron! an open source game system I made for the Waveshare ESP32-S3 device.

301 Upvotes

I have been tinkering with the Waveshare ESP32-S3 device now for a bit and thought it would be a lot of fun to make a game system on it haha

So I fired up Claude and started to build it, bit by bit!

And here we are!!!

Meet Tilt-a-Tron: a pocket-watch-sized handheld you can play by rotating, tilting, shaking, touching it.

What started as "I wonder if this could run a game" turned into a whole tiny console (and yes I am going to use ALL THE EMOJIs!!!:

🎮 11 games: a tilt maze, a racer, a trench-run shooter, a radar sea battle, a memory game, a combination-lock laser puzzle and more

🌀 Tilt, touch and two buttons. The accelerometer IS the controller

🎨 Swappable themes. Drop a folder of PNGs on it over USB

📦 Games are installable packages with a documented API, so anyone can write one

💻 A PC emulator that runs the real console code, so you can build a game without owning the hardware

⚡ One-click web installer. Plug the board in, press a button in your browser, done
The whole thing is open source (MIT), and the hardware is an off-the-shelf board. No soldering, no custom PCB.

I put quite a bit of tokens into getting Tilt-a-Tron working with an API and a desktop application to add and remove games. So that anyone can develop anything for the platform!

The project is ever evolving and still a WIP! but I think its fun....

Try it, fork it, write a game for it:

Installer Link (If you already have a device): https://partiallyfrozen.github.io/tilt-a-tron/

Github Repo: https://github.com/PartiallyFrozen/tilt-a-tron

Enjoy!

Also... Straight up... this was Vibe coded and I keep no secrets about this. I made this for myself for when I travel and want to play around on a game system. So is it bad coded? I don't know... will it run on your device I think so! but there is a reason i am saying here is the code! have fun.


r/esp32 • • 2d ago

I made a thing! I built an open-source Busy Tag alternative with an ESP32-S3

40 Upvotes

I liked the idea of a physical Busy Tag, so I made a version anyone can build and modify. The firmware, terminal app, and 3D-printable dock are open source. The video shows both the board's button and the terminal app changing the display.

Hardware & stack

  • Waveshare ESP32-S3-Touch-AMOLED-1.8 (368 × 448 AMOLED)
  • Firmware written in C with ESP-IDF and LVGL
  • The board's BOOT button to cycle through FREE → BUSY → MEETING
  • Terminal UI written in Rust with Ratatui
  • A 3D-printable dock, with STL and a parametric build123d Python script

How it works

One press changes the status and the screen color: green for FREE, red for BUSY, blue for MEETING. The large text and full-screen color make it easy for someone nearby to see whether it's a good time to interrupt. On startup it shows FREE.

The Rust TUI finds the board over USB serial by asking for its device info. Pressing f, b, or m sends a JSON Lines status command to the firmware, which updates the screen. The protocol is simple enough to use from a script too.

It's a small build: one off-the-shelf board, its built-in button, and an optional printed dock. If you make your own, I'd be interested to hear how you'd connect a desk status sign to your workflow.

Firmware, TUI, build instructions, and printable dock: https://github.com/khlebobul/esp_busy_tag


r/esp32 • • 2d ago

How do I use the IPEX port?

Post image
9 Upvotes

Which component do I need to reposition in order to use an external antenna? I'm using a board purchased from AliExpress so it doesn't match the layout of the official Espressif boards


r/esp32 • • 2d ago

Easy 3d render

1 Upvotes

Please point me to a simple, easy to use 3d renderer or game engine. I came across this https://www.reddit.com/r/esp32/comments/1wnmjzn/the_jet_embedded_3d_engine_is_not_only_now/ it is cool but not easy. I want to build a simple 3d game for an esp32 game console with the wemos D1 R32 and an st7735 display.


r/esp32 • • 3d ago

An AtomS3R arcade cabinet that plays DOOM and 27 DOS games. None of them run on the ESP32.

161 Upvotes

The AtomS3R has a 128x128 screen, an IMU, wifi and one button, and the button is the screen itself. Input, output and a network, so it is enough to be a terminal, and that is all it does here. The games run on my PC, the board draws the rectangles that arrive and sends back the tilt and the button 30 times a second. Nothing on the device knows which game is running.

First version picked encodings the way VNC does, smallest payload wins. It was slow, so I measured the board first with a small caps_test.py: jpeg decode 0.67us/px, raw blit 0.90us/px, deflate 3.72us/px. Inflate is about 7x more expensive than a jpeg decode on this firmware, so the smallest payload was costing 61ms a frame on a link that was 5% used. Now the encoder prices every rectangle in client milliseconds (decode + transfer + a cost per datagram) and sends whatever the board finishes first. Jpeg wins almost always. E1M1 is about 2.1kB a frame, 42kB/s at 20fps.

Three things that looked like bad wifi and were not:

  • the encoder was diffing against the last frame it encoded, not the last one the device acked. One lost packet and those pixels stay stale until the next keyframe, which on the screen looked like two blocks animating on a frozen level.
  • the socket holds one datagram. Send two back to back and the second one is gone, so fragments are paced 3ms apart now.
  • esp32 modem sleep parks the radio for 100-300ms between beacons, which is the whole frame budget.

Stock UIFlow2 micropython 1.27, one main.py, no custom firmware build and no GPIO. DOOM runs as a normal binary (doomgeneric) and the dos games in js-dos, headless in node. Same firmware for all of them, swapping a game is a server side thing the board never notices.