Uživatelský interface pro Arduino je řízený obvodem TM1638. Tento modul obsahuje celkem 16 tlačítek a 8 sedmi-segmentových displejů. Díky využití zmíněného obvodu TM1638 ale všechny zmíněná tlačítka a displeje můžeme ovládat pouze přes pět vodičů, z nichž tři jsou datové a dva napájecí.
Pro úspěšné propojení uživatelského interface s Arduino deskou tedy zapojíme celkem 5 vodičů. Připojíme Vcc na +5V Arduina, STB na pin D4, CLK na pin D3, DIO na pin D2 a GND na zem. Zmíněné datové piny STB, CLK a DIO můžeme zapojit také na jiné volné piny, ale je nutné tuto volbu provést také na začátku programu.
Pro úspěšné nahrání uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu TM1638, návod, jak na to je uveden zde. Ukázkový kód obsahuje na začátku připojení knihovny, nastavení čísel pinů pro propojení s Arduinem a vytvoření instance panel z knihovny. V podprogramu setup se nachází pro účely testování nastavení komunikace po sériové lince rychlostí 9600 baudů a příkaz pro aktivaci displeje s nastavením úrovně podsvícení. V nekonečné smyčce loop vždy vytvoříme proměnné pro uložení stavu tlačítka a do proměnné cas si načteme informaci o počtu vteřin od připojení napájení Arduino desky. Jako další následuje for smyčka, která projde všech 16 bitů načtené hodnoty a pokud je některý bit rovný jedničce, tak víme, že s ním spojené tlačítko bylo stisknuto. A při stisku více tlačítek najednou dostaneme tímto způsobem informaci o všech stisknutých tlačítkách, přičemž v proměnné tlacitko se nám sečte součet jejich hodnot. Jako další je uvedena podmínka if, která kontroluje stisknutí libovolného tlačítka. Pokud tedy bylo stisknuto alespoň jedno tlačítko, nastavíme aktuální hodnotu proměnné tlacitko v hexa formátu na sedmisegmentové displeje společně s tečkou v prvním znaku. Pokud ale nebylo stisknuto žádné tlačítko, tak vypíšeme na sedmisegmentových displejích čas od spuštění Arduina společně s tečkami u prvního a druhého znaku. Na konci smyčky se nachází už jen pauza po dobu půl vteřiny.
// Uživatelský interface s TM1638 // připojení knihovny #include <TM1638QYF.h> // nastavení čísel pinů pro propojení s Arduinem #define DATA 2 #define CLOCK 3 #define STROBE 4 // vytvoření instance panel z knihovny TM1638QYF TM1638QYF panel(DATA, CLOCK, STROBE); void setup() { // komunikace přes sériovou linku rychlostí 9600 baud Serial.begin(9600); // aktivace displeje - prvni číslice 0 nebo 1, // nastavení úrovně podsvícení - druhá číslice 1-7 panel.setupDisplay(1, 7); } void loop() { // vytvoření proměnné pro uložení stavu tlačítka // v čisté formě (panelTlac) a do rozsahu 1-16 (tlacitko) word panelTlac = panel.getButtons(); int tlacitko = 0; // vytvoření proměnné cas a uložení aktuálního // času od zapnutí Arduina ve vteřinách long cas = millis() / 1000; // smyčka for pro detekci stisknutých tlačítek, // každé tlačítko odpovídá bitu v proměnné panelTlac, // v případě detekování stisku přičteme jeho hodnotu // do proměnné tlacitko a vytiskneme zprávu po sériové lince for (int a = 0; a < 16; a++) { if (bitRead(panelTlac, a) == 1) { tlacitko += a + 1; Serial.print("Stisk tlacitka: "); Serial.println(a + 1); } } // v případě, že bylo stisknuto tlačítko, // vypiš jeho číslo po sériové lince // a na displej vypiš součet hodnot pořadí tlačítek // v hexa formátu if (tlacitko > 0) { // výpis ukázky znaků v hex formátu, // 1 znamená tečku v prvním znaku, 1 pro výpis s nulami panel.setDisplayToHexNumber(tlacitko, 1, 1); // vytištění prázdného řádku pro jednodušší čtení Serial.println(); } // pokud nebylo stisknuto žádné tlačítko, // vypiš na displej aktuální čas od spuštění else { // výpis čísla ve tvaru: číslo, tečka u prvního a druhého znaku, // 0 pro výpis bez nul/ 1 výpis s nulami; // tečka se řídí podle přepočtu čísla na binární tvar (3=b11) panel.setDisplayToDecNumber(cas, 3, 0); } // pauza pro přehlednější výpis delay(500); }
Po nahrání programu do Arduino desky s připojeným uživatelským rozhraním a stisknutí tlačítek dostaneme například tento výpis:
Stisk tlacitka: 1 Stisk tlacitka: 1 Stisk tlacitka: 1 Stisk tlacitka: 2 Stisk tlacitka: 1 Stisk tlacitka: 1 Stisk tlacitka: 12 Stisk tlacitka: 16
Uživatelský interface s obvodem TM1638 je velice zajímavý ovládací panel nejen pro Arduino. Díky možnosti zobrazit až osm znaků na sedmisegmentovkách a k tomu číst vstupy z šestnácti tlačítek se tento panel hodí na nejrůznější projekty, jako například Arduino kalkulačka, herní ovladač či vstupní terminál. A díky propojení pouze třemi datovými vodiči nám zůstane většina dalších pinů pro připojení ostatních senzorů a jiných modulů k Arduinu.
Seznam použitých komponent:
https://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html
https://dratek.cz/arduino/923-arduino-uzivatelsky-interface-1421013092.html