Вы можете сделать это с помощью внешних прерываний. Большинство Arduinos поддерживают это только на ограниченном числе контактов. Для получения полной информации см. Документацию по attachInterrupt()
.
Предполагая, что вы используете Uno, вы можете сделать это так:
void pinChanged()
{
//...
}
void setup()
{
pinMode(2, INPUT);
attachInterrupt(0, pinChanged, CHANGE);
}
void loop()
{
}
Он будет вызываться pinChanged()
всякий раз, когда обнаруживается изменение на внешнем прерывании 0. На Uno, который соответствует выводу GPIO 2. На других платах нумерация внешних прерываний отличается на других платах, поэтому важно проверить соответствующую документацию.
Однако у этого подхода есть ограничения. Пользовательская pinChanged()
функция используется в качестве подпрограммы обработки прерывания (ISR). Это означает, что остальная часть кода (все внутри loop()
) временно останавливается во время выполнения вызова. Чтобы предотвратить нарушение важного времени, вы должны стремиться сделать ISR максимально быстрыми.
Также важно отметить, что никакие другие прерывания не будут выполняться во время вашего ISR. Это означает, что все, что зависит от прерываний (например, ядро delay()
и millis()
функции), может не работать должным образом внутри него.
Наконец, если вашему ISR необходимо изменить какие-либо глобальные переменные в эскизе, они обычно должны быть объявлены как volatile
, например:
volatile int someNumber;
Это важно, потому что он сообщает компилятору, что значение может неожиданно измениться, поэтому следует соблюдать осторожность, чтобы не использовать его устаревшие копии / кэши.