ESP8266:Прошивки/Arduino/Библиотеки/Библиотека ESP8266WiFi/Класс Generic/Асинхронно выполняемые задачи с помощью класса Generic: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{ESP8266 панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} {{Черновик}} =Асинхронно выпол…») |
Нет описания правки |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=Асинхронно выполняемые задачи с помощью класса Generic<ref>[http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/generic-examples.html arduino-esp8266.readthedocs.io - Generic]</ref>= | =Асинхронно выполняемые задачи с помощью класса Generic<ref>[http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/generic-examples.html arduino-esp8266.readthedocs.io - Generic]</ref>= | ||
Строка 30: | Строка 30: | ||
* Объявить обработчик события: | * Объявить обработчик события: | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
cpp WiFiEventHandler disconnectedEventHandler; | cpp WiFiEventHandler disconnectedEventHandler; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 36: | Строка 36: | ||
* Выбрать конкретное событие (в данном случае – '''onStationModeDisconnected''') и добавить код, который будет выполнен при появлении этого события: | * Выбрать конкретное событие (в данном случае – '''onStationModeDisconnected''') и добавить код, который будет выполнен при появлении этого события: | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
cpp disconnectedEventHandler = WiFi.onStationModeDisconnected([](const WiFiEventStationModeDisconnected& event) { Serial.println("Station disconnected"); }); | cpp disconnectedEventHandler = WiFi.onStationModeDisconnected([](const WiFiEventStationModeDisconnected& event) { Serial.println("Station disconnected"); }); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 46: | Строка 46: | ||
Ниже – [[скетч]] целиком, включая обе функции, о которых рассказывалось ниже: | Ниже – [[скетч]] целиком, включая обе функции, о которых рассказывалось ниже: | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
#include <ESP8266WiFi.h> | #include <ESP8266WiFi.h> | ||
Строка 93: | Строка 93: | ||
Загрузите скетч на [[ESP8266]] и откройте монитор порта. В нем должно появиться примерно следующее: | Загрузите скетч на [[ESP8266]] и откройте монитор порта. В нем должно появиться примерно следующее: | ||
<syntaxhighlight lang="bash | <syntaxhighlight lang="bash"> | ||
Connecting to sensor-net ... | Connecting to sensor-net ... | ||
Station connected, IP: 192.168.1.10 | Station connected, IP: 192.168.1.10 | ||
Строка 100: | Строка 100: | ||
Если выключить, а затем снова включить точку доступа, в мониторе порта появится следующее: | Если выключить, а затем снова включить точку доступа, в мониторе порта появится следующее: | ||
<syntaxhighlight lang="bash | <syntaxhighlight lang="bash"> | ||
Station disconnected | Station disconnected | ||
Station disconnected | Station disconnected |
Текущая версия от 12:51, 18 июня 2023
Асинхронно выполняемые задачи с помощью класса 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 читайте в [ссылка этой статье].