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...