Давайте рассмотрим алгоритм работы нашей программы!

  1. Импортируем модули для работы с сетевыми сокетами и интерфейсами.
  2. Создаём объект для работы с Wi-Fi в режиме станции (STA).
  3. Напишем код HTML-страницы с кнопками ON и OFF и отображением текущего состояния светодиода.
  4. Создаём сокет для работы с TCP/IP.
  5. Проверяем, есть ли в запросе параметр led=on или led=off, и включаем, выключаем светодиод соответственно.
  6. Определяем текущее состояние светодиода для отображения на странице.
  7. Формируем HTML с текущим состоянием.
  8. Отправляем HTTP-заголовки и тело ответа.
  9. Закрываем соединение с клиентом. 

 

Практически к каждому материалу есть видеоролик на  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 !

  • СПАСИБО ЗА ПРОСМОТР.
  • С уважением.
  • Электроника и Робототехника!