Arduino ako monitor stlačenia tlačidla pre počítač

Zápisník experimentátora

Z jedného projektu som vybral príklad monitorovania stlačenia tlačidla pomocou Arduina. Program sleduje stlačenie tlačidla pomocou prerušenia a zasiela informáciu o stlačenom tlačidle pomocou sériového portu do počítača. V príklade nájdete nastavenie prerušenia pomocou funkcie attachInterrupt a makra digitalPinToInterrupt.

Pretože v prerušení nemôžete komunikovať cez sériový port, musíte si informáciu o stlačení tlačidla prenášať do hlavného programu. Všetky použité premenné musia mať nastavený príznak volatile, aby ich kompilátor neoptimalizoval a boli prístupné aj v hlavnom programe aj v prerušení.

A máte tu aj príklad na ošetrenie zákmitov tlačidla. V tomto prípade sa jedná o dlhé intervaly, pretože v tomto projekte sa kontrolovalo stlačenie tlačidla, ktoré sa stláča vo veľkých časových odstupoch. Tlačidlá sú pripojené cez interný pull-up.

Zdrojový kód

Sú tu len vybrané časti projektu. Ak chcete zdrojový kód využiť, musíte si doplniť volanie týchto funkcií do funkcií setup a loop.

const uint8_t interrupt_pin1 = 2;
const uint8_t interrupt_pin2 = 3;
volatile bool signal_interrupt_pin1 = false;
volatile bool signal_interrupt_pin2 = false;
volatile unsigned long debounce_interrupt_pin1 = 0;
volatile unsigned long debounce_interrupt_pin2 = 0;

void button_handler1() {
  if((millis()-debounce_interrupt_pin1) > 5000) {
    signal_interrupt_pin1 = true;
    debounce_interrupt_pin1 = millis();
  }
}

void button_handler2() {
  if((millis()-debounce_interrupt_pin2) > 5000) {
    signal_interrupt_pin2 = true;
    debounce_interrupt_pin2 = millis();
  }
}

void loop_interrupts() {
  if(signal_interrupt_pin1) {
    Serial.println("AT+SIGNAL1");
    signal_interrupt_pin1 = false;
  }
  if(signal_interrupt_pin2) {
    Serial.println("AT+SIGNAL2");
    signal_interrupt_pin2 = false;
  }
}

void setup_interrupts() {
  pinMode(interrupt_pin1, INPUT_PULLUP);
  pinMode(interrupt_pin2, INPUT_PULLUP);
  //Serial.println(digitalPinToInterrupt(interrupt_pin1));
  //Serial.println(digitalPinToInterrupt(interrupt_pin2));
  attachInterrupt(digitalPinToInterrupt(interrupt_pin1),button_handler1,CHANGE);
  attachInterrupt(digitalPinToInterrupt(interrupt_pin2),button_handler2,CHANGE);
}

14.11.2017


Menu