4.6 KiB
Arduino Powerbank Keep-Alive + Daily Reset Counter
This project uses an Arduino, a DS3231 real-time clock (RTC), buttons, LEDs, and a resistor to:
- Keep a USB power bank awake by periodically pulsing a load on a digital pin.
- Control 4 LEDs with 4 buttons (toggle on/off).
- Remember LED states across power loss using EEPROM.
- Automatically reset all LEDs every day at 12:00 PM.
Features
- Silent keep-alive: Periodic pulse on a resistor connected to pin 6 so power banks don’t auto-shutoff.
- 4 independent channels: 4 buttons control 4 LEDs (via a mapping array), each toggling its own state.
- Persistent state: LED on/off states are stored in EEPROM and restored on startup.
- Daily auto reset: At exactly 12:00:00 PM (noon), all LED states are cleared and saved as off.
Hardware Requirements
- Arduino (e.g., Uno, Nano, Pro Mini)
- DS3231 RTC module (connected via I²C: SDA/SCL)
- 4 momentary push buttons
- 4 LEDs with appropriate current-limiting resistors
- 1 additional resistor as keep-alive load (between pin 6 and GND)
- USB power bank (optional but typical use case)
- Jumper wires and breadboard or PCB
Pinout
- Buttons (with internal pullups):
- Button 1 → pin 2
- Button 2 → pin 3
- Button 3 → pin 4
- Button 4 → pin 5
- LEDs:
- LED 1 → pin 8
- LED 2 → pin 9
- LED 3 → pin 10
- LED 4 → pin 11
- Keep-alive resistor:
- One side of resistor → pin 6
- Other side of resistor → GND
- RTC (DS3231):
- SDA → Arduino SDA (A4 on Uno)
- SCL → Arduino SCL (A5 on Uno)
- VCC → 5 V
- GND → GND
- Onboard LED (pin 13) is explicitly disabled.
Libraries Used
Install the following via the Arduino Library Manager:
- RTClib (by Adafruit)
- EEPROM (included with Arduino core)
- Wire (included with Arduino core)
Include them in your sketch:
#include <Wire.h>
#include <RTClib.h>
#include <EEPROM.h>
How It Works
- Setup phase
- Initializes the DS3231 RTC.
- Sets pin 6 LOW and disables the onboard LED on pin 13.
- Configures button pins with
INPUT_PULLUP. - Configures LED pins as outputs and restores each LED state from EEPROM.
- Keep-alive pulses
- Every
pulseIntervalmilliseconds, pin 6 goes HIGH forpulseDurationmilliseconds, then returns LOW. - Default values in the code:
pulseDuration = 800pulseInterval = 10000
- Adjust these if your power bank requires a different pattern.
- Every
- Button handling
- Buttons are active LOW (because of
INPUT_PULLUP). - On press:
- Debounces with a 50 ms delay.
- Uses
ledMap[]to map button index to a specific LED index. - Toggles that LED’s state, writes it to EEPROM, and waits for the button to be released.
- Buttons are active LOW (because of
Example mapping from code:
const int ledMap[] = {3, 1, 0, 2};
This means:
- Button on pin 2 controls LED index 3 (pin 11)
- Button on pin 3 controls LED index 1 (pin 9)
- Button on pin 4 controls LED index 0 (pin 8)
- Button on pin 5 controls LED index 2 (pin 10)
4. Daily reset at 12:00 PM
- Reads current time from the DS3231 each loop.
- When time is exactly 12:00:00:
- If reset not yet done today, all LEDs are turned OFF and EEPROM is updated.
- resetPerformed flag prevents multiple resets within the same second.
- When time is no longer 12:00:00, resetPerformed resets to false for the next day.
EEPROM Usage
- EEPROM addresses 0–3 store the 4 LED states (
true/falseas bytes 1/0). - The code uses
EEPROM.update(address, value)to avoid unnecessary writes.
Setup Instructions
- Build the circuit according to the pinout.
- Connect the DS3231 and set the correct time once (e.g., using an example sketch from RTClib).
- Upload this sketch to the Arduino.
- Power the Arduino from your USB power bank.
- Press buttons to toggle LEDs; states will persist after power loss.
- At 12:00 PM every day, all LEDs will automatically reset to OFF.
Configuration
You can tweak these constants:
const int pulseDuration = 800; // ms HIGH time
const int pulseInterval = 10000; // ms between pulses
- Increase
pulseDurationif the power bank needs a stronger signal. - Decrease
pulseIntervalif it shuts off too quickly.
Example Use Case
Use this as a simple daily habit tracker powered by a USB power bank:
- Each LED represents a daily task (e.g., exercise, reading).
- Press the corresponding button when done; LED turns on and stays on.
- At noon, all LEDs reset, ready for the next day, while the keep-alive pulse keeps the power bank from sleeping.