2.8 Digitálny vstup
Digitálny vstup v MicroPython
Používanie vstupného portu je podobné ako používanie výstupného portu, teda vytvárame si premennú (inštanciu objektu) zavolaním konštruktora objektu Pin z modulu machine. Pokiaľ chceme niektorý port použiť ako vstup cez premennú p, musíme ho inicializovať v režime Pin.IN:
from machine import Pin
p = Pin({číslo portu}, Pin.IN)
Na tento port by mala byť privedená:
- buď logická nula (napätie 0 V, teda „zem“ - GND)
- alebo logická jednotka (napätie +3,3 V).
Pokiaľ je port v režime vstupu, má veľký odpor, teda nie je potrebné riešiť obmedzovanie prúdu.
Pokiaľ robíme projekt podľa návodu na Arduino, treba dať pozor na dôležitý rozdiel: Arduino pracuje s napätím 5 V, ale ESP pracuje s napätím 3,3 V. Na vstupný port nesmieme privádzať napätie 5 V!
Aktuálnu hodnotu na vstupnom porte p môžeme zistiť objektovou funkciou value() alebo priamo volaním objektu ako funkcie:
hodnota1 = p.value()
hodnota2 = p()
Aby sme mali k portu vždy pripojenú buď zem alebo napätie, museli by sme použiť prepínač, ktorý by prepínal medzi týmito dvoma hodnotami. Používanie prepínača je však nepraktické a neumožňovalo by nám to využiť bežný vypínač a ani tlačidlo - tieto prvky sú vysvetlené v Classroom prílohe „ITA 4 - Elektronika.pdf“, kapitola „4.5 Elektromechanické prvky“ a zaoberáte sa nimi v predmete Aplikovaná fyzika.
Neurčitý stav vstupu
Čo sa stane, keď k vstupnému portu pripojíme tlačidlo?
- Keď tlačidlo nebude stlačené, port vlastne nebude k ničomu pripojený, bude končiť „vo vzduchu“. Nebude mať ani hodnotu nula, ani hodnotu jedna, jeho hodnota bude neurčitá a v praxi bude ovplyvnená okolitým elektromagnetický poľom, bude reagovať aj na priblíženie prstu bez stlačenia, ale veľmi nepredvídateľne. Takýto stav je samozrejme neprijateľný.
- Keď tlačidlo stlačíme, port sa prepojí buď so zemou alebo s napätím +3,3 V - podľa toho, kam sme tlačidlo pripojili. Táto situácia je jednoznačná a bez problémov.

schéma: plávajúci vstup
Riešenie neurčitého stavu
Musíme teda nejako vylúčiť neurčitú hodnotu v stave bez stlačenia tlačidla. Dosiahneme to jednoducho: port nebude pripojený len ku tlačidlu, ale bude zároveň pripojený cez pull rezistor (používa sa hodnota 10 kΩ) aj k opačnej hodnote, teda:
- ak tlačidlo prepája s napätím 3,3 V, port prepojíme cez pull-down rezistor k zemi 0 V - východzia logická hodnota teda bude 0 a po stlačení tlačidla sa zmení na 1;
- ak tlačidlo prepája so zemou 0 V, port prepojíme cez pull-up rezistor k napätiu 3,3 V - východzia logická hodnota teda bude 1 a po stlačení tlačidla sa zmení na 0.
Ako sa situácia zmení po tomto zásahu? V prípade pull-down bude takáto:
- Keď tlačidlo nebude stlačené, port bude cez rezistor prepojený so zemou 0 V, teda je na ňom stabilná hodnota 0.
- Keď tlačidlo stlačíme, port bude prepojený s napätím 3,3 V, teda bude na ňom stabilná hodnota 1. Zároveň však preteká prúd z 3,3 V do zeme cez rezistor (čo nie je problém, pri 10 kΩ sa jedná o prúd 0,33 mA).

schéma: vstup s pull-down rezistorom
Veľmi podobná situácia bude aj s pull-up rezistorom - napätia a hodnoty budú opačné.

schéma: vstup s pull-up rezistorom
Čo by sa stalo, ak by sme použili inú hodnotu rezistora?
▶ Výrazne nižší odpor by v zopnutom stave zvýšil prúd, napríklad pri 100 Ω rezistore by po stlačení tlačidla pretekal prúd 33 mA, čo je nezanedbateľná hodnota a predstavuje výrazné zvýšenie spotreby energie. Ešte nižší odpor by už predstavoval skrat.
▶ Výrazne vyšší odpor by mohol predstavovať príliš „slabé“ spojenie s požadovanou úrovňou a silnejšie okolité rušenie by mohlo toto naše zabezpečenie prekonať, čím by sme sa dostali do pôvodnej situácie bez pull rezistora.
Interný pull rezistor
Často nie je nutné pripájať externý pull rezistor - ESP32 má k dispozícii interný pull rezistor, takže všetko vieme zariadiť priamo v programe. Pri vytváraní inštancie Pin môžeme parametrom pull definovať režim Pin.PULL_UP alebo Pin.PULL_DOWN:
from machine import Pin
# tlačidlo pripojené voči zemi (najčastejšie zapojenie)
p1 = Pin({číslo portu}, Pin.IN, pull = Pin.PULL_UP)
# tlačidlo pripojené voči napätiu
p2 = Pin({číslo portu}, Pin.IN, pull = Pin.PULL_DOWN)
Nie všetky porty majú k dispozícii interný pull rezistor! Konkrétne informácie nájdete v kapitole 2.4 Porty GPIO.
Invertovaný vstup pull-up
V prípade pull-up zapojenia sa tlačidlo správa „naopak“ - opäť môžeme využiť objekt Signal z modulu machine, s ktorým sme sa stretli už pri výstupnom porte, aby sme hodnotu mohli invertovať:
from machine import Pin, Signal
# objekt Signal automaticky invertuje výstupnú hodnotu funkcií tlačidlo.value() / tlačidlo()
tlačidlo = Signal(Pin({číslo portu}, Pin.IN), invert = True)
# teraz stlačené tlačidlo vráti hodnotu 1, hoci reálne je port nastený na LOW hodnotu
if tlačidlo():
print("Tlačidlo je stlačené!")
Prehľad zapojenia tlačidiel
Nami používané vývojové dosky a zariadenia sú vybavené tlačidlami v zapojení:
- M5StickC Plus: GPIO 37 a 39, majú externý pull-up rezistor;
- TTGO T-Display: GPIO 0 prepája so zemou (je treba nastaviť pull-up), GPIO 35 má externý pull-up rezistor;
- ESP32 DevKit v1: GPIO 0, má externý pull-up rezistor;
- ESP32 D1 Mini: GPIO 17 (D3), prepája so zemou (je treba nastaviť pull-up);
- ESP32-C3 Super Mini: GPIO 9, má externý pull-up rezistor.
Senzor PIR
Podobne ako tlačidlo sa správa aj PIR senzor (PIR = pasívny IR). Z praktického hľadiska sa jedná o senzor pohybu - detekciu prevádza na základe zmeny v infračervenom (IR) spektre. Ku M5StickC môžeme pripojiť rozširujúci modul PIR HAT so senzorom AS312, používa GPIO 36 - na vstupe je hodnota 0, pri detekcii pohybu sa na dve sekundy zmení na 1 (minimálny interval dvoch sekúnd je aj pri hodnote 0).
Podobne je v sade D1 Mini kit senzor PIR pre D3 (na ESP32 D1 Mini zodpovedá GPIO 17).

