Arduino jako monitor stisknutí tlačítka pro počítač

Zápisník experimentátora

Z jednoho projektu jsem vybral příklad monitorování stisknutí tlačítka pomocí Arduina. Program sleduje stisk tlačítka pomocí přerušení a zasílá informaci o stlačeném tlačítku pomocí sériového portu do počítače. V příkladu najdete nastavení přerušení pomocí funkce attachInterrupt a makra digitalPinToInterrupt.

Protože v přerušení nemůžete komunikovat přes sériový port, musíte si informaci o stisknutí tlačítka přenášet do hlavního programu. Všechny použité proměnné musí mít nastaven příznak volatile, aby je kompilátor neoptimalizoval a byly přístupné i v hlavním programu i v přerušení.

A máte tu i příklad na ošetření zákmitú tlačítka. V tomto případě se jedná o dlouhé intervaly, protože v tomto projektu se kontrolovalo stlačení tlačítka, které se stlačuje ve velkých časových odstupech. Tlačítka jsou připojeny přes interní pull-up.

Zdrojový kód

Jsou zde jen vybrané části projektu. Chcete-li zdrojový kód využít, musíte si doplnit volání těchto funkcí do funkcí 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);
}

15.11.2017


Menu