Hardware Modification
Image Added
Image Added
Stage | idel Power | Feature lost by modification |
---|
Initial | 0.121W120W | - |
w/o 78M05 | 0.096W | Option to use 6v-12v external power |
w/o Power LED | 0.081W | Power indicator |
w/o diods diods and LED | 0.072W | Extra protection from mess with -/+ |
software sleep | 0.002W | Simple code |
Software optimization
| Image Added
| Image Added
|
---|
| 0.072W | 0.120W |
Code with cpu_sleepuse sleep_cpu() | 0.002W | 0.041W |
Blinking Led
Code Block |
---|
|
void setup()
{
pinMode(1, OUTPUT);
}
void loop()
{
digitalWrite(1, HIGH);
delay(1000);
digitalWrite(1, LOW);
delay(1000);
} |
Low Power Blinking LED Example
Code Block |
---|
|
#include <avr/wdt.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#define adc_disable() (ADCSRA &= ~(1<<ADEN)) // disable ADC (before power-off)
#define adc_enable() (ADCSRA |= (1<<ADEN)) // re-enable ADC
void setup()
{
// Power Saving setup
for (byte i = 0; i < 6; i++) {
pinMode(i, INPUT); // Set all ports as INPUT to save energy
digitalWrite (i, LOW); // Might help if ther is some sensors on pins? No impact in this demo
}
adc_disable(); // Disable Analog-to-Digital Converter
wdt_reset(); // Watchdog reset
wdt_enable(WDTO_1S); // Watchdog enable Options: 15MS, 30MS, 60MS, 120MS, 250MS, 500MS, 1S, 2S, 4S, 8S
WDTCR |= _BV(WDIE); // Interrupts watchdog enable
sei(); // enable interrupts
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Sleep Mode: max
}
void loop()
{
//Set the LED pins to HIGH. This gives power to the LED and turns it on
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
digitalWrite(0, HIGH);
digitalWrite(1, HIGH);
sleep_enable();
sleep_cpu();
//Set the LED pins to LOW. This turns it off
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
digitalWrite(0, LOW);
digitalWrite(1, LOW);
//Wait for a second
sleep_enable();
sleep_cpu();
}
ISR (WDT_vect) {
WDTCR |= _BV(WDIE); // разрешаем прерывания по ватчдогу. Иначе будет реcет.
} |
Source: https://alexgyver.ru/pump-sleep/
...