ESP8266 и Arduino IDE. Часть 3: Режим станции (Station Mode)
Примечание
Оригинал статьи: martyncurrey.com
Этот урок демонстрирует, как настроить микроконтроллер ESP8266 для подключения к существующей WiFi-сети (режим станции) и управлять светодиодом через веб-браузер.
Введение в режим станции
Режим станции отличается от режима точки доступа (AP). В режиме станции ESP8266 подключается к существующей WiFi-сети, а не создаёт собственную. Устройства должны находиться в той же сети, что и ESP8266, чтобы взаимодействовать с ним.
Назначение IP-адреса
В режиме станции IP-адрес ESP8266 назначается роутером. Это означает, что в зависимости от настроек роутера ESP8266 может получать разный IP-адрес при каждом подключении к сети.
Решение — вывод IP-адреса в Serial Monitor, хотя этот подход имеет ограничения для автономного развёртывания.
Требования к конфигурации сети
Скетч требует жёстко заданных учётных данных сети:
SSID (имя сети)
Пароль сети
Это ограничение признаётся как недостаток, требующий модификации скетча при смене сети.
Скетч: ESP8266_LED_Control_04_Station_Mode
/*
* Sketch: ESP8266_LED_Control_04_Station_Mode
* Control an LED from a web browser
* Intended to be run on an ESP8266
*
* Wait for the ESP8266 to connect to the local wifi
* then use a web broswer to go it's ip address
*
*/
#include <ESP8266WiFi.h>
// change these values to match your network
char ssid[] = "MyNetwork_SSID"; // your network SSID (name)
char pass[] = "Newtwork_Password"; // your network password
WiFiServer server(80);
String header = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
String html_1 = "<!DOCTYPE html><html><head><meta name='viewport' content='width=device-width, initial-scale=1.0'/><meta charset='utf-8'><style>body {font-size:140%;} #main {display: table; margin: auto; padding: 0 10px 0 10px; } h2,{text-align:center; } .button { padding:10px 10px 10px 10px; width:100%; background-color: #4CAF50; font-size: 120%;}</style><title>LED Control</title></head><body><div id='main'><h2>LED Control</h2>";
String html_2 = "";
String html_4 = "</div></body></html>";
String request = "";
int LED_Pin = D1;
void setup()
{
pinMode(LED_Pin, OUTPUT);
Serial.begin(9600);
delay(500);
Serial.println(F("Serial started at 9600"));
Serial.println();
// We start by connecting to a WiFi network
Serial.print(F("Connecting to ")); Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print("."); delay(500);
}
Serial.println("");
Serial.println(F("[CONNECTED]"));
Serial.print("[IP ");
Serial.print(WiFi.localIP());
Serial.println("]");
// start a server
server.begin();
Serial.println("Server started");
} // void setup()
void loop()
{
// Check if a client has connected
WiFiClient client = server.available();
if (!client) { return; }
// Read the first line of the request
request = client.readStringUntil('\r');
if ( request.indexOf("LEDON") > 0 ) { digitalWrite(LED_Pin, HIGH); }
else if ( request.indexOf("LEDOFF") > 0 ) { digitalWrite(LED_Pin, LOW); }
// Get the LED pin status and create the LED status message
if (digitalRead(LED_Pin) == HIGH)
{
// the LED is on so the button needs to say turn it off
html_2 = "<form id='F1' action='LEDOFF'><input class='button' type='submit' value='Turn off the LED' ></form><br>";
}
else
{
// the LED is off so the button needs to say turn it on
html_2 = "<form id='F1' action='LEDON'><input class='button' type='submit' value='Turn on the LED' ></form><br>";
}
client.flush();
client.print( header );
client.print( html_1 );
client.print( html_2 );
client.print( html_4);
delay(5);
// The client will actually be disconnected when the function returns and 'client' object is detroyed
} // void loop()
Шаги реализации
Загрузите скетч в Arduino IDE
Измените SSID и пароль сети
Загрузите на ESP8266
Откройте Serial Monitor для просмотра назначенного IP-адреса
Откройте веб-интерфейс, используя отображённый IP-адрес
Практические преимущества
Этот подход позволяет нескольким устройствам в одной сети управлять светодиодом без необходимости специальных мобильных приложений.
Ограничения и дальнейшие шаги
Использование Serial Monitor для определения IP-адреса непрактично для автономных приложений. Это будет рассмотрено в последующих уроках.