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
.
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