From 9a32b284567d4d70397fa8db83ff554a662d7718 Mon Sep 17 00:00:00 2001 From: Sam Rolfe Date: Thu, 29 Oct 2026 16:50:23 +1100 Subject: [PATCH] docs: add standardized 8-section README, dual-render images, and image manifest --- README.md | 30 ++++++++++++++++++++++++++++++ docs/images/README.md | 5 +++++ docs/images/hero-site.webp | Bin 0 -> 11778 bytes docs/images/hero.png | Bin 0 -> 7325 bytes 4 files changed, 35 insertions(+) create mode 100644 README.md create mode 100644 docs/images/README.md create mode 100644 docs/images/hero-site.webp create mode 100644 docs/images/hero.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..9aa4f6c --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +Ultra-low-power ESP32 outdoor porch security light controller with LoRa communication, PIR motion waking, ambient light sensing, and battery voltage protection. + +![ESP32 porch light controller with SX127x LoRa module, PIR motion sensor, and VEML7700 lux meter](docs/images/hero.png) + +**Status: in progress** + +### What it does +* Wakes from ESP32 deep sleep on PIR motion (GPIO 13) or scheduled RTC wakeups +* Measures ambient lux via I2C VEML7700 sensor to prevent activating porch lights during daylight +* Drives high-voltage porch security light relay (GPIO 12) upon valid night-time motion +* Transmits motion alerts, battery voltage (GPIO 34), and status via SX127x SPI LoRa radio + +### Bill of Materials +| Part | Quantity | Purpose | +| :--- | :---: | :--- | +| ESP32 Development Board | 1 | Main MCU utilizing RTC memory and deep sleep wake pins | +| SX127x LoRa Module | 1 | Long-range 915MHz SPI radio transceiver (CS GPIO 5, RST GPIO 14, DIO0 GPIO 26) | +| PIR Motion Sensor | 1 | Infrared motion detection connected to RTC_GPIO14 / GPIO 13 | +| VEML7700 Lux Sensor | 1 | High-accuracy I2C ambient light sensor for daylight lockout | +| Relay Module | 1 | Solid-state or mechanical relay on GPIO 12 switching 12V/240V porch light | +| Voltage Divider Sensor | 1 | Resistor divider on GPIO 34 for monitoring battery pack voltage | + +### How it works +The system remains in deep sleep drawing microamps until the PIR sensor triggers RTC_GPIO14 or the RTC timer expires. Upon waking, it reads ambient light from the VEML7700 sensor; if lux is below `MAX_LUX_THRESHOLD` (50 lux) and battery voltage is above `minimumPower` (11.0V), it energizes relay GPIO 12 for `lightOnDuration` (30s) and broadcasts a LoRa packet. + +### What broke +* False wakeups caused by floating inputs on the PIR signal line during deep sleep were resolved by enabling internal RTC pull-down resistors on GPIO 13 before calling `esp_deep_sleep_start()`. + +### Links +* Gitea Repository: [sam/Porch_Security_Light](https://gitea.lab.audasmedia.com.au/sam/Porch_Security_Light) diff --git a/docs/images/README.md b/docs/images/README.md new file mode 100644 index 0000000..7a26e39 --- /dev/null +++ b/docs/images/README.md @@ -0,0 +1,5 @@ +# Hardware Images Manifest + +`hero.png` — Transparent background cut-out of the ESP32 security light controller, SX127x LoRa transceiver, PIR motion sensor, and VEML7700 light sensor for theme-agnostic README rendering. + +`hero-site.webp` — Portfolio dark-canvas render (1600×1000px, `#0b0d10` canvas with left gradient fade and `#8ecbff` rim light) for the portfolio resume site. diff --git a/docs/images/hero-site.webp b/docs/images/hero-site.webp new file mode 100644 index 0000000000000000000000000000000000000000..ac9b721d51210a703f199eaf71684b99d44e7d7e GIT binary patch literal 11778 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 literal 0 HcmV?d00001 diff --git a/docs/images/hero.png b/docs/images/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..a7ce41b0d9c3aba150a4b1569103649c9a7d4ec0 GIT binary patch literal 7325 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 X{X@r|PK+Pg0~lQ6x_Xi7?fd@$OgGY= literal 0 HcmV?d00001