Novinky: Pridal som novú sekciu na webe - Turistika
Sitepoint logo

Zapnutie a vypnutie Arduina pomocou jedného tlačítka

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!MIC5219-ENJedna 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.arduinoprominiPreč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:schema-on-off2Sché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!


Categories:

Tags:


Comments

2 odpovede na na “Zapnutie a vypnutie Arduina pomocou jedného tlačítka”

  1. Martin Otradovec Avatar
    Martin Otradovec

    Dobrý den

    Moc děkuji za inspiraci

    přesně tuto úpravu arduina bych potřeboval použít pro řízení teplovaodního krbu.

    Při zapnutí se ni automaticky otevřou klapky vzduchu, při vypnutí se zavřou klapky vzduchu a vypne čerpadlo.

    Rád bych požádal o pomoc (radu) jaké změny na desce jste udělal. Z laického pohledu odhaduji doplnění rezistorů R7, R8, R10, dvojité diody D2 atlačítka S1.

    K dispozici mám momentálně desku NanoV3 a ProMini

    Děkuji za pomoc

    Martin

    1. tomXX Avatar

      Zdravím, áno stačí doplniť R7, R8, R10 a D2 + tlačítko. Zapojené som to mal ale na vlastnej doske – arduino.sk/viewtopic.php?f=4&t=130 , ku ProMini to bude treba doplniť externe a prerušiť/prepojiť spoje na EN pin LDO.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *