ESP8266 NodeMCU — Точка доступа (AP) для веб-сервера
В этом руководстве вы узнаете, как настроить ESP8266 NodeMCU в качестве точки доступа (Access Point, AP) с помощью Arduino IDE. Это позволяет подключаться к ESP8266 напрямую через Wi-Fi без использования беспроводного роутера.
Чтобы настроить ESP8266 как точку доступа, используйте WiFi.softAP(ssid, password);
ESP8266 — режим станции и точки доступа
В большинстве наших проектов веб-серверов ESP8266 NodeMCU мы подключаем ESP8266 к беспроводному роутеру. В такой конфигурации мы можем получить доступ к ESP8266 через локальную сеть.
В этом сценарии роутер выступает в роли точки доступа, а ESP8266 настроен как станция. Поэтому вам нужно быть подключенным к вашему роутеру (локальной сети), чтобы управлять ESP8266.
В некоторых случаях это может быть не лучшей конфигурацией (например, когда рядом нет роутера). Но если вы настроите ESP8266 как точку доступа (хотспот), вы сможете подключиться к ESP8266 с помощью любого устройства с поддержкой Wi-Fi, без необходимости подключения к роутеру.
Простыми словами, когда вы настраиваете ESP8266 как точку доступа, вы создаёте собственную Wi-Fi сеть, и ближайшие Wi-Fi устройства (станции) могут к ней подключаться (например, ваш смартфон или компьютер).
В этом руководстве мы покажем вам, как настроить ESP8266 в качестве точки доступа в ваших проектах веб-серверов. Таким образом, вам не нужно быть подключенным к роутеру для управления ESP8266.
Поскольку ESP8266 не подключается далее к проводной сети (например, к вашему роутеру), это называется soft-AP (программная точка доступа).
Это означает, что если вы попытаетесь загрузить библиотеки или использовать прошивки из интернета, это не сработает. Также не получится отправлять HTTP-запросы к сервисам в интернете, например, публиковать показания датчиков в облако.
Установка библиотеки DHT для ESP8266
Для этого примера мы будем использовать предыдущий проект веб-сервера, который отображает показания датчика DHT.
Установив плату ESP8266 в Arduino IDE, для чтения данных с датчика DHT мы будем использовать библиотеку DHT от Adafruit. Для работы этой библиотеки также необходимо установить библиотеку Adafruit Unified Sensor.
Выполните следующие шаги для установки этих двух библиотек:
Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.
Введите «DHT» в поле поиска и установите библиотеку DHT от Adafruit.
После установки библиотеки DHT от Adafruit введите «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">°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
Запустив скетч на ESP8266, откройте настройки Wi-Fi на вашем смартфоне и нажмите на сеть ESP8266-Access-Point:
Введите пароль, который вы задали ранее.
Откройте веб-браузер и введите IP-адрес http://192.168.4.1. Должна загрузиться страница веб-сервера:
Страница веб-сервера немного отличается от оригинального веб-сервера. Тот веб-сервер отображает две иконки рядом с температурой и влажностью. Эти иконки загружаются с сайта Font Awesome. Однако, поскольку ESP8266 работает как программная точка доступа (не подключён к интернету), мы не можем загрузить эти иконки.
Заключение
В этом руководстве вы узнали, как настроить ESP8266 как программную точку доступа. Это позволяет подключаться к веб-серверу ESP8266 напрямую через Wi-Fi без необходимости подключения к роутеру.
Однако учтите, что ESP8266 не подключён к интернету, поэтому вы не можете отправлять HTTP-запросы к другим сервисам для публикации данных датчиков или получения данных из интернета (например, загрузки иконок).
Вам также может быть интересно: