Це можна зробити за допомогою зовнішніх переривань. Більшість Arduinos підтримують це лише на обмеженій кількості штифтів. Повна інформація див. У документації на attachInterrupt()
.
Якщо припустити, що ви використовуєте Uno, ви можете зробити це так:
void pinChanged()
{
//...
}
void setup()
{
pinMode(2, INPUT);
attachInterrupt(0, pinChanged, CHANGE);
}
void loop()
{
}
Це буде викликати pinChanged()
кожен раз, коли буде виявлена зміна на зовнішньому перериванні 0. На Uno, що відповідає PIN-коду GPIO 2. Зовнішня нумерація переривань відрізняється на інших платах, тому важливо перевірити відповідну документацію.
Однак у цьому підході є обмеження. Спеціальна pinChanged()
функція використовується як звичайний режим переривання (ISR). Це означає, що решта коду (все в loop()
) тимчасово зупиняється під час виконання дзвінка. Щоб запобігти зриву будь-яких важливих термінів, ви повинні прагнути зробити ІСР якомога швидшими.
Також важливо зазначити, що під час вашого ISR жодних інших переривань не буде працювати. Це означає, що все, що покладається на переривання (наприклад, ядро delay()
та millis()
функції), може не працювати належним чином всередині нього.
Нарешті, якщо вашому ISR потрібно змінити будь-які глобальні змінні в ескізі, вони, як правило, повинні бути оголошені як volatile
, наприклад:
volatile int someNumber;
Це важливо, оскільки воно повідомляє компілятору, що значення може змінитися несподівано, тому слід бути обережним, щоб не використовувати застарілих копій / кешів.