Руководства · 13 мин чтения

Модуль IoT на ESP32: 8 недель интернета вещей

Курс IoT на ESP32: таблица плана на 8 недель, решения для школьной сети и точки доступа, код веб-сервера по Wi-Fi, безопасность и этика, наборы на 8 групп и критерии итогового проекта.

Когда составляешь курс IoT на ESP32 для старших классов или колледжа, раздели модуль на четыре слоя: сначала плата воспринимает окружение (GPIO и датчики), потом подключается к сети (Wi-Fi), затем обменивается данными (веб-сервер, HTTP-клиент, сообщения) и, наконец, учится работать от батареи и быть защищённой (глубокий сон и безопасность). При двух уроках в неделю эти четыре слоя спокойно укладываются в восемь недель: две недели на железо, две на сеть и сервер, две на обмен данными, одна на питание и безопасность и неделя на итоговый проект. В конце ученики сдают устройство, которое читает датчик, показывает значение на странице, открытой с телефона, или отправляет сообщение на телефон, когда что-то происходит, имеет рассчитанное время работы от батареи и не хранит пароль в коде на виду.

Эта статья продолжает план первого урока по ESP32; установка, драйверы, кнопка BOOT и первый светодиод разобраны там и здесь не повторяются. Здесь есть таблица по неделям с целями, реальными проектами BlueGrays, понятиями и результатами, скелет еженедельного урока на 80 минут, объяснение, почему школьная сеть обычно не пускает ESP32 и как это исправить, пять вопросов для IT-службы, компилируемый код веб-сервера по Wi-Fi, раздел о безопасности и этике, список наборов на 8 групп и критерии итогового проекта. Примеры построены на таком допущении: 24 ученика работают в 8 группах по три человека, в неделю два урока (2 × 40 минут). Если класс другой, масштабируй время.

LDR для измерения освещённости на уроке IoT с ESP32
Общий датчик модуля: LDR, который читают на 2-й неделе, на 4-й неделе появляется на веб-странице, открытой с телефона.

Как устроен модуль: измерить, подключить, поделиться, сэкономить энергию

Урок по интернету вещей (IoT) учит не самому интернету, а тому, как устройство общается с другими устройствами в сети. Для этого сначала нужно что-то измерять: плате, которая подключается к Wi-Fi, но ничего не измеряет, нечего сказать в сети. Поэтому первые две недели намеренно проходят без Wi-Fi: ученики работают с кнопкой, LDR и датчиком температуры и влажности, разбираются с выбором пинов и интервалом измерений. На третьей неделе плата подключается к сети, на четвёртой становится сервером, на пятой превращается в клиента, который запрашивает данные у другого сервера, а на шестой сообщает о событии сообщением. Седьмая неделя отдана двум темам, которые пропускает большинство коротких IoT-мастер-классов: время работы от батареи и безопасность. Каждый слой строится на предыдущем, поэтому не меняй порядок; если неделя Wi-Fi пошла плохо, реши проблему с подключением, прежде чем идти дальше.

Обязательное условие: до начала модуля каждая группа должна хотя бы раз загрузить код в ESP32. Если класс до этого ещё не дошёл, сначала проведи первый урок по ESP32; если убрать проблемы с драйвером, пакетом платы и портом из недели Wi-Fi, это даст самую большую экономию времени во всём модуле.

План уроков IoT на ESP32 на 8 недель

Каждый проект из таблицы есть в BlueGrays со схемой, списком деталей и кодом. Проекты первых четырёх недель, включая подключение к Wi-Fi и веб-сервер, полностью бесплатны; проекты с HTTP-клиентом, Telegram, WebSocket и глубоким сном, которые используются с 5-й недели, относятся к Premium. Так что в первый месяц Premium не нужен ни одному ученику; что делать, когда он понадобится, написано в конце статьи.

НеделяЦельПроект BlueGraysПонятиеРезультат
1Прочитать вход и управлять выходомУправление светодиодом кнопкой на ESP32 (удержание), Управление светодиодом кнопкой на ESP32 (переключение) (бесплатно)GPIO, INPUT_PULLUP, цифровой вход и выход, переменная состоянияСветодиод, переключаемый кнопкой, и карта пинов группы
2Измерить окружениеИзмерение освещённости модулем LDR на ESP32, Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем) (бесплатно)Аналоговое чтение (12 бит, 0–4095), ADC1 и ADC2, I2C, библиотеки, интервал измеренийТаблица из 10 значений освещённости в мониторе порта, температура и влажность на LCD
3Подключить плату к сетиПодключение ESP32 к Wi-Fi в режиме STA (с экраном LCD) (бесплатно)Режим станции Wi-Fi (STA), SSID, IP-адрес, RSSI (dBm), WiFi.status(), переподключениеIP, MAC-адрес и уровень сигнала, записанные в сетевой журнал
4Превратить плату в серверАсинхронный веб-сервер на ESP32 (с выводом IP на LCD) (бесплатно) и код из этой статьиВеб-сервер, HTTP-запрос и ответ, порт 80, пути URL (/, /on, /off)Страница, которая включает светодиод с телефона и показывает значение освещённости
5Превратить плату в клиентаESP32 HTTPClient + API погоды (с экраном LCD), Точное время из интернета через NTP на ESP32 (Premium)HTTP-клиент, GET-запрос, коды статуса (200, 404), JSON, время по NTPПогода или время из интернета; чтение значения соседней группы
6Сообщить о событии сообщениемСигнализация движения на ESP32 (PIR + зуммер + светодиод + Telegram), Счётчик на WebSocket с ESP32 (2 кнопки + LCD + веб в реальном времени) (Premium)Уведомления, токен бота, HTTPS, WebSocket, идея «публикация — подписка» (MQTT)Сообщение на телефон при обнаружении движения или страница, которая обновляется сама
7Работать от батареи и защитить устройствоГлубокий сон ESP32: экономия батареи (OLED + счётчик в RTC RAM) (Premium)Глубокий сон, источники пробуждения, память RTC, средний ток, хранение паролей в отдельном файлеРасчёт времени работы от батареи и проект, в котором пароль вынесен в secrets.h
8Итоговый проектНа выбор группы, например Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем) плюс веб-страница 4-й неделиОбъединение понятий, документирование, презентацияРаботающее устройство, презентация на 3 минуты, сетевой журнал

Три замечания к таблице. Во-первых, готового проекта с MQTT в приложении нет; на 6-й неделе объясни MQTT как понятие на доске (устройства не общаются друг с другом напрямую, а публикуют сообщения в теме на сервере-посреднике, брокере, а кому интересно, подписывается на эту тему), а практическую часть сделай с уведомлением в Telegram и страницей на WebSocket. Подробности о Telegram — в статье Telegram-бот на ESP32. Во-вторых, проекту Async Web Server на 4-й неделе нужны библиотеки AsyncTCP и ESPAsyncWebServer; установи их на каждый компьютер до урока, иначе компиляция остановится на первой же строке. В-третьих, упражнению с соседней группой на 5-й неделе интернет не нужен: ESP32 группы A читает адрес /deger на сервере, который группа B собрала на 4-й неделе. Если в школе нет доступа в интернет, эта неделя всё равно работает.

Выбирая пин для датчика на 2-й неделе, думай наперёд о неделях Wi-Fi. Пины ESP32 на канале ADC2 (GPIO0, 2, 4, 12–15 и 25–27) не могут выполнять аналоговое чтение, пока включён Wi-Fi; потенциометр, который на 2-й неделе отлично работает на GPIO4, на 4-й неделе будет возвращать одно и то же неверное значение. С самого начала подключай аналоговые датчики к пинам ADC1 (GPIO32–39); поэтому и проект с LDR в приложении использует GPIO34.

Скелет еженедельного урока: 80 минут

Если каждая неделя идёт по одному и тому же скелету, ученики тратят силы на новое понятие, а не на привыкание к новому распорядку. Если два урока можно поставить подряд, план ниже работает как один блок; если нет — как две половины по 40 минут, и тогда в конце первого урока не разбирай схему, а убери её в коробку собранной. Сетевой журнал — это одностраничная запись, которую ведёт каждая группа: дата, IP-адрес платы, MAC-адрес, уровень сигнала, с какой ошибкой столкнулись и как её исправили. С 3-й недели половина всей отладки сводится к просмотру этого журнала.

МинутыЭтапЧто происходит?
0–10РазминкаОбсуждается вопрос на выходе прошлой недели, группы открывают сетевой журнал, раздаются коробки.
10–20ПонятиеЕдинственное понятие недели рисуется на доске: для 4-й недели — телефон, ESP32 и стрелки запроса и ответа между ними.
20–30Чтение кодаПроект недели выводится на проектор, сводку и пошаговое объяснение на вкладке «Разбор кода» читают вместе, ученики предсказывают вывод.
30–55Сборка и загрузкаГруппы собирают схему, загружают код и видят первый вывод в мониторе порта. Группа, у которой больше 3 минут ничего не получается, получает от тебя запасной набор.
55–70Одно изменениеКаждая группа меняет что-то одно: интервал обновления, текст страницы, порог или время сна. Изменение записывается в сетевой журнал.
70–80ЗавершениеПисьменно отвечают на вопрос на выходе, схему разбирают или убирают в коробку собранной, детали пересчитывают.

Реальность школьной сети: почему ESP32 не подключается к школьному Wi-Fi

Большинство IoT-модулей буксует из-за сети, а не из-за кода. Классическая ESP32 работает только в диапазоне 2,4 GHz; точку доступа, которая вещает только на 5 GHz, она просто не видит. Школьные сети часто используют не один общий пароль, как домашняя сеть, а корпоративную аутентификацию по логину и паролю (WPA2-Enterprise); ESP32 может её поддерживать с дополнительным кодом, но тогда в код придётся вписать пароль от личной учётной записи ученика или учителя, а на уроке это недопустимо. Гостевые сети после подключения открывают в браузере страницу подтверждения (captive portal); у ESP32 нет ни экрана, ни браузера, так что пройти эту страницу она не может: выглядит подключённой, но в интернет так и не выходит. Некоторые школы пускают только устройства, MAC-адрес которых зарегистрирован заранее. Последняя ловушка наименее известна: гостевые сети обычно изолируют устройства друг от друга (изоляция клиентов). В этом случае ESP32 подключается к сети и даже показывает свой IP-адрес, но телефон в той же сети не может достучаться до этого адреса, и веб-сервер 4-й недели так и не открывается.

Тип сетиПодключается ли ESP32?Для недели веб-сервераПримечание
Сеть 2,4 GHz с одним паролем (WPA2-PSK)ДаПодходитКак домашняя сеть; в школе ученикам редко доступна
Сеть, вещающая только на 5 GHzНет, она её не видитНе подходитЕсли сети нет в списке, сначала проверь диапазон
Корпоративная сеть с логином и паролем (WPA2-Enterprise)Технически возможно с дополнительным кодомНе рекомендуетсяВ коде оказывается пароль от личной учётной записи
Гостевая сеть со страницей подтверждения (captive portal)Подключается, но в интернет не выходитОбычно не подходитВ большинстве таких сетей включена и изоляция клиентов
Точка доступа на телефонеДа, если включён 2,4 GHzПодходитОграниченное число устройств одновременно
Отдельный роутер 2,4 GHz, не подключённый к школьной сетиДаЛучший вариантЕсли нужен интернет, согласуй подключение с IT-службой

Решение: точка доступа на телефоне или отдельный роутер

Самое быстрое решение — точка доступа на твоём телефоне. На iPhone включение Максимальная совместимость (Maximize Compatibility) в настройках «Режим модема» переводит раздачу на 2,4 GHz; на Android диапазон 2,4 GHz выбирается в настройках точки доступа. Так появляется и доступ в интернет, но телефоны принимают лишь ограниченное число устройств одновременно, и с 8 группами плюс телефонами учеников лимит быстро заполняется. Практическое правило: если 8 плат ESP32 подключены к телефону учителя, то 8 телефонов учеников, на которых откроют браузер, нельзя подключать ко второму телефону, потому что телефон и ESP32 должны быть в одной сети. Поэтому на 3-й и 4-й неделях подключи 4 группы к одной точке доступа, а остальные 4 — ко второй, и пусть каждая группа проверяет всё с одного телефона.

Если модуль будет повторяться каждый год, постоянное решение — отдельный роутер 2,4 GHz только для этого класса. Роутер работает без подключения к школьной сети; 3-я и 4-я недели и упражнение с соседней группой проходят без интернета, потому что ESP32 и телефон находятся в одной локальной сети. Интернет нужен только на 5-й и 6-й неделях (погода, NTP, Telegram); на эти две недели либо используй точку доступа на телефоне, либо заранее спланируй вместе с IT-службой подключение роутера к школьной сети. Каждую четверть меняй имя сети и пароль, а пароль администратора роутера смени в первый же день. Если физической сети нет совсем, в коде Wi-Fi-проектов приложения по умолчанию указано имя сети Wokwi-GUEST; тот же код можно попробовать с этой сетью в симуляторе Wokwi в браузере. Задай IT-службе эти пять вопросов не позже чем за две недели до начала модуля:

  1. Есть ли в школе сеть, которая вещает на 2,4 GHz с одним общим паролем (WPA2-PSK), и если есть, можно ли подключать к ней учебные устройства?
  2. Есть ли в гостевой сети captive portal и изоляция клиентов? Могут ли два устройства в одной сети достучаться друг до друга?
  3. Нужно ли заранее регистрировать устройства по MAC-адресу? Если да, к какому сроку нужен список из 9 плат?
  4. Допускают ли школьные правила отдельный роутер в лаборатории, не подключённый к школьной сети, или точку доступа на телефоне учителя?
  5. Если платам ESP32 на 5-й и 6-й неделях нужен интернет, какие соединения пропускает межсетевой экран (сайты, серверы времени, мессенджеры)?

Код: ESP32 подключается к Wi-Fi и показывает значение датчика на странице

Код ниже — основа 4-й недели; он использует только библиотеки WiFi.h и WebServer.h, которые входят в пакет платы ESP32, так что дополнительные библиотеки не нужны. Схема остаётся со 2-й недели: пин VCC модуля LDR к 3V3, GND к GND, AO к GPIO34. GPIO34 находится на ADC1, поэтому читается и при включённом Wi-Fi. Перед загрузкой замени два заполнителя AG_ADI (имя сети) и AG_SIFRESI (пароль) данными своей сети 2,4 GHz или вынеси эти две строки в отдельный файл secrets.h, как это будет сделано на 7-й неделе; если код находит этот файл, он берёт данные из него.

C++ (Arduino IDE)
1// ESP32 Wi-Fi + web sunucu: LDR değerini tarayıcıda göster / ESP32 Wi-Fi + web server: show the LDR value in a browser
2#include <WiFi.h>
3#include <WebServer.h>
4
5// Ağ bilgileri: secrets.h varsa oradan gelir / Network credentials: taken from secrets.h if it exists
6#if __has_include("secrets.h")
7#include "secrets.h"
8#else
9const char* WIFI_SSID = "AG_ADI";       // 2,4 GHz ağın adı / Name of the 2.4 GHz network
10const char* WIFI_PASS = "AG_SIFRESI";   // Ağ şifresi / Network password
11#endif
12
13const int LDR_PIN = 34;   // ADC1 pini, Wi-Fi açıkken de okunur / ADC1 pin, still readable while Wi-Fi is on
14
15WebServer server(80);     // 80 numaralı portta web sunucu / Web server on port 80
16
17// Ana sayfa: ölçümü HTML olarak gönder / Home page: send the reading as HTML
18void handleRoot() {
19  int raw = analogRead(LDR_PIN);              // 0-4095 ham değer / Raw value 0-4095
20  int percent = map(raw, 4095, 0, 0, 100);    // Modülde ışık arttıkça değer düşer / On the module the value drops as light rises
21  String html = "<!DOCTYPE html><html><head><meta charset='utf-8'>";
22  html += "<meta name='viewport' content='width=device-width'>";
23  html += "<script>setTimeout(() => location.reload(), 5000);</script>";   // 5 saniyede bir yenile / Reload every 5 s
24  html += "<title>ESP32 Grup 1</title></head><body>";
25  html += "<h1>Isik: %" + String(percent) + "</h1>";
26  html += "<p>Ham deger: " + String(raw) + "</p>";
27  html += "<p>Sinyal: " + String(WiFi.RSSI()) + " dBm</p>";
28  html += "</body></html>";
29  server.send(200, "text/html", html);        // 200 = istek başarılı / 200 = request OK
30}
31
32// Yalnız sayıyı döndüren adres / Address that returns only the number
33void handleValue() {
34  server.send(200, "text/plain", String(analogRead(LDR_PIN)));
35}
36
37void setup() {
38  Serial.begin(115200);
39  analogReadResolution(12);                   // 12 bit: 0-4095
40  WiFi.mode(WIFI_STA);                        // İstasyon modu: var olan ağa katıl / Station mode: join an existing network
41  WiFi.begin(WIFI_SSID, WIFI_PASS);
42  Serial.print("Baglaniliyor / Connecting");
43  unsigned long start = millis();
44  while (WiFi.status() != WL_CONNECTED && millis() - start < 20000) {   // En fazla 20 sn bekle / Wait up to 20 s
45    delay(500);
46    Serial.print(".");
47  }
48  if (WiFi.status() != WL_CONNECTED) {
49    Serial.println("\nBaglanamadi, yeniden basliyor / No connection, restarting");
50    delay(2000);
51    ESP.restart();
52  }
53  Serial.print("\nIP: ");
54  Serial.println(WiFi.localIP());             // Telefonda bu adresi aç / Open this address on the phone
55  server.on("/", handleRoot);                 // Ana sayfa: IP/ / Home page: IP/
56  server.on("/deger", handleValue);           // Yalnız sayı: IP/deger / Number only: IP/deger
57  server.begin();
58}
59
60void loop() {
61  server.handleClient();                      // Gelen istekleri karşıla / Serve incoming requests
62}

После загрузки открой монитор порта на скорости 115200 бод. Когда точки перестанут появляться, выводится строка с IP, например 192.168.43.57. На телефоне, подключённом к той же сети, что и ESP32, открой браузер и введи этот адрес: страница показывает процент освещённости, сырое значение и уровень сигнала и сама перезагружается каждые 5 секунд. Закрой LDR ладонью, и процент упадёт. Если добавить к адресу /deger, придёт только сырое число; на 5-й неделе ESP32 соседней группы будет читать именно этот адрес HTTP-клиентом. Если плата не может подключиться за 20 секунд, она сама перезагружается, чтобы ученикам не казалось, что она зависла. Если подключение так и не появляется, что означают коды статуса, смотри в статье ESP32 не подключается к Wi-Fi.

Если IP-адрес виден в мониторе порта, а телефон не открывает страницу, проблема почти всегда в сети, а не в коде. Телефон может быть на мобильном интернете или в другой сети, либо включена изоляция клиентов. Сначала проверь, что Wi-Fi телефона подключён к той же сети, что и ESP32; если да, а страница всё равно не открывается, переходи на точку доступа на телефоне.

Безопасность и этика: неделя, которую нельзя пропускать

На уроке IoT безопасность изучают не отдельной презентацией, а как изменение, которое ученики вносят в собственный код. В этом модуле у учеников уже есть настоящие секреты в трёх местах: пароль Wi-Fi, токен бота с 6-й недели и данные, которые они измеряют сами. Отдай вторую половину 7-й недели этим пяти темам и по каждой попроси конкретное изменение в проекте каждой группы:

  • Не вписывать пароли прямо в код: вынеси пароль Wi-Fi и токен бота в отдельный файл secrets.h и не включай этот файл, когда делишься кодом или делаешь скриншоты. Одна строка кода на проекторе — и пароль знает весь класс.
  • Менять пароли по умолчанию: админ-панели роутеров, собственный режим точки доступа (AP) у ESP32 и пароли в готовых примерах кода — это значения, которые знают все. Смени пароль классного роутера в первый же день и попроси учеников не оставлять в проектах пароли из примеров.
  • Страница открыта всем в сети: у веб-сервера из этой статьи нет экрана входа; любой в той же сети, кто знает адрес, может открыть страницу, а в проекте с адресом /on ещё и переключить светодиод. Поэтому на уроке через веб управляют только безобидными выходами вроде светодиодов, зуммеров и дисплеев; реле, подключённые к сетевому напряжению, в этом модуле не используются.
  • Сбор персональных данных: температура и освещённость не персональные данные, но датчик движения, который записывает, когда люди проходят по коридору, камера или микрофон могут ими стать. Если идея итогового проекта записывает движение, голос или изображение людей, пусть класс сначала ответит: «Кто это видит, сколько это хранится, есть ли на это разрешение?»
  • Обновления и ответственность: устройство, подключённое к интернету, нельзя настроить один раз и забыть. Покажи ученикам, что в конце модуля классный роутер выключают, токены ботов отзывают, а платы сбрасывают, и обсуди с ними, кто отвечает за устройство на протяжении всей его жизни.

Список наборов: на группу и на 8 групп

Список рассчитан на 24 ученика в 8 группах по три человека; хватает 9 наборов, включая один запасной. Большую часть деталей покупают для первых недель и потом используют снова; LCD, например, встречается в четырёх проектах со 2-й по 5-ю неделю. Пайка не нужна: модули вроде LCD с I2C и OLED подключаются перемычками «папа–мама». Если вместо модуля LDR используется голый LDR, добавь на каждую группу резистор 10 kΩ и на 2-й неделе собери делитель напряжения вместе с классом.

Что нужноНа группуНа класс (8 групп + 1 запасной)Неделя
ESP32 DevKit (30 пинов, ESP32-WROOM-32)191–8
USB-кабель с передачей данных (проверенный)1111–8
Макетная плата (830 отверстий)2181–8
Тактовая кнопка2181, 6
Светодиод 5 мм и резистор 220 Ω3 + 330 + 301, 3, 4
Модуль LDR (с выходом AO)192, 4, 5
Датчик температуры и влажности DHT22192, 8
LCD-дисплей 16x2 с I2C192–5
OLED-дисплей SSD1306 0,96″ (I2C)197
PIR-датчик движения (HC-SR501) и зуммер1 + 19 + 96
Перемычки («папа–папа» и «папа–мама»)20 + 10около 180 + 901–8
Точка доступа 2,4 GHz (на телефоне или отдельный роутер)-2 точки доступа на телефоне или 1 роутер3–8
Телефон или планшет с BlueGrays181–8

Оценивание: критерии итогового проекта

Правило итогового проекта держи простым: один датчик, одно подключение к Wi-Fi и один способ поделиться данными (веб-страница или сообщение). Группы записывают идею одним предложением в конце 6-й недели, составляют список деталей на 7-й, собирают на первом уроке 8-й недели и выступают с трёхминутными презентациями на втором. Оценивай по шести критериям ниже; каждый даёт 1–3 балла, всего 18. Общую логику критериев оценивания, форму сдачи и портфолио можно взять как есть из шаблона в статье критерии оценивания уроков Arduino.

Критерий1: Начало2: Развитие3: Освоено
Датчик и схемаСхема собрана, но значения нет или оно бессмысленноЗначение читается, выбор пина не обоснованЗначение читается правильно, объяснён выбор пина ADC1 или цифрового пина
Подключение к Wi-FiПодключается только с помощью учителяПодключается, но при обрыве связи устройство останавливаетсяПодключается, после обрыва переподключается, IP и уровень сигнала записаны
Обмен даннымиДанные только в мониторе портаСтраница или сообщение есть, но обновлять или отправлять их приходится вручнуюСтраница обновляется сама или сообщение уходит по событию автоматически
Понимание энергопотребленияНикто не знает, какой ток потребляет устройствоВремя работы от батареи посчитано, но сон не учтёнПосчитано с учётом сна и интервала пробуждения, результат объяснён
Безопасность и этикаПароль лежит в коде на видуПароль в secrets.h, данные не обсуждалисьПароль в отдельном файле, записано, какие данные собираются и кто их видит
Документация и презентацияСетевой журнал неполный, презентация — только демонстрацияСетевой журнал есть, встреченные ошибки не объясненыСетевой журнал полный, в презентации разобрана одна ошибка и её исправление

Еженедельные вопросы на выходе и чек-лист перед модулем

  1. Неделя 1: что возвращает digitalRead() на пине в режиме INPUT_PULLUP, пока кнопка нажата, и почему?
  2. Неделя 2: почему потенциометр на GPIO4 нельзя прочитать, пока включён Wi-Fi? Какие пины стоит выбрать?
  3. Неделя 3: если WiFi.status() сообщает, что подключения нет, какие две вещи стоит проверить первыми?
  4. Неделя 4: почему IP-адрес, который вводится в браузере, на следующей неделе может оказаться другим?
  5. Неделя 5: кем на этой неделе была твоя ESP32, сервером или клиентом? Что сообщают коды статуса 200 и 404?
  6. Неделя 6: что будет, если токен бота попадёт на скриншот? Какую роль в MQTT играет брокер?
  7. Неделя 7: от одной и той же батареи ESP32 работает несколько дней, если всё время включена, и несколько месяцев в глубоком сне. От чего зависит разница?
  8. Неделя 8: какие данные собирает твоё устройство, кто может их видеть и сколько они хранятся?
  • За две недели до модуля: задай IT-службе пять вопросов и по ответам выбери между точкой доступа на телефоне и роутером.
  • За две недели до модуля: пересчитай платы и напиши MAC-адрес каждой платы на её наклейке (если нужна регистрация, передай список IT-службе).
  • За неделю до модуля: установи на каждый компьютер пакет платы ESP32 и библиотеки DHT, LiquidCrystal I2C, AsyncTCP и ESPAsyncWebServer; проверь всё на одной плате.
  • За неделю до модуля: переключи точку доступа на 2,4 GHz, смени её имя и пароль, подключи ESP32 и открой её страницу с телефона.
  • За неделю до модуля: распечатай страницу сетевого журнала для каждой группы, проверь датчики и LCD и разложи их по коробкам.
  • Перед 5-й неделей: подготовь коды для Premium-проектов и расскажи ученикам, какие их данные становятся видны.

Где в модуле пригодится BlueGrays

  • Проекты на ESP32: в разделе «Обзор › Проекты» через Фильтр выбери платформу ESP32; там около 50 проектов на ESP32, от подключения к Wi-Fi до глубокого сна. У каждого есть схема, список деталей с количеством и исходный код, который можно скопировать. Копировать ссылку удобно, чтобы открыть код на компьютере.
  • Разбор кода: минуты 20–30 каждой недели проходят на этой вкладке: сводка Что делает этот код?, объяснение Шаг за шагом, раздел Если не получается и задание Твоя очередь. В проектах первых четырёх недель он бесплатный, а в Premium-проектах открывается с Premium.
  • Утилита распиновки: в утилите распиновки при выборе любого пина ESP32 показываются его тип и предупреждения; для пина ADC2 сказано, что аналоговое чтение при включённом Wi-Fi невозможно, а для пина ADC1 — что его можно читать и с включённым Wi-Fi. Идеально для проектора, когда на 2-й неделе выбирают пины. «Распиновка» — утилита Premium.
  • Калькулятор времени работы от батареи: в калькуляторе времени работы от батареи выбери готовый профиль ESP32 · глубокий сон; введи ёмкость батареи, ток и время в активном режиме, ток во сне и длину цикла, и он посчитает ожидаемое время работы и средний ток. Сравнение «всегда включена или спит» на 7-й неделе делается на этом экране. Утилита относится к Premium; бесплатным пользователям доступен «Пример расчёта».
  • Пакеты для педагогов: с 5-й недели нужны Premium-проекты, поэтому Premium должен быть хотя бы на одном аккаунте в каждой группе. Годовой пакет из 10 кодов покрывает 8 групп и учителя; это разовый платёж без автопродления, ученикам не нужно привязывать карту, в разделе Мои коды видно, кто использовал каждый код, а коды можно передать группе следующей четверти. Месячного кода на 30 дней, выданного на первом уроке 5-й недели, едва хватает на последние четыре недели; если между ними попадут каникулы, его не хватит. Подробности — в статье коды Premium для класса.

Через восемь недель у учеников есть не просто работающее устройство, а привычка думать о том, как устройство общается в сети, почему оно не подключается, сколько энергии потребляет и чьи данные собирает, а именно это и нужно в профессиональном обучении. Если хочется до урока пройтись по проектам, схемам и объяснениям «Разбора кода» каждой недели, просто включи фильтр ESP32 в приложении BlueGrays.

Частые вопросы

Сколько недель должен длиться курс IoT на ESP32?

При двух уроках в неделю 8 недель достаточно для основных понятий IoT: от датчиков и Wi-Fi до веб-серверов, уведомлений и глубокого сна. Если урок только один в неделю, растяни тот же план на 12–14 недель или объедини 5-ю и 6-ю недели. На итоговый проект отведи хотя бы один полный урок.

Можно ли вести IoT на ESP32 без школьного Wi-Fi?

Да. Пока ESP32 и телефон находятся в одной локальной сети, веб-серверу и запросам между устройствами интернет не нужен; хватит точки доступа 2,4 GHz на телефоне учителя или отдельного роутера, не подключённого к школьной сети. Интернет нужен только для внешних сервисов вроде погоды, точного времени и Telegram.

Почему ESP32 не подключается к школьному Wi-Fi?

Классическая ESP32 работает только на 2,4 GHz, поэтому сеть, вещающая только на 5 GHz, для неё не появляется. Школьные сети часто используют корпоративную аутентификацию по логину и паролю или captive portal в браузере, а некоторые пускают только зарегистрированные MAC-адреса. В таких случаях практичнее всего точка доступа на телефоне или отдельный роутер.

Почему веб-сервер ESP32 не открывается с телефона?

Чаще всего телефон не в той же сети, что и ESP32: он может быть на мобильном интернете или в другой сети Wi-Fi. Вторая причина — изоляция клиентов в гостевых сетях, при которой устройства в одной сети не видят друг друга. Подключи телефон и ESP32 к одной точке доступа и снова попробуй IP-адрес из монитора порта.

Нужно ли изучать MQTT на уроке IoT?

Не обязательно, но объяснить его как понятие стоит, потому что большинство реальных IoT-систем используют именно эту модель, где устройства обмениваются сообщениями по темам через брокер. В модуле на 8 недель достаточно сначала закрепить связь «клиент — сервер» на HTTP, а на шестой неделе познакомить с MQTT как с идеей «публикация — подписка».

Бесплатны ли проекты на ESP32 в BlueGrays?

Часть из них. Проекты, используемые в первые четыре недели этого плана, например кнопка, LDR, DHT22, подключение к Wi-Fi и Async Web Server, полностью бесплатны. Проекты с HTTP-клиентом, Telegram, WebSocket и глубоким сном относятся к Premium; для класса можно взять коды оптом в разделе «Пакеты для педагогов» на экране «Профиль».

Все проекты
Подключение ESP32 к Wi-Fi в режиме STA (с экраном LCD)
#127Продвинутый

Подключение ESP32 к Wi-Fi в режиме STA (с экраном LCD)

В этом проекте ESP32 надёжно и устойчиво к сбоям подключается к домашней сети Wi-Fi в режиме станции (STA). SSID и пароль хранятся в отдельном файле secrets.h, чтобы не утекли в Git; настроено автоматическое переподключение, а уровень сигнала RSSI и IP-адрес выводятся на I2C LCD-экран. Встроенный светодиод служит индикатором состояния. Это менеджер подключения уровня реальных устройств.

4.4(21)
34
Асинхронный веб-сервер на ESP32 (с выводом IP на LCD)
#129Продвинутый

Асинхронный веб-сервер на ESP32 (с выводом IP на LCD)

В этом проекте ESP32 превращается в асинхронный веб-сервер, которым можно управлять с телефона или компьютера в той же сети Wi-Fi. Благодаря библиотеке ESPAsyncWebServer сервер может обрабатывать несколько запросов одновременно (в отличие от классического WebServer.h, который блокируется на одном запросе). Открыв IP-адрес ESP32 в браузере, ты нажимаешь кнопки ON/OFF (маршруты /on и /off) и включаешь и выключаешь светодиод на GPIO 5.

4.8(16)
26
Управление светодиодом кнопкой на ESP32 (удержание)
#104Новичок

Управление светодиодом кнопкой на ESP32 (удержание)

Светодиод горит, когда кнопка нажата, и гаснет, когда её отпускают. Показывает, как используются цифровой входной пин ESP32 и встроенный подтягивающий резистор. Режим INPUT_PULLUP избавляет от внешнего резистора.

4.6(36)
55
Измерение освещённости модулем LDR на ESP32
#113Новичок

Измерение освещённости модулем LDR на ESP32

Наблюдение в мониторе порта в реальном времени за сырым значением ADC модуля LDR и относительным процентом освещённости, вычисленным по опорным значениям темноты и света. Этот процент — не измерение в люксах. Учит логике калибровки модуля. Идеально выполнить его перед проектом 10, потому что он нужен для определения порога.

4.6(36)
55
Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)
#117Средний

Температура и влажность с DHT22 на ESP32 (с LCD-дисплеем)

Этот проект измеряет температуру и влажность воздуха датчиком DHT22 и в реальном времени показывает данные на I2C LCD 16x2. Данные читаются с датчика по однопроводному протоколу через библиотеку Adafruit DHT. Проект служит основой для IoT-метеостанций, умного дома или систем мониторинга среды в теплицах. Связь с DHT22 идёт через пин GPIO 4 у ESP32.

4.8(38)
56
ESP32 HTTPClient + API погоды (с экраном LCD)
#133Продвинутый
Premium

ESP32 HTTPClient + API погоды (с экраном LCD)

В этом проекте ESP32 через HTTPClient.h делает вызов REST API к сервису погоды (wttr.in) через интернет. Полученный ответ в JSON разбирается с помощью ArduinoJson v7, а город, температура, влажность, погода и ветер выводятся на I2C LCD на турецком и английском. wttr.in бесплатен и не требует ключа API — достаточно указать любое название города, чтобы получить текущую погоду. Данные автоматически обновляются каждые 30 минут.

4.7(13)
20
Сигнализация движения на ESP32 (PIR + зуммер + светодиод + Telegram)
#145Продвинутый
Premium

Сигнализация движения на ESP32 (PIR + зуммер + светодиод + Telegram)

Умная охранная сигнализация, которая при обнаружении движения PIR-датчиком включает зуммер и светодиод и одновременно сразу отправляет владельцу уведомление в Telegram. В ней есть 30-секундная пауза, ограничивающая частоту повторных тревог; этот механизм не проверяет срабатывания PIR и не устраняет ложные тревоги. Подходит для дома, гаража, склада или мастерской. С ESP32-CAM можно добавить уведомления с фото, а с обычной ESP32 DevKit V1 приходят текстовые.

0.0(0)
9
Глубокий сон ESP32: экономия батареи (OLED + счётчик в RTC RAM)
#135Продвинутый
Premium

Глубокий сон ESP32: экономия батареи (OLED + счётчик в RTC RAM)

Режим глубокого сна (Deep Sleep) у ESP32 снижает потребление до ~10 µA, выключая процессор и большую часть периферии, — это важно для IoT-устройств на батарейках. В этом проекте используются три источника пробуждения: таймер (15 секунд), внешний пин (EXT0 — кнопка GPIO 33) и касание (T0/GPIO 4). Переменные с RTC_DATA_ATTR сохраняются во время глубокого сна — счётчики загрузок, пробуждений по таймеру и по кнопке ведутся непрерывно.

4.3(10)
16