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