ESP8266:Прошивки/Arduino/Библиотеки/Библиотека ESP8266WiFi/Класс Generic/Асинхронно выполняемые задачи с помощью класса Generic

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.



Асинхронно выполняемые задачи с помощью класса Generic[1]

В самом первом скетче-примере библиотеки ESP8266WiFi мы обсуждали, как проверить, подключен ли ESP8266 к WiFi-сети. В нем мы просто ждали установления соединения: если сеть была недоступна, модуль должен был ждать ее появления, забыв про все остальные задачи. В другом примере демонстрировалось асинхронное сканирование WiFi-сетей, благодаря которому ESP8266 мог ждать появления WiFi-сети, а попутно выполнять и другие задачи – вроде мигания светодиодом. Теперь давайте разберем еще один скетч с похожим функционалом.

Введение

Итак, этот еще один скетч, демонстрирующий, как запрограммировать ESP8266 на одновременное выполнение нескольких задач.

Что за задачи?

Мы напишем скетч, сообщающий о том, было ли WiFi-соединение установлено или закрыто, но одновременно с этим – выполняющий задачу, для которой критически важна синхронизация по времени. В нашем случае это будет мигание светодиодом. Класс Generic оснащен функциями, которые управляются событиями и благодаря этому могут выполняться асинхронно (в зависимости от статуса соединения), т.е. пока вы выполняете какие-то другие задачи.

Функции, управляемые событиями

Список этих функций можно найти в [ссылка статье о классе Generic].

Мы воспользуемся двумя из них:

  • onStationModeGotIP() – эта функция вызывается, когда станции присваивается IP-адрес. Присваивание IP-адреса выполняется DHCP-клиентом или при помощи функции WiFi.config().
  • onStationModeDisconnected() – эта функция вызывается, когда станция отключается от WiFi-сети. Причина отключения не важна. Событие будет запущено и в том случае, если отключение будет выполнено из кода при помощи функции WiFi.disconnect() из-за слабого WiFi-сигнала, и в том случае, если мы просто отключим точка доступа.

Регистрация событий

Чтобы события заработали так, как нам нужно, нам нужно проделать следующее:

  • Объявить обработчик события:
cpp   WiFiEventHandler disconnectedEventHandler;
  • Выбрать конкретное событие (в данном случае – onStationModeDisconnected) и добавить код, который будет выполнен при появлении этого события:
cpp   disconnectedEventHandler = WiFi.onStationModeDisconnected([](const WiFiEventStationModeDisconnected& event)   {     Serial.println("Station disconnected");   });

Вот и все. Больше ничего не нужно.

Код

Ниже – скетч целиком, включая обе функции, о которых рассказывалось ниже:

#include <ESP8266WiFi.h>

const char* ssid = "********";
const char* password = "********";

WiFiEventHandler gotIpEventHandler, disconnectedEventHandler;

bool ledState;


void setup()
{
  Serial.begin(115200);
  Serial.println();

  pinMode(LED_BUILTIN, OUTPUT);

  gotIpEventHandler = WiFi.onStationModeGotIP([](const WiFiEventStationModeGotIP& event)
  {
    Serial.print("Station connected, IP: ");
    Serial.println(WiFi.localIP());
  });

  disconnectedEventHandler = WiFi.onStationModeDisconnected([](const WiFiEventStationModeDisconnected& event)
  {
    Serial.println("Station disconnected");
  });

  Serial.printf("Connecting to %s ...\n", ssid);
            //  "Подключение к %s ... "
  WiFi.begin(ssid, password);
}


void loop()
{
  digitalWrite(LED_BUILTIN, ledState);
  ledState = !ledState;
  delay(250);
}

Проверка кода

Загрузите скетч на ESP8266 и откройте монитор порта. В нем должно появиться примерно следующее:

Connecting to sensor-net ...
Station connected, IP: 192.168.1.10

Если выключить, а затем снова включить точку доступа, в мониторе порта появится следующее:

Station disconnected
Station disconnected
Station disconnected
Station connected, IP: 192.168.1.10

Процесс подключения, отключения и печати сообщений происходит в фоновом режиме вне блока loop(), в котором выполняется мигание светодиодом. Благодаря этому паттерн мигания всегда остается неизменным.

Итого

События позволяют разбить код на отдельные, асинхронно выполняемые задачи. Следовательно, позволяют сделать код более компактным.

Более подробно о событиях, а также о других функциях класса Generic читайте в [ссылка этой статье].

См.также

Внешние ссылки