Thought I had a code problem but it works great.
Yes, for this project I only have a couple things to save but they are on the ESP32-Cam module so I have to trigger the save and wait for a response. Should be a blink for the user but better to be sure and it's nice to have that control.
The code is pretty simple too:
// Pin Assignments
byte pwr_btn = 10;
byte main_pwr = 11; // Must remain high to keep main power
// Power button variables
bool pwr_btn_pressed; // Power button state
uint32_t pwr_btn_prev_time = 0; // Last time power button was checked
uint16_t pwr_btn_timer = 100; // Delay between checking
uint16_t shutdown_count = 0; // Shutdown counter for power button hold
uint16_t shutdown_window = 1000; // Hold time necessary to shutdown
// Timed event variables
uint32_t time_now = 0; // Current time
bool new_state; // Current state reuse for each timed event
// Forward declarations
void power_off();
void setup() {
// Hold main power on
pinMode(main_pwr, OUTPUT);
digitalWrite(main_pwr, HIGH);
// Set up power button and check state
pinMode(pwr_btn, INPUT_PULLUP);
pwr_btn_pressed = digitalRead(pwr_btn) == LOW;
while (pwr_btn_pressed) {
// One time start up code if the button is held
pwr_btn_pressed = digitalRead(pwr_btn) == LOW;
}
}
void loop() {
// Check power button
time_now = millis();
if (time_now - pwr_btn_prev_time >= pwr_btn_timer) {
new_state = digitalRead(pwr_btn) == LOW;
shutdown_count = pwr_btn_pressed && new_state ? shutdown_count += pwr_btn_timer : 0;
if (shutdown_count >= shutdown_window) {
// Saves
power_off();
}
pwr_btn_pressed = new_state;
pwr_btn_prev_time = time_now; // Advance timer
}
// next timed event
}
void power_off() {
digitalWrite(main_pwr, LOW);
}
Sketch uses 1122 bytes (3%) of program storage space. Maximum is 32256 bytes.
Global variables use 21 bytes (1%) of dynamic memory, leaving 2027 bytes for local variables. Maximum is 2048 bytes.