Давайте рассмотрим алгоритм работы нашей программы!
- Импортируем модули для работы с сетевыми сокетами и интерфейсами.
- Создаём объект для работы с Wi-Fi в режиме станции (STA).
- Напишем код HTML-страницы с кнопками ON и OFF и отображением текущего состояния светодиода.
- Создаём сокет для работы с TCP/IP.
- Проверяем, есть ли в запросе параметр led=on или led=off, и включаем, выключаем светодиод соответственно.
- Определяем текущее состояние светодиода для отображения на странице.
- Формируем HTML с текущим состоянием.
- Отправляем HTTP-заголовки и тело ответа.
- Закрываем соединение с клиентом.
Практически к каждому материалу есть видеоролик на YouTube и RUTUBE каналах, теорию можно прочитать в статье, а как работает устройство в железе, посмотреть в видеоролике!
Перейдем к написанию программы!
Импортируем модули для работы с сетевыми сокетами и интерфейсами import network , import socket, импортируем класс Pin для управления контактами микроконтроллера from machine import Pin, настраиваем встроенный светодиод на пине 2 как выход led = Pin(2, Pin.OUT), прописываем пароль и логин Wi-Fi сети ssid = 'test', password = '123456789' у вас будут свои параметры, не забываем менять.
Создаём объект для работы с Wi-Fi в режиме станции (STA) station = network.WLAN(network.STA_IF).
Давай разберём эту строку - station = network.WLAN(network.STA_IF) подробнее:
network — это модуль MicroPython, который отвечает за работу с сетью.WLAN — класс, который управляет Wi-Fi интерфейсом.network.STA_IF — константа, которая означает режим "станция" (station interface). В этом режиме устройство подключается к существующей Wi-Fi сети.station — переменная, в которую сохраняется объект интерфейса Wi-Fi в режиме станции.
Активируем Wi-Fi: station.active(True). Подключаемся к сети: station.connect(ssid, password). Ждем, пока не установится соединение: while not station.isconnected(): pass. Выводим IP-адрес, полученный ESP32, в терминал: print('Connected, IP:', station.ifconfig()[0]). Этот адрес мы будем использовать для доступа к нашим кнопкам через браузер.

Напишем код HTML-страницы с кнопками ON и OFF и отображением текущего состояния светодиода.
html = """<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Панель управления</title>
</head>
<body>
<center> <h1>Панель управления светодиодом</h1>
<p>Состояние светодиода: <strong>{state}</strong></p>
<a href="/?led=on"><button>ON</button></a>
<a href="/?led=off"><button>OFF</button></a></center>
</body>
</html>
"""
Далее создаем сокет для работы с TCP/IP, addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] адрес и порт (0.0.0.0 значит все интерфейсы, порт 80).
Давай разберём эту строку - addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] подробнее:
socket.getaddrinfo('0.0.0.0', 80) — вызывает функцию getaddrinfo, которая возвращает список возможных адресных структур для указанного хоста и порта.
В данном случае:
'0.0.0.0' — это IP-адрес, означающий "все сетевые интерфейсы" (bind ко всем интерфейсам).
80 — порт (обычно используется для HTTP).
sockaddr — это кортеж с адресом и портом, например, ('0.0.0.0', 80).
[0] — выбирает первый элемент из списка.
[-1] — выбирает последний элемент из этого кортежа, то есть sockaddr.
Переменная addr будет содержать кортеж с IP-адресом и портом, например:
('0.0.0.0', 80)
Это удобно, чтобы использовать addr в вызове socket.bind(addr), чтобы сервер слушал на всех интерфейсах на порту 80.
s = socket.socket() создаем сокет, s.bind(addr) привязываем сокет к адресу, s.listen(1) начинаем слушать входящие подключения (максимум 1 в очереди), print('Listening on', addr) выводим в терминал.

Основной цикл программы начинается с `while True:`. Принимаем новое подключение с клиентом и его адресом: `cl, addr = s.accept()`. Для удобства отладки выводим в терминал информацию о подключении: `print('Client connected from', addr)`. Затем получаем данные запроса, ограничивая их до 1024 байт: `request = cl.recv(1024)`. Декодируем байты в строку: `request_str = request.decode('utf-8')`. Выводим запрос в терминал: `print('Request:', request_str)`.
Разбираем первую строку HTTP-запроса: `request_line = request_str.split('\r\n')[0]`. Например, для запроса `"GET /?led=on HTTP/1.1"` получаем: `print('Request line:', request_line)`. Проверяем, содержит ли запрос параметр `led=on` или `led=off`:
if 'GET /?led=on' in request_line:
led.value(1) # Включаем светодиод
print('LED turned ON')
elif 'GET /?led=off' in request_line:
led.value(0) # Выключаем светодиод
print('LED turned OFF')
Если в запросе не обнаружено ни одного из этих параметров, программа переходит к обработке исключений.
Часть `except Exception as e:` используется для обработки ошибок. Если в блоке `try` возникает исключение, программа переходит в блок `except`. Объект исключения сохраняется в переменную `e`, что позволяет работать с ним, например, выводить сообщение об ошибке: `print('Error parsing request:', e)`. Это предотвращает аварийное завершение программы и предоставляет информацию о возникшей проблеме.
Определяем текущее состояние светодиода. Если светодиод включен, то `state = 'ON'`, иначе `state = 'OFF'`. Формируем HTML с текущим состоянием: `response = html.format(state=state)`. Отправляем HTTP-заголовки вместе с телом ответа: `cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')`. Отправляем данные через сетевое соединение: `cl.send(response)`. Закрываем соединение с клиентом: `cl.close()`.

Работать с ESP32 через Wi-Fi на MicroPython легко. В этом примере мы рассмотрели базовый способ настройки и удаленного подключения к плате ESP32.
Исходный код программы Скачать архив
Понравился проект? Не забудь поделиться им с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube и RUTUBE !
- СПАСИБО ЗА ПРОСМОТР.
- С уважением.
- Электроника и Робототехника!