r/esp32

▲ 1.0k r/esp32+2 crossposts

SignalSweep: pocket counter-surveillance scanner on a XIAO ESP32-C5

I built a little box that listens for surveillance and tracking gear and tells you what it heard by sound alone. It works face-down in a cupholder or buried in a jacket pocket. No screen, no phone required.

What it hears

  • Drones: full ASTM F3411 Remote ID over BLE, Wi-Fi beacon and Wi-Fi NAN. You get ID, altitude, speed, heading and operator location.
  • Trackers: Apple Find My, Google, Samsung, Tile. When someone floods the air with fake tags it notices and stops beeping.
  • Surveillance hardware: Flock ALPR, Axon body cams, smart glasses. Signatures live in a list you edit from the app (OUI, company ID, name, UUID, SSID). No recompile.
  • Attack gear (opt-in): BLE spam, deauth bursts, karma APs, Flipper hints, pwnagotchis.

How it talks

Each category has its own beep pattern:

  • two long beeps = camera
  • rising trill = drone
  • fast ticking = tracker

Lock onto a device and it switches to hunt mode. The beeps speed up as you close in, so you walk it down by ear.

Hardware

XIAO ESP32-C5 (~$13), dual-band U.FL antenna, passive buzzer, WS2812 bar. microSD and a DS3231 are optional. The C5 sweeps 2.4 and 5 GHz together. It also runs on the S3, 2.4 GHz only.

The ESP32 bits you might care about

  • BLE scanning plus dual-band Wi-Fi promiscuous at the same time on the C5
  • Settings survive a pulled cable, because a car or a battery bank power-cycles it constantly
  • Web flasher that works out whether it's talking to a C5 or an S3
  • pcap export off the SD card over serial, straight into Wireshark

Things that bit me

  • Continuous NimBLE scans leak heap. setMaxResults defaults to 0xFF and results only clear when a scan completes, which a continuous scan never does. Every rotating random MAC leaked: 187 KB down to 78 KB of internal heap over 17 hours on the S3. esp_get_free_heap_size() hid it completely because it counts 8 MB of PSRAM. setMaxResults(0) fixed it.
  • notify() silently drops when the mbuf pool is empty. NimBLE-Arduino 1.4 ignores the return code, so big replies over BLE just went missing with no errors on either side. Now every chunk goes through ble_gattc_notify_custom(), which waits and retries on ENOMEM.
  • The NimBLE host task stack is 4 KB. I handled commands in onWrite, and a couple of new locals boot-looped the board the moment a phone connected. Over USB it worked fine, because those same commands run on loop() there.
  • One radio, two jobs. BLE scanning and Wi-Fi promiscuous mode time-slice the same radio. With a near-100% BLE scan window, Wi-Fi captured literally zero frames.
  • The C5 promiscuous callback hands you failed frames (rx_state != 0). Unless you drop them, you get random garbage and thousands of fake transmitters.
  • Pwnagotchi beacons are gzipped. The S3 ROM has tinfl_decompress built in. The C5 ROM doesn't, so I had to vendor an inflate for it.

What it won't do

It only receives. No jamming, no deauth, no injection, no spoofing. You can also kill its own BLE advertising, so it doesn't show up on someone else's scanner. The only winning move is not to transmit.

Getting it

Firmware is GPL-3.0. Flash it from the browser, then run the app in Chrome/Edge or as an Android APK. Or skip both, since the board beeps fine on its own.

Repo: https://github.com/B0z0dcl0wn/SignalSweep

Signatures are the weak spot. If it misses gear you know about, please send a PR. Happy to answer build questions.

(Full disclosure: I plan to sell assembled units and kits later. The build-your-own path is fully open now and stays that way.)

u/No-Molasses1769 — 5 days ago
▲ 12 r/esp32

Help me connect this esp32 board and upload code into it

I bought this esp32 cheap yellow display board and I don't know how to connect it to my ide can anyone

EDIT I don't know pin out of the screen if anyone has used this board help me out

EDIT 2 IT WORKEDD I TRIED THE TEST CODE 5 TIMES AND IT FINALLY WORKED AFTER SINE TWEAKING APPARENTLY THE USER_SETUPS HAD TO CHANGED TO ST7789 DRIVER

u/ExtraHousing4739 — 6 days ago
▲ 174 r/esp32

Esp32 Object Scanner

I’ve been working on an AR game for the esp32s3 XIAO board and round screen and realized that I could use the pose estimation from the board to create an object scanner / mesher using space carving and marching cubes. The space carving algorithm uses different views of the object to create voxels weighted by how many views it was visible from and agreed on its position. Then marching cubes uses a LUT to create triangle mesh out of the voxels. The hardest part was getting the camera feed to change resolution from 240x240 to match the round screen for the video feed to a higher resolution for the pictures used for space carving, but with some AI help I got it working. The results are not great and I’m sure I can optimize it to get it a bit better but for a 20$ setup it’s not bad. A possible use case is to quickly create a mesh from small objects that you find while hiking or just to create a digital twin of little trinkets. I’m sure a smartphone could do this with much better results but where is the fun in that. If people are interested I’ll try to share the code which uses my gfx library which I’ve been working on for a minute.

u/the_man_of_the_first — 7 days ago
▲ 10 r/esp32

Has anyone had an ESP32-S3 reset at high WiFi TX power after a layout change? Receive got way better, transmit got way worse

Moved the chip antenna to the board edge on the new rev of my ESP32-S3 watch board. Receive got way better (RSSI -49 vs -78 to -86 on the old board, same AP, same desk). Transmit got worse.

Swept esp_wifi_set_max_tx_power() on both:

TX power Old board New board
2–5 dBm AUTH_EXPIRE joins, barely any data
8–14 dBm AUTH_EXPIRE AUTH_EXPIRE
17–20 dBm joins chip resets

The reset is an interrupt WDT inside systimer_hal_get_counter_value, and the systimer runs off the 40 MHz crystal. So I think the crystal clock stalls when it transmits hard.

Main suspect is in the picture: I routed bottom-layer tracks under the crystal on the new board, so ground under X1 went from 43% to 3%, right next to an antenna that now actually radiates.

Has anyone seen an S3 pull its own crystal like this? And is grounded copper tape over X1 a fair test without a VNA?

(Full disclosure, it's my own watch project I am planning on selling. It's in certification, updates/pre-order here: https://www.ewanwills.co.uk/r/reddit-esp32/ewatch · firmware: https://github.com/Ewan-Wills/EWatch_Dev)

u/Gur_Technical — 6 days ago
▲ 13 r/esp32

Reliability

Ive been messing around with ESP chips for a few years now usually 3d printed rgb matrixes and the like as gifts and ive always found my chips less than reliable. The ones ive been using for Ambilight at home seem to be the ones i use the most and tbh the tv is rarely turned on nowadays anyway but after several months ill start to get weird behaviour, intermittent led flicker, wifi no longer working and half a dozen other oddities that dont seem to disappear after erasing/reflashing but go away as soon as i replace the ESP.

Now im assuming this is because i like to keep things simple and throw my projects together without any fancy addons like resistors on the data line, caps on the power supply, level shifters and so on. i normally forget to ground the last data line out (is this even a thing?).

Am i right in thinking this is whats probably killing my projects? Any one place online i can see what i should be doing to clean up my data and power?

Included some of my wiring, as you can see i love simple 🤦‍♂️

Thanks.

u/Gords78 — 6 days ago
▲ 92 r/esp32

a 153 times faster esp32 adblocker with 650k+ domains

https://github.com/NikoMalik/esp32-block

A network-wide ad/tracker blocker on a cheap ESP32. It runs as a DNS server for your home: normal domains resolve as usual, ad/tracker/malware domains get answered with 0.0.0.0 so they never load. One small box, every device on the WiFi benefits, no app to install on phones or TVs.

Fork of M-Abozaid/esp32-c3-adblock. This fork targets the classic ESP32 (also builds for C3)

~645,000 domains (ads, trackers, malware, plus Russian lists :) ) live in flash as 40-bit hashes in a bucketed index, memory-mapped and looked up on the device - no PSRAM needed.

The blob is memory-mapped (esp_partition_mmap): the CPU reads it straight through the flash cache like RAM, so steps 2-3 are just a few cache-line reads. That is the main speed win. The earlier design kept the list as a LittleFS file and did one random filesystem read per lookup (~1.2 ms); mmap + buckets dropped that to 8 us 150x faster, ~123k lookups/sec.

u/ILYAMALIK — 7 days ago
▲ 1 r/esp32

ESP32-S3: Native USB works via onboard port, but fails when wired to GPIO 19/20 via USB-C

Hello everyone!

I'm trying to connect an ESP32-S3 to an Android phone using a basic 4-pin USB-C breakout board (VBUS, GND, D+, D-) wired directly to the native USB pins: GPIO 19 (D-) and GPIO 20 (D+).

​If I use a cable directly from the ESP32-S3's onboard native USB port to the phone, communication works correctly.

​But when I route through the external USB-C breakout board wired to pins 19 and 20, the phone completely ignores it. Wall chargers power the board fine through the breakout board but the phone doesn't.

​Why does the onboard native port work, but wiring directly to pins 19/20 via a breakout board fails? What am I missing about USB architecture or hardware requirements here?

​Thanks!

reddit.com
u/plimaz — 5 days ago
▲ 42 r/esp32+2 crossposts

ESP32-S3 Simple testboard design in KiCad

The main feautures for this board are:

- ESP32-S3-WROOM Module - 8 MB flash

- Button for RESET

- User Button

- User RGB LED

- expansion header

- programming header

- Power LED on 3V rail

for the mechanical side of things we will have:

- 4 x 3.2mm mounting holes

- Size 45x45mm

- 4 layer board design

youtu.be
u/NoIndication1754 — 6 days ago
▲ 6 r/esp32

How do you actually package your ESPHome sensors?

I've been experimenting with small electronics projects and I'm curious how people in the ESPHome/Home Assistant community solve the physical side of DIY sensors.

The electronics are often relatively easy.

The enclosure can be the difficult part.

For example, with temperature/humidity/air-quality sensors, the enclosure can affect the measurements themselves.

So I'm curious:

What do you currently use for your ESPHome sensor enclosures?

• 3D-printed cases

• Commercial project boxes

• Repurposed containers

• Custom-built enclosures

• No enclosure 😄

• Something else?

And what problems have you encountered?

For example:

• Heat from the ESP32 affecting temperature readings

• Poor airflow

• Humidity getting trapped

• Sensor exposure vs. electronics protection

• USB/power access

• Battery replacement

• Wall mounting

• Ceiling mounting

• Difficult access to the electronics

• Enclosure size

• Appearance — something you actually want visible in your home

• Finding a case that fits your particular sensor combination

I'm particularly interested in what you've tried that didn't work well.

If you could redesign your current sensor enclosure, what would you change?

reddit.com
u/Ok-Bus50 — 7 days ago
▲ 2 r/esp32

Solid or stranded wire for my first ESP32 project?

Hey, I'm building a Spotify controller with an ESP32-S3. It'll have a small display for album art and song info, a rotary encoder for volume/play-pause, two buttons for skipping tracks, and an LED ring around the knob.

I'm pretty new to this, so I'm trying to figure out what wire to buy. I'm leaning towards 22 AWG solid-core because it seems easier to work with, especially when soldering, but I've heard stranded wire is better for projects like this because it's more flexible.

I'll be testing everything on a breadboard first, then soldering it together and putting it in a 3D-printed case.

Would it be fine to use solid-core wire for most of the connections, or should I just get stranded wire? Is stranded actually that much harder to solder as a beginner?

Any advice would be appreciated. I don't want to buy a bunch of wire only to regret it later lol.

parts

  • ESP32-S3 N16R8 development board
  • 1.54-inch 240×240 ST7789 SPI TFT display
  • EC11 rotary encoder with push button
  • WS2812B 12-LED RGB ring
  • 2 × 12×12mm tactile push buttons
  • 330Ω resistor
  • 470µF electrolytic capacitor
reddit.com
u/Its_Internet — 5 days ago
▲ 0 r/esp32

Strange ESP32 behaviour with addressable LED

Edit: Somehow I've resolved this, just by changing the pin assignment and connections, even though I'd already done that.

Context: I'm running ESPhome on an ESP32-C6 supermini. It's connected to three output devices; a 360 degree servo on GPIO20, a 180 servo on GPIO19, and a single WS2811 LED on GPIO 18.

I had it all set up and working fine, until in a daft moment, I used some metal tweezers to move the LED and I think I shorted something. From that point on I couldn't get the LED to work, but both servos behaved fine. But this is where it gets weird

I assumed I blew the LED, no big I have spares. So I hooked up a new LED but nothing worked. I thought maybe I grabbed a duff second LED so I took it over to my testing bench, copied the code from my prod ESP and hooked up the LED. Everything worked fine.

Next thing I thought it could be was that I'd somehow blown the pin the LED was connected to. So I changed the pinout to GPIO15 (and then GPIO16) and connected everything up. Still nothing.

Finally I thought maybe I'd blow the the power or ground line. I'd done a continuity check on both and it was fine. But nonetheless, I hooked up the prod boards 5V and GND lines to the testing boards corresponding lines, powered the test board, and confirmed that the prod board was receiving power. So far so good. I then connected the 2nd LED to the 5V and GND lines on the prod board, but the data pin on the testing board. On accessing the test-board, I was able to confirm the LED works.

So far I've confirmed:

  • 5v continuity on the prod esp
  • GND continuity on the prod esp
  • Continuity between the data pin and the LED
  • LED works
  • Code works
  • Prod board works for servos and logging with no errors

What doesn't work:

  • LED on original GPIO18
  • LED on GPIO15 or 16

My question is—is there some kind of hardware element on an ESP board that could be damaged by shorting an attached LED that would disable it from controlling LEDs, but not affect anything else?

Here's my sanitised ESPHome Code

esphome:
  name: n26-comms-array
  friendly_name: N26 - Comms Array
  min_version: 2026.4.0
  name_add_mac_suffix: false

esp32:
  variant: esp32c6
  framework:
    type: esp-idf

# Enable logging
logger:

# Enable Home Assistant API
api:

# Allow Over-The-Air updates
ota:
  - platform: esphome

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

espnow:
  peers: 
    - ###########
  on_receive:
    - lambda: |-
        char hex[256];
        ESP_LOGD("espnow", "Data %s:", format_hex_pretty_to(hex, data, size));
    - if:
        condition:
          lambda: "return size >= 1 && data[3] == 0x11;"
        then:
        - lambda: |-
            ESP_LOGD("espnow", "Toggled");
        - button.press: rotate_dish_left
    - if:
        condition:
          lambda: "return size >= 1 && data[3] == 0x22;"
        then:
        - lambda: |-
            ESP_LOGD("espnow", "Faulty Lights 1");
        - button.press: rotate_dish_right
    - if:
        condition:
          lambda: "return size >= 1 && data[3] == 0x33;"
        then:
        - lambda: |-
            ESP_LOGD("espnow", "Faulty Lights 2");
        - button.press: pan_dish_up
    - if:
        condition:
          lambda: "return size >= 1 && data[3] == 0x44;"
        then:
        - lambda: |-
            ESP_LOGD("espnow", "Faulty Lights 1");
        - button.press: pan_dish_down
    - if:
        condition:
          lambda: "return size >= 1 && data[3] == 0x55;"
        then:
        - lambda: |-
            ESP_LOGD("espnow", "Faulty Lights 2");
        - button.press: connection_sweep

servo:
  - id: rotation
    output: pwm_output_1
    min_level: 3%
    idle_level: 7.5%
    max_level: 12.5%
    transition_length: 1s
    
  - id: pan
    output: pwm_output_2
    min_level: 3%
    idle_level: 7.5%
    max_level: 12.5%
    transition_length: 2s

output:
  - platform: ledc
    id: pwm_output_1
    pin: GPIO20
    frequency: 50Hz
    
  - platform: ledc
    id: pwm_output_2
    pin: GPIO19
    frequency: 50Hz

number:
  - platform: template
    id: pan_position
    name: "Pan Position"
    min_value: -1
    max_value: 1
    initial_value: 0
    step: 0.01
    restore_value: false
    optimistic: true
    on_value:
      then:
        - servo.write: 
            id: pan
            level: !lambda "return x;"
  - platform: template
    id: pan_increment
    name: "Pan Increment"
    min_value: 0.00
    max_value: 1
    initial_value: 0.05
    step: 0.05
    restore_value: false
    optimistic: true

switch:
  - platform: template
    id: sweep_mode
    optimistic: true
    on_turn_on:
      then:
        - light.control:
            id: uplink
            state: on
            effect: "Scanning"
            red: 50%
            blue: 0%
            green: 0%
        - servo.write: 
            id: rotation
            level: -0.16
        - while: 
            condition:
              lambda: 'return id(sweep_mode).state;'
            then:
            - servo.write:
                id: pan
                level: 1
            - delay: 2000ms
            - servo.write:
                id: pan
                level: -1
            - delay: 2000ms

    on_turn_off:
      then:
      - servo.detach: 
          id: pan
      - servo.write:
          id: rotation
          level: 0
      - servo.detach: 
          id: rotation
      - light.turn_off: 
          id: uplink

script:
  - id: rotate_left
    then:
      - servo.write:
          id: rotation
          level: -16.0%
      - delay: 500ms
      - servo.write:
          id: rotation
          level: 0%        
  - id: rotate_right
    then:
      - servo.write:
          id: rotation
          level: 16.0%
      - delay: 500ms
      - servo.write:
          id: rotation
          level: 0%
  - id: pan_up
    then:
      - if: 
          condition:
            lambda: 'return (id(pan_position).state - id(pan_increment).state) > -1.0;'
          then: 
            - number.set: 
                id: pan_position
                value: !lambda "return id(pan_position).state - id(pan_increment).state;"
          else: 
            - number.set: 
                id: pan_position
                value: -1.0

  - id: pan_down
    then:
      - if: 
          condition:
            lambda: 'return (id(pan_position).state + id(pan_increment).state) < 1.0;'
          then: 
            - number.set: 
                id: pan_position
                value: !lambda "return id(pan_position).state + id(pan_increment).state;"
          else: 
            - number.set: 
                id: pan_position
                value: 1.0
light:
  - platform: esp32_rmt_led_strip
    channel_colors: GRB
    pin: GPIO18
    num_leds: 1
    chipset: WS2811
    rmt_symbols: 96
    id: uplink
    name: "Uplink"
    effects: 
      - pulse:
          name: "Scanning"
          transition_length: 1s
          update_interval: 1s
          min_brightness: 0%
          max_brightness: 50%
      - flicker:
          name: "Data Transmision"
          alpha: 50%
          intensity: 100%

button:
  - platform: template
    id: rotate_dish_left
    name: "Rotate Left"
    on_press:
      then:
        - script.execute: rotate_left
  - platform: template
    id: rotate_dish_right
    name: "Rotate Right"
    on_press:
      then:
        - script.execute: rotate_right
  - platform: template
    id: pan_dish_up
    name: "Pan Up"
    on_press:
      then:
        - script.execute: pan_up
  - platform: template
    id: pan_dish_down
    name: "Pan Down"
    on_press:
      then:
        - script.execute: pan_down
  - platform: template
    id: home_dish
    name: "Home Dish Position"
    on_press:
      then:
      - servo.write:
          id: pan
          level: 0.0%
      - number.set: 
          id: pan_position
          value: 0.00
  - platform: template
    id: scanning
    name: "Scanning"
    on_press:
      then:
        - light.control:
            id: uplink
            state: on
            effect: "Scanning"
            red: 50%
            blue: 0%
            green: 0%

            
  - platform: template
    id: transmitting
    name: "Transmitting"
    on_press:
      then:
        - light.control:
            id: uplink
            state: on
            effect: "Data Transmision"
            red: 0%
            blue: 0%
            green: 50%

  - platform: template
    id: connection_sweep
    name: "Connection Sweep"
    on_press:
      then:
        - switch.toggle: 
            id: sweep_mode
reddit.com
u/Davedamon — 6 days ago
▲ 3 r/esp32

I built ESP32 firmware that handles incoming and outgoing phone calls with voice AI

Businesses already have AI answering their phones. I wanted one on the customer's side too.

I built ParrotVoice so a voice agent can handle the calls I keep putting off: customer support, returns and bookings, using my own phone and SIM.

A classic ESP32/WROOM-32 connects to the phone over Bluetooth HFP. A Chrome/Web Serial bridge connects it to the voice AI.

In the demo, Claude finds a number in my call history, calls about returning headphones and brings back the answer. Through MCP, your agent can also answer calls and steer the conversation live.

No SIP trunk or extra number to rent. The firmware and browser bridge are free; your phone plan and AI usage still apply.

What call would you hand off first?

Project: https://parrotvoice.app YouTube: https://www.youtube.com/watch?v=qbZa57KaO2M X: https://x.com/ParrotVoice/status/2108352885348319331

u/Christy_Arnoldt — 6 days ago
▲ 6 r/esp32

ESP32 Open Source AR Glasses | Optics Help

Hi everyone! I have been trying to build truly open source smart glasses (both hardware and software) based on ESP32 for almost a year now as a side project.

I did accomplish one version of PCB that functions similar to meta ray ban but the audio video quality is inferior (OV cameras cannot match Sony). Image of the set attached.

I tried upgrading the product with an AR screen through a microled projected on the lens (similar to focals from North). This is where i am stuck. I am trying to build something inexpensive so waveguides and microprojectors are out of the question.

Needing suggestions and inputs from anyone experienced with options or has been developing smart glasses themselves. Would love to meet someone who can join me in building this if interested.

The total cost of this assembly is landing at 20$ for the PCB set, for bulk orders > 50 units from JLCPCB, and additional 20$ for other hardware components (screen, camera, speaker, battery and frame). So 40$ for audio-camera glasses, might land around 50$ for AR HUD.

I painfully learned through this project never to take ambitious development of industrial D2C products oneself. Better hand it to the Chinese lol.

u/Strong_Let5609 — 5 days ago
▲ 6 r/esp32

I built an open-source library and fleet management platform for ESP32 OTA updates

Hi!

I've been working on a project called Otamatic and wanted to share it here hoping it could help someone.

The idea came from a real nightmare: a while back, me, and a client literally had to drive around the city to update ESP32s deployed in the field. I actually wrote a short story about that night here if you like dev horror stories: https://medium.com/gitconnected/the-night-we-updated-40-esp32s-by-driving-around-the-city-32ec8f015213?sk=b0c21ebf23d7bd9128251e8222d55b8e

Most OTA implementations out there set up a local WebServer on the ESP32 where you open a browser, navigate to the local IP, and upload a binary. That’s totally fine for a single node on your home network, but it gets annoying real quick if your devices are behind NATs, cellular routers, or dynamic IPs where you can't just open incoming ports.

This is why I decided to work on a fully open-source library with all features from the most famous OTA libraries (and a companion web platform) you can use to add OTA on your projects in less than 5 minutes.

It supports advanced features like scheduled release, staged rollout releases, release monitoring, device monitoring and more is coming if I see enough interest!

If you're working on hobby or small projects, there is also a free plan you can use. Otherwise just include the library and point it to your own web server!

Repo: https://github.com/TimothyFran/OtamaticClient

Web: https://otamatic.eu

u/FranTimo — 6 days ago
▲ 12 r/esp32

Standalone Spotify Remote on the "Cheap Yellow Display" (ESP32-2432S028R) with LVGL, PKCE OAuth & Ambient RGB LED

Translucent print to show onboard led which follows album art

github.com
u/djansen1987 — 6 days ago