ESP8266 и Arduino IDE. Часть 3: Режим станции (Station Mode)

Примечание

Оригинал статьи: martyncurrey.com

Этот урок демонстрирует, как настроить микроконтроллер ESP8266 для подключения к существующей WiFi-сети (режим станции) и управлять светодиодом через веб-браузер.

Демонстрация управления светодиодом

Введение в режим станции

Режим станции отличается от режима точки доступа (AP). В режиме станции ESP8266 подключается к существующей WiFi-сети, а не создаёт собственную. Устройства должны находиться в той же сети, что и ESP8266, чтобы взаимодействовать с ним.

Назначение IP-адреса

В режиме станции IP-адрес ESP8266 назначается роутером. Это означает, что в зависимости от настроек роутера ESP8266 может получать разный IP-адрес при каждом подключении к сети.

Решение — вывод IP-адреса в Serial Monitor, хотя этот подход имеет ограничения для автономного развёртывания.

Serial Monitor с IP-адресом

Требования к конфигурации сети

Скетч требует жёстко заданных учётных данных сети:

  • 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()

Шаги реализации

  1. Загрузите скетч в Arduino IDE

  2. Измените SSID и пароль сети

  3. Загрузите на ESP8266

  4. Откройте Serial Monitor для просмотра назначенного IP-адреса

  5. Откройте веб-интерфейс, используя отображённый IP-адрес

Веб-интерфейс управления

Практические преимущества

Этот подход позволяет нескольким устройствам в одной сети управлять светодиодом без необходимости специальных мобильных приложений.

Ограничения и дальнейшие шаги

Использование Serial Monitor для определения IP-адреса непрактично для автономных приложений. Это будет рассмотрено в последующих уроках.