7-segmentový displej

NSWI170, 2026, Labs 04

Jáchym Bártík

Feedback

  • Early return
    
    int foo() {
        if (condition1) {
            if (condition2) {
                // a...
            }
            else {
                if (condition3) {
                    // b...
                }
                else {
                    // c...
                }
            }
        }
        else {
            // d...
        }
    
        return x;
    }
                    
    
    int foo() {
        if (!condition1) {
            // d...
            return x;
        }
    
        if (condition2) {
            // a...
            return x;
        }
        else if (condition3) {
            // b...
            return x;
        }
        else {
            // c...
            return x;
        }
    }
                    
    
    int foo() {
        if (!condition1) {
            // d...
            return x;
        }
    
        if (condition2) {
            // a...
            return x;
        }
    
        if (condition3) {
            // b...
            return x;
        }
    
        // c...
        return x;
    }
                    

Pravidlo #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

  • GP potřebujeme k udržení stavu mezi voláními loop
  • 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
  • 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
  • Stav segmentu:
    • 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(SEG7_DATA_PIN, SEG7_CLOCK_PIN, MSBFIRST, 248); // Display digit 7 (11111000) ...
    shiftOut(SEG7_DATA_PIN, SEG7_CLOCK_PIN, MSBFIRST, 5);   // ... on positions 1 and 3 (0101)
    
    digitalWrite(SEG7_LATCH_PIN, LOW);                      // Trigger the latch
    digitalWrite(SEG7_LATCH_PIN, HIGH);
                
  • Konstanty pro piny jsou ve funshield.h
    • Předtím je všechny musíme nastavit na OUTPUT
  • Pro číslice a písmena už také existují konstanty - používejte je
    • Např. SEG7_DIGIT_GLYPHS[7] místo 248
  • 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
    • void 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