Zápisník experimentátora
Hierarchy: WS2812
V treťom článku sa pokúsime ovládať naše hodiny pomocou tlačidla. Aby nebola problematika príliš zložitá, rozdelil som tému o tlačidlách do dvoch samostatných článkov. V tomto článku sa budeme venovať len jedinému tlačidlu a budeme pomocou neho zapínať a vypínať milisekundovú ručičku.
Voči predchádzajúcej schéme sa zmenilo to, že pribudlo jedno tlačidlo. Nie je ku nemu potrebný žiaden rezistor, pretože budeme používať interný pull-up rezistor. Programovo budeme ošetrovať zákmity tlačidiel, čím zabránime nechcenému viacnásobnému stlačeniu tlačidla a vzniku záhadných reakcií programu.
Aby sa dal program ľahšie nastavovať, navrhneme si v ňom pomocnú štruktúru, ktorá bude obsahovať všetky premenné, ktorými možno v programe niečo nastavovať. Je rozumnejšie použiť štruktúru, pretože ako budú premenné pribúdať, stával by sa program čoraz menej prehľadným. V našom prípade bude štruktúra Configuration obsahovať iba jedinú premennú, ale v už v nasledujúcej verzii programu uvidíte, ako takéto zoskupovanie premenných výrazne pomôže s prehľadnosťou.
Na príklade vidíte, že Configuration obsahuje jedinú premennú show_millis, pomocou ktorej ovládame zobrazenie ručičky milisekúnd. C++ nám umožňuje použiť konštruktor, v ktorom nastavíme implicitné hodnoty každej premennej. A pretože definícia štruktúry nám definuje iba predpis, ako sa má s danými dátami nakladať, potrebujeme ešte vytvoriť jeden globálny objekt pomocou príkazu Configuration cfg. V programe potom meníme vykresľovanie hodín pomocou podmienky, v ktorej sa pýtame na aktuálnu hodnotu nastavenia. To vidíte použité v podmienke if(cfg.show_millis). Ak má hodnotu true, bude sa vykresľovať. Ak má hodnotu false, bude sa celý blok ignorovať.
// show milliseconds
#define SHOWMILLIS 0
///
/// Program configuration
///
struct Configuration
{
bool show_millis;
Configuration() : show_millis(SHOWMILLIS) {}
};
Configuration cfg;
///
/// Set all colors
///
void NeoClock::Draw()
{
...
if(cfg.show_millis)
{
AddColor((milli+MOVE) % CNT, milli_color);
AddColor((milli+MOVE-1) % CNT, milli_color1);
AddColor((milli+MOVE-2) % CNT, milli_color2);
}
strip.show();
}
Tlačidlá sa ovládajú pomocou knižnice na ošetrenie zákmitov tlačidiel. Preto je potrebné si ju stiahnuť a nainštalovať. V programe ju použijete príkazom #include <button.h>. Definujeme si pin, na ktorom bude tlačidlo reagovať a vytvoríme si objekt b1 s nasledovnými parametrami:
Použitie interného pull-up rezistora zabezpečuje, že je jedna strana tlačidla trvale pripojená na +5 V. Pri jeho stlačení sa prepojí Gnd a na digitálnom pine sa prečíta logická 0. A vďaka internému rezistoru nemusíme do obvodu pridávať ďalšiu súčiastku.
Tlačidlo kontrolujeme vo funkcii loop. Reakcia na stlačenie tlačidla je vo funkcii ButtonAction. Je to negácia premennej cfg.show_millis.
#include <button.h>
// button pin
#define BUTTONPIN 2
// button, 25 ms debounce, no repeat, internal pull_up
Button b1(BUTTONPIN,ButtonAction,25,0,true);
///
/// Main loop
///
void loop()
{
...
// buttons
b1.Read();
// clock
clock.Update();
clock.Draw();
}
///
/// When button is pressed
///
void ButtonAction(Button *b)
{
if(b->pressed)
{
cfg.show_millis=!cfg.show_millis;
}
}
Tento program nám zabezpečí, že po pripojení napätia sa spustia hodiny v podobe hodinovej, minútove a sekundovej ručičky. Vďaka fotorezistoru z predchádzajúceho článku sa budú hodiny prispôsobovať okolitému osvetleniu a pomocou tlačidla sa dá prepínať zobrazenie milisekundovej ručičky. Stále sa ale spustí v prednastavenom čase.
Toto bol úvod do používania tlačidiel. Nabudúce sa pozrieme na program, ktorý používa tri tlačidlá a umožňuje nastaviť hodinovú a minútovú ručičku.
23.08.2015