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