mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-19 23:22:16 +03:00
126 lines
4.7 KiB
ReStructuredText
126 lines
4.7 KiB
ReStructuredText
:orphan:
|
|
|
|
Generic
|
|
-------
|
|
|
|
In the first `example <readme.rst#quick-start>`__ of the ESP8266WiFi library documentation we have discussed how to check when module connects to the Wi-Fi network. We were waiting until connection is established. If network is not available, the module could wait like that for ever doing nothing else. Another `example <scan-examples.rst#async-scan>`__ on the Wi-Fi asynchronous scan mode demonstrated how to wait for scan result and do in parallel something else - blink a LED not disturbing the blink pattern. Let's apply similar functionality when connecting the module to an access point.
|
|
|
|
Table of Contents
|
|
-----------------
|
|
|
|
- `Introduction <#introduction>`__
|
|
- `What are the Tasks? <#what-are-the-tasks>`__
|
|
- `Event Driven Methods <#event-driven-methods>`__
|
|
- `Register the Events <#register-the-events>`__
|
|
- `The Code <#the-code>`__
|
|
- `Check the Code <#check-the-code>`__
|
|
- `Conclusion <#conclusion>`__
|
|
|
|
Introduction
|
|
~~~~~~~~~~~~
|
|
|
|
In example below we will show another cool example of getting ESP perform couple of tasks at the same time and with very little programming.
|
|
|
|
What are the Tasks?
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
We would like to write a code that will inform us that connection to Wi-Fi network has been established or lost. At the same time we want to perform some time critical task. We will simulate it with a blinking LED. Generic class provides specific, event driven methods, that will be executed asynchronously, depending on e.g. connection status, while we are already doing other tasks.
|
|
|
|
Event Driven Methods
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The list of all such methods is provided in `Generic Class <generic-class.rst>`__ documentation.
|
|
|
|
We would like to use two of them: \* ``onStationModeGotIP`` called when station is assigned IP address. This assignment may be done by DHCP client or by executing ``WiFi.config(...)``. \* ``onStationModeDisconnected`` called when station is disconnected from Wi-Fi network. The reason of disconnection does not matter. Event will be triggered both if disconnection is done from the code by executing ``WiFi.disconnect()``, because the Wi-Fi signal is weak, or because the access point is switched off.
|
|
|
|
Register the Events
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
To get events to work we need to complete just two steps:
|
|
|
|
1. Declare the event handler:
|
|
|
|
``cpp WiFiEventHandler disconnectedEventHandler;``
|
|
|
|
2. Select particular event (in this case ``onStationModeDisconnected``)
|
|
and add the code to be executed when event is fired.
|
|
|
|
``cpp disconnectedEventHandler = WiFi.onStationModeDisconnected([](const WiFiEventStationModeDisconnected& event) { Serial.println("Station disconnected"); });`` If this event is fired the code will print out information that station has been disconnected.
|
|
|
|
That's it. It is all we need to do.
|
|
|
|
The Code
|
|
~~~~~~~~
|
|
|
|
The complete code, including both methods discussed at the beginning, is provided below.
|
|
|
|
.. code:: cpp
|
|
|
|
#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);
|
|
WiFi.begin(ssid, password);
|
|
}
|
|
|
|
|
|
void loop()
|
|
{
|
|
digitalWrite(LED_BUILTIN, ledState);
|
|
ledState = !ledState;
|
|
delay(250);
|
|
}
|
|
|
|
Check the Code
|
|
~~~~~~~~~~~~~~
|
|
|
|
After uploading above sketch and opening a serial monitor we should see a similar log:
|
|
|
|
::
|
|
|
|
Connecting to sensor-net ...
|
|
Station connected, IP: 192.168.1.10
|
|
|
|
If you switch off the access point, and put it back on, you will see the following:
|
|
|
|
::
|
|
|
|
Station disconnected
|
|
Station disconnected
|
|
Station disconnected
|
|
Station connected, IP: 192.168.1.10
|
|
|
|
The process of connection, disconnection and printing messages is done in background of the ``loop()`` that is responsible for blinking the LED. Therefore the blink pattern all the time remains undisturbed.
|
|
|
|
Conclusion
|
|
~~~~~~~~~~
|
|
|
|
Check out events from generic class. They will help you to write more compact code. Use them to practice splitting your code into separate tasks that are executed asynchronously.
|
|
|
|
For review of functions included in generic class, please refer to the `Generic Class <generic-class.rst>`__ documentation.
|