Určite to poznáte zo spotrebnej elektroniky a rôznych hračiek, gadgetov. Celé zariadenia má len jedno tlačítko, ktoré slúži na zapnutie a vypnutie zároveň. Ako na to? Určite vás napadne, že dám tlačítko na jeden vstup a budem kontrolovať jeho stav. To má vážnu trhlinu – zariadnie by muselo byť neustále zapnuté… Šikovnejšieho by napadlo tlačítko zavesiť na pin ktorý má HW prerušenie (interrupt) a namiesto fyzického vypnutia by sa zariadenie uviedlo do spánku (sleep mode) a tlačítkom by sa prebudilo. Áno, aj to je cesta, dá sa dostať na celkom nízku spotrebu, cca 500uA. Ak chceme ísť ešte výrazne nižšie a vyhnúť sa sleep režimu – čítajte ďalej!Jedna z ciest vedie cez lineárny napäťový regulátor s ovládacím vývodom (LDO with ENable shutdown). Samotné Arduino ho obsahuje, je to 5-vývodová SMD súčiastka v puzdre SOT23-5, označenie MIC5219-5.0 (datasheet), pre nás dôležitý vývod ENable je však napevno pripojený na RAW pin (neregulovaný vstup napájania), takže by bola nutná modifikácia plošného spoja (čo som samozrejme skúšobne aj urobil). Poznámka – UNO ho má len na 3.3V vetve, MiniPro ho má ako jediný regulátor.Prečo sa ale o to snažiť? Kľudový odber MIC5219 je len 50-100nA, čo je 10000x menej ako spiaci režim procesora a nemusíme hlavne riešiť odpájanie ostatných pripojených obvodov (lebo štandratne by sme uspali len procesor a všetko ostatné by bolo ďalej napájané!). Takže schéma, program a vysvetlenie zapojenia:Schému som použil z jedného môjho projektu, takže nebudú sedieť čísla pinov, ale princíp je zachovaný. Modelová situácia – zariadenie je vypnuté a stlačíme+držíme tlačítko – EN vývod IC4 je zatiaľ uzemnený cez R7 (pull-down) a cez ľavú časť dvojdiódy D2 prúd pretečie rovno na EN vstup IC4, čím celé zariadenie zapne. Potom musí softvér zabezpečiť prečítanie stavu tlačítka (pin PC3) pomocou R8 (pull-down) a R10 – a následne nastavením pinu PD2 na vysokú úroveň potečie prúd cez pravú časť D2 do EN pinu, takže zariadenie zostane zapnuté.
Druhá časť logiky, zariadenie je zapnuté a chceme ho vypnúť. R8 (pull-down) zabezpečuje LOW úroveň na pine PC3, ak stlačíme tlačítko, privedieme RAW napätie (HIGH) na PC3 cez R10, softvér to zase musí ošetriť a následne nastaví LOW na PD2, diódou prestane tiecť prúd a R7 (pull-down) privedie LOW na pin EN, čím celé zariadenie vypne.
Pre lepšie pochopenie komentovaný kód:
unsigned long btn_press; boolean btn_hold; void setup() { pinMode(2, OUTPUT); //LDO EN pinMode(3, INPUT); //tlacitko pinMode(8, OUTPUT); //LED1 pinMode(9, OUTPUT); //LED2 while(digitalRead(3) == HIGH){ //pokial drzime tlacitko... if (!btn_hold){ btn_press = millis(); //teraz sme ho zacali drzat btn_hold = true; digitalWrite(8, HIGH); //zapneme cervenu LED } if (millis() > btn_press + 2000){ //ak sme drzali viac ako 2 sekundy... digitalWrite(8, LOW); //zhasneme cervenu LED digitalWrite(9, HIGH); //zazneme zelenu LED btn_hold = false; digitalWrite(2, HIGH); //zapneme LDO delay(3000); } } } void loop() { btn_hold = false; while(digitalRead(3) == HIGH){ //pokial drzime tlacitko... digitalWrite(9, LOW); //zhasneme zelenu LED if (!btn_hold){ btn_press = millis(); btn_hold = true; digitalWrite(8, HIGH); //zazneme cervenu LED } if (millis() > btn_press + 2000){ //ak sme drzali viac ako 2 sekundy... digitalWrite(8, LOW); //zhasneme cervenu LED digitalWrite(9, HIGH); //zazneme zelenu LED delay(5000); //pockame nech uzivatel pusti tlacitko, ak nie, tak mu treba :) digitalWrite(2, LOW); //vypneme LDO + cele zariadnie } } digitalWrite(8, HIGH); //blikame ako o zivot delay(50); digitalWrite(8, LOW); delay(50); digitalWrite(9, HIGH); delay(50); digitalWrite(9, LOW); delay(50); }
Kód slúži len na ukážku, vo finálnom kóde treba pridať ešte jednu boolean premennú a môžme vypustiť delay pri zapínaní, to ale nie je pre pochopenie funkcie potrebné. No a na záver videoukážka ako to funguje, vrátane nemerateľného odberu. Ak máte otázky, šup do komentárov pod článok!
Pridaj komentár