Koukám, že než jsem sesmolil odpověď, tak mě pár lidí předběhlo...
Takže:
Program můžeš psát v jakémkoli jazyce, ale musí pro něj existovat překladač. Arduino IDE používá jazyk wiring, což je rozšířené Cčko a doporučuji neexperimentovat a používat ten.
Jak už zmínil mpik, znalost toho, jak MCU funguje je výhoda, ale tvůj jednoduchý projekt by měl být zvládnutelný i bez toho.
Li-Ionky z NB jsou super, mají dostatečnou kapacitu, vhodné napětí a ani se sami moc nevybíjí. Na aliexpresu lze levně sehnat nabíjecí moduly (https://www.aliexpre...2243680214.html). Mám je otestované a fungují. Baterky by ještě měli být vybaveny ochranou proti nadměrnému vybití (https://www.aliexpre...2824790937.html).
Zkusil jsem i malý náčrt toho, jak by program mohl vypadat a otestoal ho a funguje:
// Podle http://arduino8.webnode.cz/news/lekce-27-adruino-a-napajeni-z-baterie-aneb-jak-uspat-arduino/
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
//////////////////// ZDE JE MOZNE UPRAVIT PROGRAM ///////////////////////////////////
// Cislo pinu na kterem je dioda
#define LED_PIN 13
// Pocet impulsu, po kterych dojde k bliknuti led
// Delka jednoho ipulsu je cca 8 s
// Vysledny pocet je treba snizit o jedna
// Pro 30 minut to tak bude 224
// Nevhodne na presne casy
#define NUMBER_OF_IMPULSES 224
// Doby sviceni led v ms
// Tato doba se zapocte do zminenych 8 s
// Lze to osetrit, ale je to asi zbytecne...
#define LIGHT_TIME 3000
//////////////////////////////////////////////////////////////////////////////////////
// Informace, zda prisel impuls z WDT = watchdog timer
volatile bool wdt_impuls = true; // true zajisti bliknuti hned po spusteni
// Citac impulsu
volatile int impuls_counter = NUMBER_OF_IMPULSES; // Opet kvuli bliknuti hned po spusteni, jinak nula
// Impuls z WDT
ISR( WDT_vect ) {
// Prisel impuls z WDT -> ulozim si ho do promenne
if( ! wdt_impuls ) {
wdt_impuls = true;
}
}
// Uspani MCU
void enterSleep( void ) {
// Nastaveni nejuspornejsiho modu
set_sleep_mode( SLEEP_MODE_PWR_DOWN );
// Spankovy rezim je povoleny
sleep_enable();
// Spusteni rezimu spanku
sleep_mode();
// Tady bude program pokracovat kdyz se probudi
// Ukonceni spanku
sleep_disable();
// Obnoveni vsech funkci MCU
// Zde je mozna dalsi uspora, pokud by se probudili jen potrebne komponenty
power_all_enable();
}
// Prvotni inicializace, tento kod se spusti jenom jednou
void setup() {
// Nastavi LED_PIN jako vystup
pinMode( LED_PIN,OUTPUT );
// Nastaveni WDT
MCUSR &= ~( 1 << WDRF );
WDTCSR |= ( 1 << WDCE ) | ( 1 << WDE );
// Nastaveni casu impulsu
WDTCSR = 1 << WDP0 | 1 << WDP3;
WDTCSR |= _BV( WDIE );
}
// Tato cast kod bezi v neustale smycce
void loop() {
// Prisel impuls z WDT a zaroven uz probehl potrebny pocet impulsu
if ( wdt_impuls && ( impuls_counter == NUMBER_OF_IMPULSES ) ) {
// Privedu logickou 1 (napeti) na LED_PIN
digitalWrite( LED_PIN, HIGH );
// Pockam LIGHT_TIME milisekund
delay( LIGHT_TIME );
// Privedu logickou 0 (zem) na LED_PIN
digitalWrite( LED_PIN, LOW );
// Vynuluji pomocne promenne
impuls_counter = 0;
wdt_impuls = false;
// Uspim MCU na 8 s
enterSleep();
}
// Jeste neprobehl dostatecny pocet probuzeni
else {
// Zaznamenam si impuls
++impuls_counter;
wdt_impuls = false;
// Znovu na 8s uspim MCU
enterSleep();
}
}
A na závěr, opravdu to chce provést rozumně, páč půlhodiny je dost dlouhá doba a vezmu-li v potaz, že 1 záblesk nemusí stačit, tak to už je hodina, co sedím ve tmě a v zimě v lese a asi bych se na keš vyprdnul...