C++| ARDUINO IDE | ESP8266. Внешние прерывания

Прерывания могут быть присоединены к любому контактакту GPIO , за исключением GPIO 16.

Прерывания поддерживаются через следующие функции:
attachInterrupt (int, function, mode) — задает функцию обработки внешнего прерывания, то есть функцию function, которая будет вызвана по внешнему прерыванию.
int — номер прерывания определяемый функцией digitalPinToInterrupt (interruptPin) где interruptPin: номер вывода GPIO который будет использоваться для прерывания основной программы микроконтроллера (например void loop() ) .
function: функция, которую необходимо вызвать при возникновении прерывания;
эта функция должна быть без параметров и не возвращать никаких значений. Такую функцию иногда называют обработчиком прерывания.
mode: определяет условие, при котором должно срабатывать прерывание. Может принимать одно из трез предопределенных значений:
CHANGE – прерывание будет срабатывать всякий раз, когда меняется состояние вывода
RISING – прерывание сработает, когда состояние вывода изменится с низкого уровня на высокий
FALLING – прерывание сработает, когда состояние вывода изменится с высокого уровня на низкий.

*Внутри  функции function не будет работать функция delay () и не будет увеличиваться значение от функции millis (). Кроме того, последовательные данные, посылаемые во время работы этой функции, могут быть утеряны. Также все переменные, которые будут модифицированы внутри этой функции, нужно объявлять как volatile. Более подробно об этом читайте ниже — в разделе об ISR

detachInterrupt (pin) – Запрещает заданное прерывание.
– pin: номер вывода, соответствующее прерывание которого необходимо запретить

C++| ARDUINO IDE | ESP8266. Программа — внешние прерывания. Пример

const byte interruptPin = D7;
volatile byte state = LOW;

void ICACHE_RAM_ATTR MyInterruptHandler();

void setup() {
pinMode (LED_BUILTIN, OUTPUT);
pinMode (interruptPin, INPUT_PULLUP);

//—Задаем  функцию blink , которая будет вызвана по внешнему прерыванию.
attachInterrupt ( digitalPinToInterrupt (interruptPin), blink, CHANGE);
}

void loop() {
digitalWrite (LED_BUILTIN, state);
}

void blink () {
state = !state;
}

C++| ARDUINO IDE | ESP8266. Прерывания по таймеру

  • Пример видео: «Прерывания по таймеру в Arduino от «Школа INTEGER» Отличие данного примера прерываний по таймеру на Arduino с MCU ATmega328 от SoC ESP8266 в количестве таймеров — у ESP8266 их два: один системный для поддержки WiFi, другой прикладной, который мы можем использовать в наших программах. Помните о том, что когда  SoC ESP8266 поддерживает WiFi соединение, ему приходится выполнять множество фоновых задач, кроме вашей программы (скетча). WiFi и TCP/IP функции библиотек SDK имеют возможность обработать все события в очереди после завершения каждого цикла вашей функции void loop() или во время выполнения delay(...).

C++| ARDUINO IDE | ESP8266. Программа — прерывания по таймеру. Пример

#include <Ticker.h>

uint8_t blink_loop = 0;
uint8_t blink_mode = 0;
uint8_t modes_count = 0;

Ticker blinker;

void timerIsr()
{
if( blink_mode & 1<<(blink_loop&0x07) ) digitalWrite(LED_BUILTIN, HIGH);
else digitalWrite(LED_BUILTIN, LOW);
blink_loop++;
}

void setup() {
pinMode(LED_BUILTIN,OUTPUT);
blink_mode = 0B00000000;
blinker.attach(0.125, timerIsr);
}

void loop() {
blink_mode = 0B00001111; //Мигание по 0.5 сек
delay(5000);
blink_mode = 0B00000001; //Короткая вспышка раз в секунду
delay(5000);
blink_mode = 0B00000101; //Две короткие вспышки раз в секунду
delay(5000);
blink_mode = 0B00010101; //Три короткие вспышки раз в секунду
delay(5000);
blink_mode = 0B01010101; //Частые короткие вспышки (4 раза в секунду)
delay(5000);
}

Смотри также: