Files
carparkingsensor/CLAUDE.md
Richard b3deb0036f Initial commit — car parking distance sensor
ESP32-C3 Zero + VL53L1X ToF sensor + 3x LEDs with WiFi AP web calibration UI,
rolling average smoothing, auto-sleep, and NVS persistence.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 12:31:15 +02:00

59 lines
2.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
Car parking distance sensor using an ESP32-C3 Zero, VL53L1X Time-of-Flight laser sensor, and 3x 10mm LEDs (green/yellow/red). Wall-mounted in a garage, it measures distance to an approaching car and displays proximity via LED states. Includes a WiFi AP with web UI for remote calibration.
## Build & Flash Commands
- `pio run` — compile firmware
- `pio run -t upload` — flash to ESP32-C3 (port: `/dev/ttyACM0`)
- `pio device monitor` — serial monitor (115200 baud)
- `pio run -t upload && pio device monitor` — flash and monitor in one shot
Note: close the serial monitor before flashing, or the port will be busy.
## Architecture
Single-file firmware (`src/main.cpp`) using Arduino framework on PlatformIO. Three subsystems:
1. **Sensor** — VL53L1X on I2C (GPIO 5 SDA, GPIO 6 SCL), continuous mode at 50ms intervals
2. **LEDs** — 3x 10mm through-hole on GPIO 2 (green), GPIO 3 (yellow), GPIO 4 (red), active HIGH with 220Ω resistors
3. **WiFi/Web** — ESP32 runs as AP (SSID: `ParkingSensor`, pass: `carpark1`). Web server on `192.168.4.1` provides:
- Live distance readout (polls `/api/status` at 300ms)
- One-tap calibration (`POST /api/calibrate`) — sets current distance as the stop point
- Manual stop distance input (`POST /api/set?stop=N`)
## LED Behaviour
LEDs off when distance > stop + 1000mm (ZONE_GREEN + 200mm headroom). Within range, zones are calculated as offsets above the calibrated stop distance:
| Zone | Distance | LEDs |
|------|----------|------|
| Far | > stop + 800mm | Green |
| Approaching | stop + 400 stop + 800mm | Green + Yellow |
| Close | stop + 100 stop + 400mm | Yellow + Red |
| Very close | stop stop + 100mm | Red solid |
| STOP | < stop | Red flashing |
## Signal Processing
- **Rolling average**: 5-sample moving average of valid readings smooths jitter
- **Bad reading filter**: readings with `range_status != 0` are discarded (status 7 = wrap-around is common at range edges)
- **Zero filter**: distance 0 (no target) is discarded
- **Auto-sleep**: LEDs turn off after 30s of stable distance (30mm tolerance), wake on movement
## Calibration & Persistence
The stop distance is stored in NVS (ESP32 flash) via the `Preferences` library. It survives power cycles. Zone offsets are `#define` constants (`ZONE_RED` 100, `ZONE_YELLOW` 400, `ZONE_GREEN` 800) at the top of `src/main.cpp`. Stable tolerance (`STABLE_TOLERANCE` 30mm) and sleep timeout (`SLEEP_TIMEOUT` 30000ms) are also tuneable.
## Hardware
- **Board**: ESP32-C3 Zero (board target: `esp32-c3-devkitm-1`)
- **Sensor**: VL53L1X ToF (I2C, Pololu library `pololu/VL53L1X@^1.3.1`)
- **LEDs**: 10mm through-hole (green, yellow, red) with 220Ω resistors
- **Power**: USB-C
- **Build flags**: `-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=1` (required for serial over USB on C3 Zero)