Видео - процесс заливки скетча в модуль ESP8266 ESP-01 через программатор YP-05.
https://disk.yandex.ru/i/g7IBaCWnKYCirg
Мой скетч - управление светодиодом через WIFI. Самое важное - модуль ESP8266 умеет работать только с сетями 2,4ГГц.
Суть скетча: после включения модуля ESP, он подключается к вашей WiFi сети (в скетче обязательно вписать свой ssid - имя своей wifi сети, password - пароль). Откройте монитор порта в приложении Arduino IDE, выставьте скорость внизу 115200 baud. А так же Both NL & CR. Увидите информацию о подключении модуля ESP к сети wifi - высветится локальный IP адрес модуля (любое устройство - будь то телефон, ноутбук, телевизор, когда подключается к вашему роутеру - ему присваивается рандомный локальный ip адрес. Если что, в настройках роутера всегда можно для любого устройства назначить, чтобы адрес был статичным - т.е. всегда выдавался один и тот же).
Теперь, когда мы знаем локальный ip-адрес нашего модуля ESP (например, 192.168.0.16), мы вбиваем в любом браузере ноутбука или телефона этот ip адрес (важно: ноутбук или телефон должен быть подключен к этой же wifi сети - тем самым мы находимся в той же локальной сети, что и наш модуль и можем теперь к нему обратиться по ip адресу) и попадаем на веб-страницу, которую вшили в наш модуль. Страница простенькая - в ней только кнопка, при нажатии на которую, мы теперь можем управлять светодиодом, который нужно подключить к контакту GPIO2 на модуле (GPIO2 → GND). В скетче это const int ledPin = 2
.
Еще важное замечание: GPIO2 не должен быть замкнут на землю во время включения или перезагрузки модуля. Как и GPIO0. Похоже, этот пин тоже вводит модуль в какой-то режим при включении - точно не помню. Поэтому при включении модуля с этим скетчем, сначала отсоединяю светодиод и подключаю обратно после включения модуля. Такое небольшое неудобство - связано с тем, что на ESP мало выводов для управления сторонними устройствами.
Видео - работа скетча со светодиодом:
https://disk.yandex.ru/i/8V_itNm4-6FhdA
Сам скетч:
/**
LedAir.ino
Author: Denis Ken
Created on: 18.02.2024
Управление светодиодом по WiFI в локальной сети с помощью модуля ESP8266 ESP-01.
Светодиод подключить на пин GPIO2 через резистор
В ssid/password вбить данные своей вайфай сети, к которой подключится модуль (поддерживает только сети 2.4Ггц)
После включения/ресета модуля, посмотреть в порте монитора локальный ip-адрес модуля, который ему выдал роутер
Зайти с любого устрйства на этот ip, появится страница с кнопкой для управления светодиодом (светодиод нужно отсоединить перед включением/ресетом модуля)
*/
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
const char* ssid = "YourSSID"; // название вашей WiFi сети, которую раздает роутер
const char* password = "YourPASSWORD"; // пароль от вашей WiFi сети
const int ledPin = 2; // номер пина, на котором подключен светодиод - GPIO2
ESP8266WebServer server(80);
bool ledState = false;
const char html[] PROGMEM = R"(
<!DOCTYPE html>
<html lang='ru'>
<head>
<meta charset='UTF-8'>
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
<title>LED Air</title>
<link rel='stylesheet' href='style.css'>
</head>
<body>
<div class='container'>
<button id='button' class='button' onclick='toggleLed()'>Включить</button>
</div>
<script src='script.js'></script>
</body>
</html>
)";
const char script[] PROGMEM = R"(
/* script.js */
function toggleLed() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (xhr.status === 200) {
if (xhr.responseText === 'led_on') {
document.getElementById('button').textContent = 'Выключить';
} else {
document.getElementById('button').textContent = 'Включить';
}
} else {
console.error('Произошла ошибка: ' + xhr.status);
}
}
}
xhr.open('GET', '/toggle', true);
xhr.send();
}
)";
const char style[] PROGMEM = R"(
/* style.css */
html {
box-sizing: border-box;
}
*,
*::before,
*::after {
box-sizing: inherit;
}
h1, h2, h3, h4, h5, h6 {
margin: 0;
}
p {
margin: 0;
}
img {
max-width: 100%;
}
button {
padding: 0;
border: none;
background-color: transparent;
overflow: visible;
cursor: pointer;
}
html {
height: 100%;
}
body {
height: 100%;
margin: 0;
}
.container {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
background-color: #426564;
}
.button {
padding: 15px 20px;
background-color: #2ba4a1;
font-size: 18px;
text-transform: uppercase;
border-radius: 5px;
color: #fff;
}
.button:hover {
opacity: .8;
}
)";
void handleRoot() {
server.send(200, "text/html", html);
}
void handleCSS() {
server.send(200, "text/css", style);
}
void handleJS() {
server.send(200, "application/javascript", script);
}
void handleToggle() {
ledState = !ledState;
digitalWrite(ledPin, ledState ? HIGH : LOW);
server.send(200, "text/plain", ledState ? "led_on" : "led_off");
}
void setup() {
Serial.begin(115200);
delay(10);
digitalWrite(ledPin, LOW);
pinMode(ledPin, OUTPUT);
Serial.println();
Serial.println();
Serial.println("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// обработчик для корневого URL
server.on("/", handleRoot);
//обработчик для URL
server.on("/toggle", handleToggle);
server.on("/style.css", handleCSS);
server.on("/script.js", handleJS);
// запуск HTTP сервера
server.begin();
}
void loop() {
// обработка HTTP запросов
server.handleClient();
}