ESP8266 NodeMCU — Точка доступа (AP) для веб-сервера

В этом руководстве вы узнаете, как настроить ESP8266 NodeMCU в качестве точки доступа (Access Point, AP) с помощью Arduino IDE. Это позволяет подключаться к ESP8266 напрямую через Wi-Fi без использования беспроводного роутера.

ESP8266 NodeMCU — точка доступа (AP) для веб-сервера

Чтобы настроить ESP8266 как точку доступа, используйте WiFi.softAP(ssid, password);

ESP8266 — режим станции и точки доступа

В большинстве наших проектов веб-серверов ESP8266 NodeMCU мы подключаем ESP8266 к беспроводному роутеру. В такой конфигурации мы можем получить доступ к ESP8266 через локальную сеть.

В этом сценарии роутер выступает в роли точки доступа, а ESP8266 настроен как станция. Поэтому вам нужно быть подключенным к вашему роутеру (локальной сети), чтобы управлять ESP8266.

ESP8266 NodeMCU в режиме станции Wi-Fi

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

Простыми словами, когда вы настраиваете ESP8266 как точку доступа, вы создаёте собственную Wi-Fi сеть, и ближайшие Wi-Fi устройства (станции) могут к ней подключаться (например, ваш смартфон или компьютер).

ESP8266 NodeMCU в режиме точки доступа (AP)

В этом руководстве мы покажем вам, как настроить ESP8266 в качестве точки доступа в ваших проектах веб-серверов. Таким образом, вам не нужно быть подключенным к роутеру для управления ESP8266.

Поскольку ESP8266 не подключается далее к проводной сети (например, к вашему роутеру), это называется soft-AP (программная точка доступа).

Это означает, что если вы попытаетесь загрузить библиотеки или использовать прошивки из интернета, это не сработает. Также не получится отправлять HTTP-запросы к сервисам в интернете, например, публиковать показания датчиков в облако.

Установка библиотеки DHT для ESP8266

Для этого примера мы будем использовать предыдущий проект веб-сервера, который отображает показания датчика DHT.

Установив плату ESP8266 в Arduino IDE, для чтения данных с датчика DHT мы будем использовать библиотеку DHT от Adafruit. Для работы этой библиотеки также необходимо установить библиотеку Adafruit Unified Sensor.

Выполните следующие шаги для установки этих двух библиотек:

  1. Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.

  2. Введите «DHT» в поле поиска и установите библиотеку DHT от Adafruit.

Установка библиотеки Adafruit DHT
  1. После установки библиотеки DHT от Adafruit введите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, найдите библиотеку и установите её.

Установка библиотеки Adafruit Unified Sensor

После установки библиотек перезапустите Arduino IDE.

Точка доступа ESP8266 NodeMCU (AP)

В этом примере мы модифицируем веб-сервер ESP8266 из предыдущего руководства, чтобы добавить возможности точки доступа. Вот пример проекта, который мы будем использовать: ESP8266 DHT11/DHT22 — Веб-сервер температуры и влажности с Arduino IDE.

То, что мы покажем здесь, может быть использовано с любым примером веб-сервера ESP8266.

Загрузите приведённый ниже скетч, чтобы настроить ESP8266 как точку доступа.

/*********
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://randomnerdtutorials.com/esp8266-nodemcu-access-point-ap-web-server/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/

// Import required libraries
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>

const char* ssid     = "ESP8266-Access-Point";
const char* password = "123456789";

#define DHTPIN 5     // Digital pin connected to the DHT sensor

// Uncomment the type of sensor in use:
//#define DHTTYPE    DHT11     // DHT 11
#define DHTTYPE    DHT22     // DHT 22 (AM2302)
//#define DHTTYPE    DHT21     // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);

// current temperature & humidity, updated in loop()
float t = 0.0;
float h = 0.0;

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;    // will store last time DHT was updated

// Updates DHT readings every 10 seconds
const long interval = 10000;

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>
    html {
     font-family: Arial;
     display: inline-block;
     margin: 0px auto;
     text-align: center;
    }
    h2 { font-size: 3.0rem; }
    p { font-size: 3.0rem; }
    .units { font-size: 1.2rem; }
    .dht-labels{
      font-size: 1.5rem;
      vertical-align:middle;
      padding-bottom: 15px;
    }
  </style>
</head>
<body>
  <h2>ESP8266 DHT Server</h2>
  <p>
    <span class="dht-labels">Temperature</span>
    <span id="temperature">%TEMPERATURE%</span>
    <sup class="units">&deg;C</sup>
  </p>
  <p>
    <span class="dht-labels">Humidity</span>
    <span id="humidity">%HUMIDITY%</span>
    <sup class="units">%</sup>
  </p>
</body>
<script>
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperature").textContent = this.responseText;
    }
  };
  xhttp.open("GET", "/temperature", true);
  xhttp.send();
}, 10000 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("humidity").textContent = this.responseText;
    }
  };
  xhttp.open("GET", "/humidity", true);
  xhttp.send();
}, 10000 ) ;
</script>
</html>)rawliteral";

// Replaces placeholder with DHT values
String processor(const String& var){
  //Serial.println(var);
  if(var == "TEMPERATURE"){
    return String(t);
  }
  else if(var == "HUMIDITY"){
    return String(h);
  }
  return String();
}

void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);
  dht.begin();

  Serial.print("Setting AP (Access Point)…");
  // Remove the password parameter, if you want the AP (Access Point) to be open
  WiFi.softAP(ssid, password);

  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);

  // Print ESP8266 Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "text/html", index_html, processor);
  });
  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "text/plain", String(t).c_str());
  });
  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "text/plain", String(h).c_str());
  });

  // Start server
  server.begin();
}

void loop(){
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    // save the last time you updated the DHT values
    previousMillis = currentMillis;
    // Read temperature as Celsius (the default)
    float newT = dht.readTemperature();
    // Read temperature as Fahrenheit (isFahrenheit = true)
    //float newT = dht.readTemperature(true);
    // if temperature read failed, don't change t value
    if (isnan(newT)) {
      Serial.println("Failed to read from DHT sensor!");
    }
    else {
      t = newT;
      Serial.println(t);
    }
    // Read Humidity
    float newH = dht.readHumidity();
    // if humidity read failed, don't change h value
    if (isnan(newH)) {
      Serial.println("Failed to read from DHT sensor!");
    }
    else {
      h = newH;
      Serial.println(h);
    }
  }
}

Исходный код

Настройка SSID и пароля

Вам нужно задать имя SSID и пароль для доступа к ESP8266. В этом примере мы задаём имя SSID ESP8266 как ESP8266-Access-Point, но вы можете изменить это имя на любое другое. Пароль — 123456789, но вы также можете его изменить.

const char* ssid     = "ESP8266-Access-Point";
const char* password = "123456789";

Настройка ESP8266 в качестве точки доступа (AP)

В функции setup() есть раздел для настройки ESP8266 как точки доступа с помощью метода softAP():

WiFi.softAP(ssid, password);

Метод softAP() также принимает другие необязательные параметры. Вот все параметры:

.softAP(const char* ssid, const char* password, int channel, int ssid_hidden, int max_connection)
  • ssid (задан ранее): максимум 31 символ

  • password (задан ранее): минимум 8 символов. Если не указан, точка доступа будет открытой (максимум 63 символа)

  • channel: номер Wi-Fi канала (1-13). По умолчанию 1

  • ssid_hidden: если установлено значение true, SSID будет скрыт

  • max_connection: максимальное количество одновременно подключённых станций, от 0 до 8

Далее получаем IP-адрес точки доступа с помощью метода softAPIP() и выводим его в Serial Monitor.

IPAddress IP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(IP);

Примечание

По умолчанию IP-адрес точки доступа — 192.168.4.1

Это фрагменты кода, которые нужно включить в ваши скетчи веб-серверов для настройки ESP8266 как программной точки доступа.

Чтобы узнать, как работает полный код веб-сервера, прочитайте: ESP8266 NodeMCU DHT11/DHT22 — Веб-сервер температуры и влажности с Arduino IDE.

Необходимые компоненты

Для выполнения этого руководства вам понадобятся следующие компоненты:

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схема подключения

Соберите все компоненты по следующей схеме:

Схема подключения ESP8266 NodeMCU с датчиком DHT для веб-сервера в режиме точки доступа

Подключение к точке доступа ESP8266

Запустив скетч на ESP8266, откройте настройки Wi-Fi на вашем смартфоне и нажмите на сеть ESP8266-Access-Point:

Подключение к точке доступа ESP8266 NodeMCU (режим AP)

Введите пароль, который вы задали ранее.

Ввод пароля для точки доступа ESP8266 NodeMCU

Откройте веб-браузер и введите IP-адрес http://192.168.4.1. Должна загрузиться страница веб-сервера:

Веб-сервер ESP8266 NodeMCU в режиме точки доступа

Страница веб-сервера немного отличается от оригинального веб-сервера. Тот веб-сервер отображает две иконки рядом с температурой и влажностью. Эти иконки загружаются с сайта Font Awesome. Однако, поскольку ESP8266 работает как программная точка доступа (не подключён к интернету), мы не можем загрузить эти иконки.

Заключение

В этом руководстве вы узнали, как настроить ESP8266 как программную точку доступа. Это позволяет подключаться к веб-серверу ESP8266 напрямую через Wi-Fi без необходимости подключения к роутеру.

Однако учтите, что ESP8266 не подключён к интернету, поэтому вы не можете отправлять HTTP-запросы к другим сервисам для публикации данных датчиков или получения данных из интернета (например, загрузки иконок).

Вам также может быть интересно: