Arduino

7-segmentový displej

NSWI170, 2025, Labs 04

Jáchym Bártík

Kletba #4 - Globální proměnné

  • Globální proměnné jsou obecně špatné
    • Netušené závislosti v kódu
    • Nulová přenositelnost a znovupoužitelnost
    • Obtížné testování či hledání chyb
  • Pravidla:
    • Nepoužívat GP místo lokálních
      • Čím lokálnější, tím lepší - např. ve for cyklech
    • Nepoužívat GP pro předávání hodnot do / z funkcí
  • Výjimka - globální konstanty
    • Nicméně i ty mají své nevýhody ...

Specifika Arduina

  • Potřebujeme je k uchovávání stavu mezi voláními loop
    • Až na statické proměnné (ale ty jsou v podstatě stejné)
  • Workflow:
    • Přístup ke GP pouze ze setup a loop
    • Do ostatních funkcí se předávají argumenty
    • Nové hodnoty se vrací návratovými hodnotami / výstupními argumenty
  • Lepší řešení - objekty
    • Není nutné je předávat nebo vracet - funkce k nim přistupují přímo

Rozděl a panuj

  • Typická aplikace má tři základní funkce:
    • Udržování dlouhodobého stavu
    • Business logika
    • UI (vstupy i výstupy)
  • Ty se samozřejmě dále dělí
  • Cílem je minimalizace závislostí mezi jednotlivými částmi
    • Rozšiřitelnost, škálovatelnost
    • Vývoj v nezávislých týmech
    • Přenositelnost na jiné platformy
  • Také chceme mít jeden zdroj pravdy
    • Existující řešení - MVC, MVVM, ...

Specifika Arduina II.

  • Workflow:
    • Přečteme vstupy (tlačítka)
    • Upravíme stav podle logiky daného problému
    • Vypíšeme nový stav
      • Ledky vs. displej
  • Všechny části jsou (teoreticky) nezávislé
  • Čemu se vyhnout:
    • Metoda co čte z tlačítka rovnou upravuje čítač
    • Vnitřní logika tlačítka vypisuje na displej
    • Při zobrazování na displej čteme z tlačítka
    • ...

7-segmentový displej

  • 8 částí - jeden byte
  • Stavy:
    • 0 - led svítí
    • 1 - led nesvítí
  • Uspořádání - číslo 7:
DP G F E D C B A
1 1 1 1 1 0 0 0
  • Výsledná hodnota:

      255 - 4 - 2 - 1 = 248

Shift registry

  • Typ digitální paměti
  • Tu se používají SIPO (Serial-in parallel-out)
    • Model 74HC959D
  • Algoritmus:
    • Pošleme masku pro hodnotu (1 byte)
    • Pošleme masku pro pozici (1 byte)
      • 1 je aktivní, 0 je neaktivní
      • Zapnutí první a třetí číslice: 0101, tedy číslo 5
    • Vyvoláme změnu

Použití displeje

  • Podle předchozího algoritmu:
shiftOut(data_pin, clock_pin, MSBFIRST, 248);   // Display digit 7 (11111000) ...
shiftOut(data_pin, clock_pin, MSBFIRST, 5);     // ... on positions 1 and 3 (0101)

digitalWrite(latch_pin, LOW);                   // Trigger the latch
digitalWrite(latch_pin, HIGH);
  • Konstanty pro piny jsou ve funshield.h
    • Předtím je všechny musíme nastavit na OUTPUT
    • Pro číslice a pozice už také existují konstanty (digits )
  • Konstanta MSBFIRST určuje pořadí bitů
    • Most Significant Bit First
    • Druhou možností je LSBFIRST

Cvičení #1

  • Vytvořte funkci, která zobrazí číslici na displeji
    • displayDigit(int digit, int position)
      • digit je od 0 do 9
      • position je od 0 do 3
    • Použijte některý čítač z předchozí hodiny
      • Modulo 10

Cvičení #2

  • Vytvořte funkci, která zobrazí číslo na displeji
    • V každé chvíli svítí jen jedna číslice
    • Třetím tlačítkem měníte, která to je
      • jednotky - desítky - stovky - tisíce - jednotky
    • Použijte stejný čítač
      • Modulo 10000

Domácí úkol #4

  • Přidejte k displeji tlačítka
    • Vyjděte ze cvičení #2
    • Číslo formátuje tak, aby začínalo nulami
      • Např. 42 se zobrazí jako 0042
    • Tlačítka 1 resp. 2 zvyšují resp. snižují čítač
      • Vždy o "jedna" v řádu, který se právě zobrazuje
      • Při zobrazení stovek to bude +100 či -100