Na arduinu nano se spotřeba sníží asi 3x na 3.2mA.
Kód: Vybrat vše
// potřebné knihovny
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
#define LED_PIN (11) // pojmenování pinu 13
// zde se bude ukládat zda přišel impuls z watchdog timeru
// hodnota 1 simuluje impuls po zapnutí, aby jsme nečekali
volatile int impuls_z_wdt=1;
// zde se ukládají impulsy
volatile int citac_impulsu= 2;
// zde nastavíme potřebný počet impulsů
// podle nastavení WDT viz níže je jeden impuls 8 sekund
volatile int impulsu_ke_spusteni = 2;
/* klíčové slovo volatile říká kompilítoru jak má zacházet z proměnou
načte proměné z paměti RAM a ne z paměťového registru. Vzhledem k
spánkovému režimu budou tyto hodnoty určitě poté přesné.
*/
// impuls z WATCHDOG TIMERU /////////////////
ISR(WDT_vect)
{
//když je proměnná impuls_z_wdt na 0
if(impuls_z_wdt == 0)
{
// zapiš do proměnné 1
impuls_z_wdt=1;
}
}
void enterSleep(void)
{
//nastavení nejúspornějšího módu
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
// spánkový režim je povolený
sleep_enable();
// spuštění režimu spánku
sleep_mode();
// tady bude program pokračovat když se probudí
// spánek zakázán
sleep_disable();
//znovu zapojení všech funkcí
power_all_enable();
}
void setup()
{
//nastaví pin 13 jako výstup
pinMode(LED_PIN,OUTPUT);
// nastavení WATCHDOG TIMERU
MCUSR &= ~(1<<WDRF); // neřešte
WDTCSR |= (1<<WDCE) | (1<<WDE); // neřešte
// nastavení času impulsu
WDTCSR = 1<<WDP0 | 1<<WDP3; // 8 sekund, WDTCSR = B0110 --> 1 sekunda
WDTCSR |= _BV(WDIE); //neřešte
}
void loop()
{
//když je impuls z WATCHDOG TIMERU a zároveň i potřebný jejich počet
if ((impuls_z_wdt == 1) & (impulsu_ke_spusteni == citac_impulsu))
{
///////////////////////////////////////////////////////////////
// zde je ukázkový kód, upravte si sami podle potřeby
digitalWrite(LED_PIN, HIGH);
delay(3000);
digitalWrite(LED_PIN, LOW);
// konec ukázkového kódu, který se v nastaveném intervalu
// bude provádět
//////////////////////////////////////////////////////////////
citac_impulsu = 0;// vynuluj čítač
impuls_z_wdt = 0; // vynuluj impuls
enterSleep();// znovu do spánku
}
else
{
enterSleep();//znovu do spánku
}
citac_impulsu++; // inpuls se přičte i když nic neproběhlo
}