Arduino

displej - multiplex

NSWI170, 2025, Labs 05

Jáchym Bártík

Kletba #5 - Zapouzdření

  • Každá třída má jasně definovaný účel
    • Ten je přístupný prostřednictvím minimálního rozhraní
  • Konkrétní implementace je skryta (private)
    • Může se kdykoli změnit
  • Rozhraní na prvním místě
    • Co třída reprezentuje?
    • Co chceme, aby uměla?
    • K čemu musí mít přístup i ostatní třídy?
    • Co se pravděpodobně nebude měnit?
  • Implementace na druhém
    • Jak nejlépe splnit dané rozhraní?

Příklad - Button

  • Button musí umět:
    • Říct, jestli je právě teď zmáčknuto
    • Být nastaveno (setup) a updatováno (loop)
    • Příklad rozšíření: zamknutí / odemknutí
  • Potřebujeme, aby tlačítko říkalo, jaký má pin?
    • Pozor na prázdné gettery a settery
  • Jak zařídit, aby zvyšovalo counter?
    • NumberButton - obsahuje hodnotu a odkaz na counter
    • EventButton - obsahuje obecnou funkci

Zpětná vazba k DU

  • Více než dvě úrovně zanoření jsou velmi nepřehledné
    • Řešení - early return, lepší dekompozice
    • Viz příklad
  • Přehledný kód je lepší než kompaktní, ale kompaktnost je stále důležitá
// Don't do this!
function foo()
{
    if (someCondition)
    {
        return false;
    }

    return true;
}

// Do this instead
function foo() {
    return !someCondition;
}
// Don't do this!
if (counter & (1 << i))
{
    digitalWrite(pins[i], ON);
}
else
{
    digitalWrite(pins[i], OFF);
}

// Do this instead
bool turnOn = counter & (1 << i);
digitalWrite(pins[i], turnOn ? ON : OFF);

Cvičení #1

  • Rozsviťte všechny ledky najednou
    • Vyjděte z domácího úkolu #4
    • Odeberte třetí tlačítko
    • V každé loop zobrazte postupně všechny čtyři číslice
  • Experiment:
    1. Co se stane, když na konec loop přidáte delay(2)?
    2. Co se stane, když tímto způsobem zobrazíte číslo jenom v setup?
  • Pozorování:
    1. První ledka je výrazně jasnější.
    2. Je vidět jen jedna ledka.

Cvičení #2

  • Rozsviťte ledky tak, aby všechny svítily stejně
    • V každé loop rozsviťte vždy jen jednu ledku
    • Logiku, která to řeší, oddělte od zbytku kódu
      • Ideálně do třídy, která bude sama ovládat displej
  • Co musí daná třída umět?
    • Nastavit novou hodnotu
    • Změnit, kterou číslici zobrazuje
      • Jednou v každé loop

Cvičení #3

  • Vylepšete displej
    • Nezobrazujte na začátku nuly
      • Ačkoli číslo nula stále zobrazte jako 0
    • Přidejte desetinnou čárku
      • Funkce, která mění pozici čárky
      • Čárku nezobrazujte, pokud by byla úplně vpravo
    • Vše pořádně otestujte
      • Např. třetí tlačítko může měnit pozici tečky

Domácí úkol #5

  • Vytvořte stopky
    • Zobrazovaná přesnost je 0.1 s (zaokrouhlujte dolů)
      • Vnitřní přesnost je 1 ms
    • Vždy zobrazte alespoň dvě cifry - např. nulu jako 0.0
    • Tlačítka:
      1. Zapíná / vypíná měření času
      2. Zmrazuje / odmrazuje displej (čas se ale měří pořád)
      3. Resetuje hodnotu