( locsemege | 2021. 03. 05., p – 16:54 )

Szerkesztve: 2021. 03. 10., sze – 12:05

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;
    }
  }
}