| |

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

История микроконтроллера ESP32: от идеи до народного любимца - читайте статью на сайте Arduino Uno Workshop - arduino ардуино электроника программирование робототехника

Всем привет =)

Недавно (ну как недавно, месяца 4 назад, но неважно) купил себе очень популярную плату ESP32 Dev Module.

В этой статье «обозрём» эту плату, посмотрим, что она умеет, что с ней делать и чем она лучше/хуже других.

Обязательно прочитайте статью до конца и поставьте 5 звёзд в конце!! Спасибо большое =)

А теперь перейдём к обзору =)

Я сделал видео-обзор платы ESP32 Dev Module (смотрите на YouTube, Rutube), в видео-обзоре использовались 3 скетча — Blink, Servo+ESP32+Смартфон, ESP32+Telegram. Эти скетчи представлены в этой статье.

Вот так надо устанавливать плату ESP32 Dev Module в макетку

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

Все логические пины 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 UnoESP8266ESP32
ПроизводительAtmel (Microchip)Espressif SystemsEspressif Systems
ЧипATMEL Mega328PESP8266EXОбычно 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 Мб
ОсобенностиВторой независимый асинхронный таймерWiFiWiFi + 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 звёзд поставьте!!!)

5/5 - (8 голосов)


Поделись!
×

Пожалуйста, отключите блокировщик рекламы!
Реклама помогает автору создавать новые статьи!
Спасибо ❤️


Как отключить блокировщик?
Для этого нажмите на значок расширения блокировщика и нажмите "Выключить на этом сайте", затем обновите страницу. Спасибо!
×

Пожалуйста, отключите блокировщик рекламы!
Реклама помогает автору создавать новые статьи!
Спасибо ❤️

Реклама RemRace
Подробная информация RemRace
Реклама