
Обзор платы ESP32 Dev Module, сравнение с Arduino Uno и ESP8266, три интересных скетча: Blink, управление серво с телефона и управление светодиодом через Telegram бота.

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

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

Вот так выглядит шилд специально для этой платы на 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. Но она ничуть не такого же размера =))) И не знаю, зачем сделали такую форму платы шилда, вроде даже отверстия для крепления на винтики не совпадают.

Все логические пины ESP32 имеют ШИМ. Почти все являются входами-выходами, только пины 34, 35, 36 и 39 являются только входами. Пины TX0 и RX0 используются только для UART0. На плате есть 2 пина земля и два питания — вход 5 вольт и выход 3.3 вольта. На плате есть 2 SPI и 2 UART.
Вот таблица сравнения 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 |

Простой скетч для простого мигания простым светодиодом на пине D2 =)
Светодиод будет светиться 1 секунду (1000 миллисекунд) и не светиться 1 секунду.
На плате ESP32 Dev Module светодиод подписан символами «D2».
```cpp
void setup(){
pinMode(2, OUTPUT); // Пин D2 (GPIO2) настраиваем на выход
}
void loop(){
digitalWrite(2, HIGH); // Включаем светодиод
delay(1000); // Ждём 1 секунду/1000 миллисекунд
digitalWrite(2, LOW); // Выключаем светодиод
delay(1000); // Ждём 1 секунду/1000 миллисекунд
}
`

Очень интересный проект — на телефоне открываем страничку платы, на ней есть слайдер. Двигаем его — и сервопривод двигается на нужный градус =)
Скетч написано на основе библиотеки GyverPortal. Её нужно обязательно установить заранее в Arduino IDE.
Управление серво на ESP32 отличается от Arduino Uno. Нужно указывать дополнительные параметры (строки 57-60 и 63), а также библиотека сервопривода на ESP32 может конфликтовать с другими библиотеками.
В этом скетче библиотеки не конфликтуют и можно спокойно загружать скетч в плату.
Внимание! В строках 67-71 обязательно укажите вид подключения к WiFi. А также в строках 5 и 6 введите имя и пароль вашей существующей WiFi сети (если подключите плату к роутеру) или придумайте имя-пароль для новой сети, которую плата создаст.
```cpp
#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();
}
`

Скетч для включения и выключения светодиода на плате 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.
```cpp
#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);
}
`
На этом всё. Надеюсь вам статья понравилась =) Спасибо за внимание!
Подключите школу к пилоту. Генерируйте КМЖ за 2 минуты, ведите CodeStudio уроки, заказывайте оборудование — всё в одном месте.