Управляем ESP32 через Telegram!! Обзор и тест ESP32 Dev Module

Всем привет =)
Недавно (ну как недавно, месяца 4 назад, но неважно) купил себе очень популярную плату ESP32 Dev Module.
В этой статье «обозрём» эту плату, посмотрим, что она умеет, что с ней делать и чем она лучше/хуже других.
Обязательно прочитайте статью до конца и поставьте 5 звёзд в конце!! Спасибо большое =)
А теперь перейдём к обзору =)
Я сделал видео-обзор платы ESP32 Dev Module (смотрите на YouTube, Rutube), в видео-обзоре использовались 3 скетча — Blink, Servo+ESP32+Смартфон, ESP32+Telegram. Эти скетчи представлены в этой статье.

1. ВНЕШНИЙ ВИД, ПИНЫ, ПОРТЫ, ЧИПЫ
Плата состоит из двух плат — основной с обвязкой для модуля, питанием, всеми пинами, TTL конвертером, USB Type-C портом и кнопками режима загрузки (BOOT) и перезагрузки платы (EN). А также на основной плате расположена маленькая платка модуля с самим чипом ESP32 и чипом памяти.
Все пины формата ПАПА, расположены с нижней стороны платы. В макетку плата не установится, нужно две макетки параллельно. И с как минимум одной макетной платы надо будет отсоединить одну шину питания, иначе плата ESP32 не влезет =)))
Чтобы было удобнее пользоваться этой платой, китайцы специально создали удобненький шилд, о котором сейчас поговорим.

2. ВНЕШНИЙ ВИД ШИЛДА
Вот так выглядит шилд специально для этой платы на 30 пинов. С его помощью можно запитать схему от 9 вольтовой батарейки CRONA через переходник, подключенный в разъём 6 мм. Питание для платы 5V формируется понижайкой 1117 до 5V. А сам чип питается от 3V3, которые формируются на самой плате ESP32, на шилде только 5V понижайка.
Также можно запитать плату от USB Type-C и Micro-USB.
Для каждого GPIO пина подведена земля и питание. Напряжение питания для всех пинов можно выбрать с помощью жёлтой перемычки. На выбор даются 5 и 3.3 вольт. Если не хотите туда подавать питание, можно просто убрать перемычку.
Особенно удобно подключаются сервоприводы, так как не нужно добавлять провода, просто берите кабель сервы и подключайте в соответствующем положении. В начале полос с пинами есть шелкография с обозначением пинов — S, V, G. S это линия с пинами ESP32 платы, V это линия питания, G это линия земли.
Кстати, чуть не забыл =))) По виду этот шилд похож на Arduino Uno. Но она ничуть не такого же размера =))) И не знаю, зачем сделали такую форму платы шилда, вроде даже отверстия для крепления на винтики не совпадают.
3. РАСПИНОВКА ПЛАТЫ ESP32 Dev Module

Все логические пины ESP32 имеют ШИМ. Почти все являются входами-выходами, только пины 34, 35, 36 и 39 являются только входами. Пины TX0 и RX0 используются только для UART0. На плате есть 2 пина земля и два питания — вход 5 вольт и выход 3.3 вольта. На плате есть 2 SPI и 2 UART.
4. СРАВНЕНИЕ ESP32 С ARDUINO UNO и ESP8266
Вот таблица сравнения ESP32 с его предшественником, ESP8266, а также с простой и популярной Arduino Uno.
* Параметры со звёздочкой указаны примерные, возможны небольшие неточности.
| Параметр | Arduino Uno | ESP8266 | ESP32 |
|---|---|---|---|
| Производитель | Atmel (Microchip) | Espressif Systems | Espressif Systems |
| Чип | ATMEL Mega328P | ESP8266EX | Обычно ESP32-D0WD |
| Цена* | 300-600 руб. | 100-300 руб. | 200-600 руб. |
| Размер* | 5*7 см | (esp12 module) 2*3 см (wemos) 3*4 см (nodemcu) 7*3 см | (esp32 module) 2*3 см (esp32 dev board) 5*2 см |
| Тактовая частота ЦПУ | До 20 МГц | 80 МГц | До 240 МГц |
| Количество ядер ЦПУ | 1 ядро | 1 ядро | Обычно 2 ядра |
| Битность ЦПУ | 8 бит | 32 бита | 32 бита |
| Оперативная память | 2 Кб | 128 Кб | От ~520 Кб |
| Постоянная память | Встроенная, 32 Кб | Внешняя, 512 Кб — 1 Мб | Внешняя, 4 — 16 Мб |
| Особенности | Второй независимый асинхронный таймер | WiFi | WiFi + Bluetooth |
| Сложность программирования | Легко. Через Arduino IDE без дополнений. | Средне. Через Arduino IDE с установкой ядра, либо через фирменные инструменты Espressif, или PlatformIO | Средне. Через Arduino IDE с установкой ядра, либо через фирменные инструменты Espressif, или PlatformIO |

5. 3 ИНТЕРЕСНЫХ СКЕТЧА
1. Blink — мигаем светодиодом
Простой скетч для простого мигания простым светодиодом на пине D2 =)
Светодиод будет светиться 1 секунду (1000 миллисекунд) и не светиться 1 секунду.
На плате ESP32 Dev Module светодиод подписан символами «D2».
void setup(){
pinMode(2, OUTPUT); // Пин D2 (GPIO2) настраиваем на выход
}
void loop(){
digitalWrite(2, HIGH); // Включаем светодиод
delay(1000); // Ждём 1 секунду/1000 миллисекунд
digitalWrite(2, LOW); // Выключаем светодиод
delay(1000); // Ждём 1 секунду/1000 миллисекунд
}

2. Управление серво с телефона
Очень интересный проект — на телефоне открываем страничку платы, на ней есть слайдер. Двигаем его — и сервопривод двигается на нужный градус =)
Скетч написано на основе библиотеки GyverPortal. Её нужно обязательно установить заранее в Arduino IDE.
Управление серво на ESP32 отличается от Arduino Uno. Нужно указывать дополнительные параметры (строки 57-60 и 63), а также библиотека сервопривода на ESP32 может конфликтовать с другими библиотеками.
В этом скетче библиотеки не конфликтуют и можно спокойно загружать скетч в плату.
Внимание! В строках 67-71 обязательно укажите вид подключения к WiFi. А также в строках 5 и 6 введите имя и пароль вашей существующей WiFi сети (если подключите плату к роутеру) или придумайте имя-пароль для новой сети, которую плата создаст.
#include <GyverPortal.h>
#include <Servo.h>
// Настройки WiFi
const char* ssid = "SSID"; // Замените на имя вашей WiFi сети
const char* password = "PASSWORD"; // Замените на пароль от вашей WiFi сети
// Создаем объект сервопривода
Servo myServo;
const int servoPin = 4; // Пин D4 для сервопривода
// Создаем объект GyverPortal
GyverPortal portal;
// Переменная для хранения положения сервы
int servoPos = 90;
// Функция для построения интерфейса
void build() {
GP.BUILD_BEGIN();
GP.THEME(GP_DARK);
// Заголовок
GP.TITLE("ESP32 Сервопривод");
GP.HR();
// Слайдер для управления сервой с мгновенной отправкой
GP.SLIDER("slider", servoPos, 0, 180);
// Завершаем постройку интерфейса
GP.BUILD_END();
// Отправляем JavaScript отдельно
portal.sendUpdate(
"document.getElementById('slider').oninput = function() {"
"fetch('/?slider=' + this.value).then(r=>r.text());"
"};"
);
}
// Функция обработки действий
void action() {
// Если пришло значение от слайдера
if (portal.click("slider")) {
servoPos = portal.getInt("slider"); // Получаем значение
myServo.write(servoPos); // Устанавливаем положение сервы
Serial.print("Servo position: "); // Выводим в монитор порта
Serial.println(servoPos);
}
}
void setup() {
// Инициализация последовательного порта
Serial.begin(115200);
// Разрешаем использование всех таймеров ESP32 для сервопривода
ESP32PWM::allocateTimer(0);
ESP32PWM::allocateTimer(1);
ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3);
// Подключаем сервопривод
myServo.setPeriodHertz(50); // Стандартная частота для сервоприводов
myServo.attach(servoPin, 500, 2400); // Присоединяем серву с калибровкой импульсов
myServo.write(servoPos); // Устанавливаем в среднее положение
// ================ НАСТРОЙКИ ================
// Подключение к WiFi (раскомментируйте что нужно)
//WiFi.begin(ssid, password); // Подключение к внешнему WiFi
//WiFi.softAP(ssid, password); // Создаём точку доступа
// ==========================================
Serial.print("Подключение к WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("IP адрес: ");
Serial.println(WiFi.localIP());
// Инициализация GyverPortal
portal.attachBuild(build);
portal.attach(action);
portal.start();
}
void loop() {
portal.tick();
}

3. Управление светодиодом через Telegram бота
Скетч для включения и выключения светодиода на плате ESP32 на пине D2 через Telegram бота командами.
Обязательно создайте своего бота через официальный инструмент для создания ботов — BotFather. Полученный токен укажите в скетче в строке 10.
Также нужно обязательно узнать свой user_id. Его можно узнать через другого бота — UserInfoBot. Свой user_id укажите в строке 11. Это нужно, чтобы вашей платой могли управлять только вы с вашего аккаунта. И никто не смог перехватить доступ к светодиодику на вашей плате =))
P.S. Если у вас нет доступа к Telegram (нет аккаунта или др.), то этот проект не получится сделать.
В этом скетче необходим доступ в Интернет, поэтому варианта с точкой доступа нет. В строках 6 и 7 укажите имя-пароль вашей WiFi сети с доступом в Интернет (домашний/мобильный интернет).
Заранее обязательно убедитесь в наличии библиотек — WiFiClientSecure.h и UniversalTelegramBot.h. Библиотека WiFi.h уже предустановлена в Arduino IDE.
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
// Замените на свои данные WiFi
const char* ssid = "SSID";
const char* password = "PASSWORD";
// Инициализация Telegram бота
#define BOTtoken "TOKEN" // Создать своего бота можно через бота https://t.me/BotFather
#define CHAT_ID "USER_ID" // Узнать свой айди можно через бота https://t.me/userinfobot
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
// Встроенный светодиод (обычно на D2 у ESP32/ESP8266)
const int ledPin = 2; // GPIO2 (D2)
bool ledState = LOW; // Статус светодиода - выключен (0)
void setup() {
Serial.begin(115200); // После прошивки запустите монитор порта 115200
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledState);
// Подключение к Wi-Fi, режим подключения к внешней сети
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
Serial.print("Подключение к WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nПодключено! IP: " + WiFi.localIP().toString());
bot.sendMessage(CHAT_ID, "Привет! Это сообщение отправлено платой ESP32 Отправь /on или /off", "");
}
void loop() {
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
for (int i = 0; i < numNewMessages; i++) {
String chat_id = String(bot.messages[i].chat_id);
String text = bot.messages[i].text;
if (chat_id != CHAT_ID) {
bot.sendMessage(chat_id, "Доступ запрещён. Вы не владелец бота.", "");
continue;
}
if (text == "/on") {
ledState = HIGH;
digitalWrite(ledPin, ledState);
bot.sendMessage(chat_id, "Светодиод ВКЛЮЧЕН 🔵", "");
Serial.println("LED ON");
}
else if (text == "/off") {
ledState = LOW;
digitalWrite(ledPin, ledState);
bot.sendMessage(chat_id, "Светодиод ВЫКЛЮЧЕН ⚪️", "");
Serial.println("LED OFF");
}
else {
bot.sendMessage(chat_id, "Используй команды:\n/on - включить\n/off - выключить", "");
}
}
delay(10);
}
На этом всё. Надеюсь вам статья понравилась =) Спасибо за внимание!
По вопросам пишите в чат в Telegram.
(5 звёзд поставьте!!!)


