Potřeboval jsem do dílny stopky, schopné měřit kolik času strávím prací na různých projektech. Tak jsem si je prostě postavil a protože by se mohlo stát že by si je někdo chtěl postavit také (a nebo že je jednou budu muset opravit) tak jsem dokumentaci zveřejnil. V textu si krom popisu dovolím vypíchnout pár zajímavostí.
Jádrem stopek je mikrokontrolér Atmega32A, zvolil jsem ho protože jsem se potřeboval zbavit starých zásob a protože zvládne budit "šuplíkový" hodinový (32.768kHz) krystal (na rozdíl od nových AVR kde je potřeba vybrat "ten správný"). Atmega32A dle datasheetu správně pracuje od napětí 2.7V, ale raději jsem experimentálně ověřil zda by mu nestačilo i méně. V triviální aplikaci s clockem 1MHz (a bez zapnuté funkce Brown-Out) pracoval i při 1.7V. Netuším zda při takovém napětí pracují správně i analogové periferie a neověřoval jsem to, protože pro mou aplikaci stačilo aby byl MCU provozuschopný s napětím 2.5V.
Pro zobrazování jsem zvolil grafické LCD JLX12864G s budičem UC1701 protože má provozní odběr okolo 250uA, má vhodné rozměry (cca 4x3cm) a zvládne zobrazovat dostatek informací. Displej správně pracuje od napětí přibližně 2.55V. Displej napájím přímo z pinu mikrokontroléru, díky čemuž jej můžu v době nečinnosti kompletně vypnout.
Jako zdroj napájení jsem zvolil dvojici AA článků, protože jsou všude zadarmo (elektroodpad v supermarketech). Plně nabité dávají napětí mezi 3.2V až 3.3V. Kritického napětí (2.55V/2=1.28V) dosáhnou po spotřebování více jak 70% uložené energie (hodně záleží na tom jak ji počítáte), takže výtěžnost energie z baterií je slušná. Odhadovaná výdrž s dvojicí AA článků o kapacitě 3Ah je 500h chodu (běžící stopky a displej). Ve vypnutém stavu (odběr cca 15uA) je výdrž větší než shelf-life baterie. Aplikace měří napětí článků a signalizuje nízkou úroveň napětí. Navíc v takové situaci deaktivuje funkci podsvícení a indikuje napětí každého článku aby bylo patrné který z nich je případně potřeba vyměnit.
Konstrukci jsem sestavil na "bastldesce" (viz foto). Z modulu displeje jsem vypájel EEPROM (se znakovou sadou), protože ji nepoužívám a baterky ji tedy nemusí živit, ale její spotřeba je nejspíš zanedbatelná. K programování používám JTAG rozhraní a protože MCU přechází do režimu spánku (a JTAG deaktivuje) tak je rozumné připojovat debugger s propojeným TRST a SRST vývodem aby mohl MCU probrat ze spánku (a povolit v Atmel studiu ovládat RST).
Funkce stopek je triviální. Stiskem tlačítek 1 až 4 se spustí odpovídající stopky a začnou měřit čas. Pokud v tom okamžiku běží jiné stopky tak se zastaví. Běžící stopky se indikují na displeji symbolem trojúhelníku. Stiskem tlačítka STOP se stopky zastaví. Opakovaným stiskem tlačítka stop se stopky vypnou (vypne se displej). Stiskem libovolného tlačítka se stopky opět zapnou. Stiskem tlačítka RESET se se u aktuálně běžících stopek zobrazí symbol "rst?" a druhým stiskem tlačítka RESET se dané stopky vynulují (eliminuje se možnost vynulování stopek "omylem"). Při všech těchto událostech (krom vypnutí stopek) se na 4s rozsvítí podsvícení (pokud je napětí baterie dostatečné).
Aby uživatel nepřišel o naměřené hodnoty při výměně baterií tak se ukládají do EEPROM a to při stisku jakéhokoli tlačítka a při poklesu napětí pod kritickou mez (viz dále). Každých 10 sekund aplikace změří napětí obou článků. Pokud napětí baterie pokleslo pod 2.66V, začne na displeji zobrazovat indikátor "LowBat" a napětí každého z článků. Navíc vypne funkci podsvícení. Pokud napětí klesne pod 2.59V, stopky se automaticky vypnou, protože hrozí že by displej nezobrazoval správně.
Čas je udržován "hodinovým" oscilátorem z asynchronního čítače/časovače 2, který běží i když jsou stopky vypnuté a periodicky probouzí MCU aby zkontrolovalo stav tlačítek. V tomto režimu má zařízení spotřebu přibližně 15uA. Připojením diod ze všech tlačítek na INT pin by MCU mohl hodinový oscilátor vypínat a spotřeba by mohla klesnou o řád. Vzhledem k tomu že takový proud ale AA články zatěžuje zanedbatelně, není třeba to řešit.
Občas jsem potřeboval přidat nebo ubrat čas. Přidal jsem tedy dvě tlačítka která slouží k přičtení 10 minut (PD2) a ubrání 10 minut (PD1). Tato funkce je implementována ve firmwaru v2 (m32_multistopky_v2.rar).
Home
| V1.01 31.7.2022 /
| By Michal Dudka (m.dudka@seznam.cz) /