ESPGeiger Compatible Hardware
ESPGeiger is written to be compatible with both the ESP8266 and ESP32 range of MCUs.
ESP8266
The Wemos D1 Mini (4MB) is the recommended ESP8266 MCU for ESPGeiger.
The ESP8266 ESPGeiger build is the base firmware for the official ESPGeiger-based hardware ESPGeiger-HW and ESPGeiger Log.
ESP32
The ESP32 DevKit / WROOM-32 (classic ESP32) is the recommended ESP32 target. Any 4 MB board built on the original ESP32 (Tensilica dual-core, IDF target esp32) should work with the esp32_* and esp32oled_* builds.
Variant support
| Variant | Status | Notes |
|---|---|---|
| ESP32 (classic) | Fully supported | All esp32_* / esp32oled_* build envs. PCNT hardware counter. |
| ESP32-S3 | Partial | Used in the XH-S3E build (xh_s3e_udp). Generic esp32s3_* envs not yet shipped — pending hardware verification (PCNT on S3, HV ADC). |
| ESP32-S2 | Experimental | Base config present, no shipped end-user envs. |
| ESP32-C3 / C6 / H2 | Not supported | No build envs. RISC-V cores not tested. |
Boards with onboard OLED
Several popular ESP32 / ESP8266 boards ship with an SSD1306 OLED soldered to the same PCB. Most work with the existing esp8266oled_* / esp32oled_* builds — runtime pin settings on the Config page let you adjust SDA/SCL without rebuilding.
| Board | MCU | OLED pins (SDA / SCL) | OLED RST | Build | Notes |
|---|---|---|---|---|---|
| NodeMCU + 0.96” OLED | ESP8266 | 4 / 5 (default) | tied to 3V3 | esp8266oled_* | Works out of the box - matches firmware defaults. |
| Heltec WiFi Kit 32 V2 | ESP32 classic | 4 / 15 | GPIO 16 | esp32oled_* + -DOLED_SDA=4 -DOLED_SCL=15 -DOLED_RST=16 | Needs a custom build that sets the RST pin (see below). |
| Heltec WiFi LoRa 32 V3 | ESP32-S3 | 17 / 18 | GPIO 21 | Not yet supported | Waits on generic esp32s3_* build envs. |
| TTGO LoRa32 V1 | ESP32 classic | 4 / 15 | GPIO 16 | esp32oled_* + -DOLED_SDA=4 -DOLED_SCL=15 -DOLED_RST=16 | Same recipe as Heltec V2. |
| LilyGo T-Beam | ESP32 classic | 21 / 22 (default) | none | esp32oled_* | Works with stock defaults. |
Boards that wire the OLED’s reset line to a GPIO (Heltec / TTGO) need the firmware to pulse that pin at boot. The -DOLED_RST=N build flag enables that pulse; if omitted, the OLED stays in reset and shows a blank screen. Once defined, the pin is also runtime-adjustable from Config → Display → Reset Pin.
If your board isn’t listed but matches one of these patterns, the same recipe applies - set OLED_SDA, OLED_SCL, and OLED_RST (if relevant) in a custom build env.
PCNT
The ESP32 range of MCUs feature an in-built hardware pulse counter (PCNT). By default ESPGeiger uses the hardware PCNT on Pulse builds for ESP32 devices. A no_pcnt build is also available for ESP32 which uses the same Interrupt counter mechanism as the ESP8266 builds.
PCNT Filter
The PCNT hardware includes a glitch filter that can ignore pulses shorter than a configurable threshold. This helps filter out electrical noise and interference that could otherwise be counted as false radiation events.
The filter value can be configured from the ESPGeiger web interface under Config. The value ranges from 0 to 1023, representing APB clock cycles at 80MHz (each unit = 12.5ns). A value of 0 disables filtering.
| Filter Value | Pulse Duration Filtered | Use Case |
|---|---|---|
| 0 | Disabled | No filtering |
| 100 (default) | < 1.25μs | Filters electrical noise while passing all real geiger pulses |
| 500 | < 6.25μs | More aggressive filtering for noisy environments |
| 1023 | < 12.8μs | Maximum filtering |
Real Geiger-Muller tube pulses are typically 50-200μs in duration, so even the maximum filter value will not affect real readings. The filter is only available on ESP32 PCNT builds.
The filter value can also be set at compile time with the -D PCNT_FILTER=N build flag. See Build Options for details.
Interrupt Debounce
On builds that use software interrupt counting instead of PCNT (all ESP8266 pulse builds, and ESP32 no_pcnt builds), a debounce window rejects any edge that arrives within a configurable number of microseconds of the previously accepted pulse. This serves the same purpose as the PCNT filter - suppressing electrical noise and contact bounce without affecting real tube pulses.
The debounce value can be configured from the ESPGeiger web interface under Config. The value is in microseconds, with a range of 0 to 10000. A value of 0 disables the debounce.
| Debounce Value | Pulses Rejected | Use Case |
|---|---|---|
| 0 | Disabled | No debounce |
| 500 (default) | < 500μs apart | Suppresses typical switching noise, passes all real pulses |
| 1000 | < 1ms apart | More aggressive for noisier setups |
Real Geiger-Muller tube dead time is around 50-200μs, so the default value comfortably accommodates real events. The debounce only applies to the software interrupt path; PCNT builds use the PCNT Filter above instead.
The default can also be set at compile time with the -D GEIGER_DEBOUNCE=N build flag. See Build Options for details.