Skip to content

Commit 90ec604

Browse files
author
Codex Agent
committed
Add battery presence LEDs
1 parent f73590c commit 90ec604

4 files changed

Lines changed: 36 additions & 0 deletions

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ HeatControl is a dual-zone heating control system for drysuit diving, based on E
4646
- `GPIO1` -> ADC voltage input 2 (`ADC_PIN_2`)
4747
- `GPIO3` -> MOSFET 1 NTC ADC input (`ADC_PIN_NTC_MOSFET_1`)
4848
- `GPIO4` -> MOSFET 2 NTC ADC input (`ADC_PIN_NTC_MOSFET_2`)
49+
- `GPIO8` -> Battery 1 presence LED (`BATTERY_LED_PIN_1`)
50+
- `GPIO9` -> Battery 2 presence LED (`BATTERY_LED_PIN_2`)
4951
- `GPIO20`/`GPIO21` -> UART0 reserved (left free by firmware)
5052
- `GPIO18`/`GPIO19` -> Native USB reserved (left free by firmware)
5153
- `GPIO2`/`GPIO8`/`GPIO9` -> Strapping pins; do not use for fixed voltage-divider inputs

src/app_state.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ bool lastHeater1State = false;
1616
bool lastHeater2State = false;
1717
bool lastSignalPinState = false;
1818
bool lastInputPinState = false;
19+
bool lastBatteryLed1State = false;
20+
bool lastBatteryLed2State = false;
1921
bool manualHeater1Enabled = true;
2022
bool manualHeater2Enabled = true;
2123
bool battery1Off = false;

src/app_state.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ constexpr int ADC_PIN_NTC_MOSFET_2 = 4;
5050
constexpr int ONE_WIRE_BUS = 7;
5151
constexpr int AP_MAX_CLIENTS = 4;
5252

53+
// Battery presence LEDs (active HIGH).
54+
// Note: GPIO8/GPIO9 are ESP32-C3 strapping pins. Using them as OUTPUT is usually fine,
55+
// but make sure the external LED circuit does not pull them to a boot-incorrect level.
56+
constexpr int BATTERY_LED_PIN_1 = 8;
57+
constexpr int BATTERY_LED_PIN_2 = 9;
58+
5359
// Keep UART0 free on final PCB for external flashing/debug adapter.
5460
constexpr int UART0_RX_RESERVED_PIN = 20;
5561
constexpr int UART0_TX_RESERVED_PIN = 21;
@@ -99,6 +105,8 @@ extern bool lastHeater1State;
99105
extern bool lastHeater2State;
100106
extern bool lastSignalPinState;
101107
extern bool lastInputPinState;
108+
extern bool lastBatteryLed1State;
109+
extern bool lastBatteryLed2State;
102110

103111
extern bool manualHeater1Enabled;
104112
extern bool manualHeater2Enabled;

src/main.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,14 @@ void setup() {
220220
pinMode(SSR_PIN_2, OUTPUT);
221221
pinMode(INPUT_PIN, INPUT_PULLDOWN);
222222
pinMode(SIGNAL_PIN, OUTPUT);
223+
pinMode(BATTERY_LED_PIN_1, OUTPUT);
224+
pinMode(BATTERY_LED_PIN_2, OUTPUT);
223225

224226
digitalWrite(SSR_PIN_1, LOW);
225227
digitalWrite(SSR_PIN_2, LOW);
226228
digitalWrite(SIGNAL_PIN, HIGH);
229+
digitalWrite(BATTERY_LED_PIN_1, LOW);
230+
digitalWrite(BATTERY_LED_PIN_2, LOW);
227231

228232
// ADC setup (ESP32-C3): 12-bit readings, extended input range.
229233
analogReadResolution(12);
@@ -237,6 +241,8 @@ void setup() {
237241
lastHeater2State = (digitalRead(SSR_PIN_2) == HIGH);
238242
lastSignalPinState = (digitalRead(SIGNAL_PIN) == LOW);
239243
lastInputPinState = (digitalRead(INPUT_PIN) == HIGH);
244+
lastBatteryLed1State = (digitalRead(BATTERY_LED_PIN_1) == HIGH);
245+
lastBatteryLed2State = (digitalRead(BATTERY_LED_PIN_2) == HIGH);
240246

241247
const uint8_t savedBootMode = getAndClearBootMode();
242248
if (savedBootMode == BOOT_MODE_NORMAL) {
@@ -428,6 +434,24 @@ void loop() {
428434
const bool batt2OffNow = batt2Sample.offNow;
429435
const bool batt2OnNow = batt2Sample.onNow;
430436

437+
// Battery presence LEDs: ON when battery is stably detected as ON.
438+
// Avoid flicker in the hysteresis band by only updating on stable ON/OFF.
439+
if (batt1OnNow && !lastBatteryLed1State) {
440+
lastBatteryLed1State = true;
441+
digitalWrite(BATTERY_LED_PIN_1, HIGH);
442+
} else if (batt1OffNow && lastBatteryLed1State) {
443+
lastBatteryLed1State = false;
444+
digitalWrite(BATTERY_LED_PIN_1, LOW);
445+
}
446+
447+
if (batt2OnNow && !lastBatteryLed2State) {
448+
lastBatteryLed2State = true;
449+
digitalWrite(BATTERY_LED_PIN_2, HIGH);
450+
} else if (batt2OffNow && lastBatteryLed2State) {
451+
lastBatteryLed2State = false;
452+
digitalWrite(BATTERY_LED_PIN_2, LOW);
453+
}
454+
431455
// Persist last known battery presence mask (bit0 = battery1, bit1 = battery2)
432456
// only when it changes, to avoid unnecessary EEPROM wear.
433457
uint8_t currentMask = 0;

0 commit comments

Comments
 (0)