Není pochyb o tom, že programovat vstup je těžší, než programovat výstup. Chcete-li nastavit výstupní GPIO linku na 0 nebo 1, tak prostě zavoláte příslušnou funkci a výstup se poslušně přepne na příslušnou úroveň, ale vstup nemáte tak říkajíc ve svých rukou. Pokud nejste připraveni v programu číst vstup nebo ho čtete ve špatnou dobu, program nebude fungovat. Daleko horší je, že nevíte, co program dělá vzhledem k událostem, které chcete zachytit. Vítejte ve světě vstupu.
V tomto článku se podíváme na nejjednodušší přístup, jak zpracovávat vstupní události — čtecí smyčku (polling loop). Vypadá to jednoduše, ale je to dobrá cesta, jak vyřešit mnohé úkoly. Později se podíváme na sofistikovanější alternativy — na zpracování událostí a na přerušení.
GPIO vstup
GPIO vstup je mnohem těžší problém z pohledu měření a verifikace. U výstupu aspoň vidíme změnu signálu na logickém analyzátoru nebo osciloskopu a můžeme určit přený čas, kdy se co stalo. To nám umožňuje sledovat problémy časování a vylepšit věci s dobrou přesností.
Vstup je naproti tomu jakoby "potichu" a nepozorovatelný.
Základní funkce pro vstup
Při programování GPIO vstupu už jsme viděli funkce, které nastavují GPIO jako vstup nebo výstup:
gpio_set_function( uint gpio, GPIO_FUNC_SIO )
nebo:
gpio_init( uint gpio )
Zavoláním těchto funkcí máme GPIO linku nastavenou a inicializovanou pro vstupní operace.
Můžete nastavit směr GPIO linky zavoláním funkce:
gpio_set_dir( uint gpio, bool out )
Pokud je parametr out true, je GPIO linka je nastavená na výstup, pokud je out false, je nastavena na vstup.
Jakmile je linka nastavena na vstup, je ve stavu vysoké impedance a neodebírá prakticky žádný proud bez ohledu na to, co k ní připojíme. Pico používá 3.3V logiku a proto nesmíme překročit hodnotu napětí 3.3V na vstupu. Rozebírali jsme to v předchozím článku o elektronice.
Stav vstupní linky přečteme zavoláním funkce:
static bool gpio_get( uint gpio )
To je všechno, co potřebujeme když používáme GPIO linku jako vstup, nezarhujíc detaily elektroniky a význam přerušení.
I když je GPIO linka nastavena na výstup, tak můžeme funkcí gpio_get() přečíst její stav, funkce vrátí stav výstupní linky, buď 0 nebo 1.
Existuje i funkce:
static uint32_t gpio_get_all()
která přečte stav všech GPIO linek jako jednu operaci.
Jak jsme již řekli v předchozím článku o elektronice, můžete nastavit interní pull-up nebo pull-down rezistory jednou z těchto funkcí:
gpio_pull_down( uint gpio )
gpio_pull_up( uint gpio )
gpio_set_pulls( uint gpio, bool up, bool down )
Kde pull-up nebo pull-down rezistory mají hodnotu v rozsahu \(50 k\Omega\) až \( 80 k\Omega\).
Potřebujete-li čistý push—pull režim, rezistory odpojíte zavoláním funkce:
gpio_disable_pulls( uint gpio )
Ovládání LED tlačítkem
Tlačítkem na pinu 21 budeme ovládat svítivou diodu, pokud je tlačítko stisknuto, bude dioda svítit. Použijeme interní pull—up rezistor.

#include "pico/stdlib.h"
int main()
{
gpio_set_function(21, GPIO_FUNC_SIO);
gpio_set_dir(21,false); (1)
gpio_pull_up(21); (2)
gpio_set_function(22, GPIO_FUNC_SIO);
gpio_set_dir(22, true); (3)
while (true) { (4)
if (gpio_get(21)) { (5)
gpio_put(22, 0); (6)
}
else { (7)
gpio_put(22, 1); (8)
}
}
}
| 1 | Nastavíme GPIO21 na vstup |
| 2 | Zapojíme k němu pull-up rezistor |
| 3 | Nastavíme GPIO22 na výstup |
| 4 | Nekonečná smyčka |
| 5 | Testujeme stav pinu 21 |
| 6 | Pin 21 je 1 (tlačítko není stisknuto), diodu na pinu 22 zhasneme |
| 7 | Pin 21 je 0 (tlačítko je stisknuto) |
| 8 | Diodu na pinu 22 rozsvítíme |

