A kapcsolót a GPIO és GND közé kösd, az ellenállást pedig a kártya saját +3.3 V-jára. Aztán az az 500 kΩ sok lesz. Legyen pl. 3.3 kΩ, akkor nem lesz zavarérzékeny. Ezen felül illik software-esen is szűrni egyrészt azért, mert a kapcsoló pereg, prellezik, tehát átkapcsoláskor impulzus sorozat keletkezik, másrészt azért, mert beeshet egy-egy rövid, kósza tranziens, amiről nem szeretnél tudni.
Egy lehetséges algoritmus, hogy időalap IT-ből, pl. 2 ms-onként olvasod a GPIO-t. Ha 1-et olvasol, növelsz egy számlálót, de telítődően, ha 0-t olvasol, csökkented, de azt is úgy, hogy telít, ha elér a legkisebb értékig. Ha a számlálód a maximumon van, 0-ba billented a kimenetet tároló flag-et, ha minimumon, akkor 1-be, közte pedig változatlanul hagyod. Fejből írtam gyorsan, nem biztos, hogy jó.
A key az globális volatile bool változó.
void IT_callback(void) {
#define COUNTER_LENGTH 6
static uint8_t key_cnt = 0;
if (Get_GPIO()) {
if (++key_cnt & ((1 << COUNTER_LENGTH) - 1) == 0) {
key_cnt--;
key = false;
}
} else {
if (--key_cnt & ((1 << COUNTER_LENGTH) - 1) == ((1 << COUNTER_LENGTH) - 1)) {
key_cnt++;
key = true;
}
}
}