Hodiny z NeoPixel Ring - jedno tlačidlo na ovládanie parametrov

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.

Schéma

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.

Konfigurácia 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();
}

Používanie tlačidiel

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:

  • pin 2
  • reakcia na stlačenie tlačidla je vo funkcii ButtonAction
  • 25 ms na ustálenie tlačidla
  • bez opakovania pri podržaní tlačidla
  • použije sa interný pull-up rezistor

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.

Nabudúce

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.



Download

23.08.2015


Menu