Текст
                    м. В. мырадов
п И. Павлов

М. В. Мырадов, Д. И. Павлов Первые шаги в lo l Учебное пособие Москва Вологда «Инфра-Инженерия» 2026
УДК 004.42 ББК 32.973 М94 Рецензенты: канд. пед. наук (Корпоративный университет развития образования) Филиппов Владимир Ильичу канд. пед. наук (Московский педагогический государственный университет) Салахова Алена Антоновна Мырадов, М. В. М94 Первые шаги в 1оТ : учебное пособие / М. В. Мырадов, Д. И. Павлов. - Москва ; Вологда : Инфра-Инженерия, 2026. - 132 с. : ил., табл. ISBN 978-5-9729-3104-0 Служит вводным курсом в мир современных технологий: микроконтроллеров, ин- тернета вешей (1оТ) и автоматизации. Даны основы работы с микроконтроллером ESP32 и принципы создания Telegram-ботов, с помощью которых можно управлять устрой- ствами, получать данные о г датчиков и создавать простые, по интересные проекты: от умных ламп до метеостанций. Содержит пошаговые инструкции, схемы подключе- ния, программный код и практические задания, что делает его понятным и доступным даже для начинающих. Для студентов, обучающихся по направлению подготовки 15.02.10 «Мехатроника и робототехника». Может быть полезно специалистам в области мехатронных систем. УДК 004.42 ББК 32.973 ISBN 978-5-9729-3104-0 © Мырадов М. В., Павлов Д. И.. 2026 © Издательство «Инфра-Инженерия», 2026 © Оформление. Издательство «Инфра-Инженерия», 2026
Глава I. ВВЕДЕНИЕ И ОСНОВЫ Урок № 1.1. ESP32 + Telegram = Умные устройства Мы планируем • Узнать, что такое «умные устройства» и где они применяются. • Познакомиться с микроконтроллером ESP32. • Выяснить, как мессенджер Telegram может помочь в управлении устройствами. • Понять, почему комбинация ESP32 и Telegram является аффективным и популярным решением для создания собственных проектов. Читаем. Введение в мир интернета вещей (1оТ) В современном мире все большее распространение получают «умные устройст ва», ко- торые являются ключевым элементом концепции интернета вещей (Internet of Things. IoT). Под умным устройством понимается обычный бытовой предмет (лампа, розетка, кормушка), который благодаря подключению к интернету обретает способность выполнять команды ди- станционно или передавать информацию своему владельцу. Интернет вещей - это глобальная сеть таких взаимосвязанных объектов, способных собирать данные и обмениваться ими. Проекты, создаваемые в этой области собственными силами, принято называть DIY-проектами (от англ. Do It Yourself - «сделай сам»). Представьте себе дом. который автоматически заботится о своем владельце: система включает освещение при входе в комнату, самостоятельно осуществляет полив растений на основе данных о влаж- ности почвы и по расписанию кормит домашних питомцев. Это становится возможным благодаря интеграции в обычные предметы микрокошрол- леров и сенсоров, которые подключаются к сети и позволяют реализовать сложную логику взаимодействия. Далее мы рассмотрим ключевые компоненты, необходимые для создания подобных систем. ESP32 + Telegram = Ваши Умные Устройства ESP32: Мозг проекта Интернет вещей (1оТ) своими руками (DIY) Telegram: Ваш универсальный пульт Доступность: Недорого и просто для старта. Гибкость: Ограничено только вашей фантазией. Удаленное управление: Контроль из любой точки мира.
Интересный факт Первая идея умного дома появилась в 1950 году. Инженер Эмиль Матиас придумал кон- цепцию дома, где при нажатии на кнопки, расположенные по всему периметру, автома- тизировано выполнялись бытовые задачи. Читаем. Введение в мир интернета вешен (1оТ) Для создания любого 1оТ-проскта необходимы два ключевых элемента: «мозг» устрой- ства, отвечающий за обработку информации и выполнение команд, и интерфейс, посредством которого пользователь может управлял ь этим устройством. В наших проектах эти роли выпол- няют микроконтроллер ESP32 и мессенджер Telegram. Микроконтроллер ESP32 представляет собой мощный и компактный вычислитель- ный модуль, который служит «мозгом» для широкого спектра DIY-проектов. Его ключевым преимуществом является наличие встроенных модулей беспроводной связи, таких как Wi-Fi и Bluetooth, что позволяет устройству легко подключаться к интернету. Кроме того, плата оснащена множеством портов ввода-вывода (GP1O) для подключения разнообразных датчи- ков и исполнит ельных модулей. В сравнении с популярной платформой Arduino, ESP32 является значительно более производительным решением. Если Arduino требует дополнительных модулей (shields) для выхода в сеть, то у ESP32 эта фупкционачьность встроена по умолчанию, что делает его иде- альным выбором для разработки проектов в сфере интернета вещей. Мессенджер Telegram в контексте JoT-проектов выходит за рамки простого средства для общения. Благодаря развитому API для создания ботов, он превращается в мощный и уни- версальный инструмент для управления умными устройствами. Telegram-бот - это специаль- ный аккаунт, управляемый программой, который может принимать команды от пользователя и отправлять ему информацию. С помощью богов Telegram трансформируется в удобный пульт управления для проек- тов на базе ESP32. Пользователь может отправлять текстовые команды, а устройство, полу- чив их через интернет, будет выполнять соответствующие действия. Ключевое преимущество такого подхода заключается в глобальной доступности: управлять устройством и получать от него данные можно из любой точки мира, где есть доступ к интернету. Изучаем на примере. Практическое применение Теоретические концепции обретают ясность при рассмотрении практических примеров их реализации. Анализ существующих устройств помогает лучше понять потенциал технологии и вдохновляет на создание собственных проектов. Ниже приведены несколько примеров ум- ных устройств, построенных на связке ESP32 и Telegram. • Умная розетка. Устройство предназначено для дистанционного управления питанием элек- троприборов. Микроконтроллер ESP32, получая команды через Telegram-бота, управляет со- стоянием реле, которое замыкает или размыкает электрическую цепь розетки. Telegram слу- жит интерфейсом для отправки команд (вкл./выкл.) и получения статуса. • Домашняя метеостанция. Устройство предназначено для сбора и передачи климатических данных. Микроконтроллер ESP32 считывает показания с подключенных датчиков темпера- туры и влажности. Telegram служит интерфейсом для запроса актуальных данных, которые бот отправляет пользователю в ответном сообщении.
• Система полива растений. Устройство предназначено для автоматизации ухода за расте- ниями. Микроконтроллер ESP32 отслеживает состояние 1рунта с помощью датчика влажности почвы и при необходимости активирует насос. Telegram служит интерфейсом для ручного управления системой и получения уведомлений о выполненном поливе. • Кормушка для питомца. Устройство предназначено для автоматической выдачи корма до- машним животным. Микроконтроллер ESP32 по расписанию или по команде управляет сер- воприводом, открывающим отсек с кормом. Telegram служит интерфейсом для отправки ко- манды немедленной выдачи корма или изменения расписания. Читаем. Преимущества связки F.SP32 и Telegram Комбинация микроконтроллера ESP32 и мессенджера Telegram завоевала широкую популярность в среде DIY-разработчиков благодаря ряду весомых преимуществ, которые делают создание 1оТ-просктов доступным и эффективным. Проанализируем ключевые досто- инства этою тандема. 1. Доступность. Экономическая составляющая является одним из главных факторов. Платы ESP32 и сопутствующие электронные компоненты (датчики, реле) имеют низкую сто- имость. В то же время мессенджер Telegram является полностью бесплатным, как и его API для создания ботов, что минимизирует затраты на программную часть проекта. 2. Простота. Порог вхождения для разработки на ESP32 относительно невысок, осо- бенно для тех, кто уже знаком с основами программирования на платформе Arduino. Среда разработки и синтаксис во многом схожи. Для интеграции с Telegram существуют готовые библиотеки, которые абстра] ируют сложные сетевые взаимодействия и позволяют управлять ботом с помощью простых команд. 3. Гибкость. Данная связка предоставляет практически неограниченные возможности для творчества. Благодаря большому количеству портов на ESP32 и широкому ассортименту доступных датчиков и модулей можно создать практически любое умное устройство, от прос- той системы уведомлений до сложного комплекса управления домом. Единственным ограни- чением становится фантазия разработчика. 4. Удаленное управление. Это фундаментальное преимущество для любого 1оТ-проскта. Использование Telegram в качестве интерфейса позволяет управлять устройствами и получать от них информацию из любой точки планеты, где есть подключение к интернету, обеспечивая настоящий дистанционный контроль. Именно эта синергия простоты и функциональности превратила связку в мощный инструмент для энтузиастов, позволяя создавать даже миниа- тюрные устройства, о чем свидетельствует следующий факт. Интересный факт Платы ESP32 имеют различные модификации, и некоторые из них настолько малы, что их можно вставлять в крошечные проекты, как умные кошельки, брелки или подвески. Выполняем по образцу Подумайте и запишите три примера умных устройств, которые вы видели в жизни или о ко- торых слышали. Для каждого примера кратко опишите: 1) его основную функцию, 2) как он получает информацию или команды и 3) как он взаимодействует с пользователем или окружающей средой.
Пример: - умные часы (показывают уведомления с телефона, считают шаги); - робот-пылесос (сам убирает квартиру по расписанию); - умная колонка (отвечает на вопросы, включает музыку голосом). Подсказка Вспомни, какие устройства в твоем доме или у друзей подключаются к Wi-Fi или управляются с телефона. Это могут быть лампочки, чайники, камеры и т. д. Обсуждаем. Критический анализ технологии Изучение любой технологии будет неполным без критического осмысления ее особенно- стей. Важно не только понимать преимущества, но и анализировать возможные ограничения и недостатки. Это позволяет делать осознанный выбор инструментов для своих проектов. • Какие преимущества дает использование Telegram для управления умными устройствами в проектах по сравнению, например, с созданием специального мобильного приложения? * Какие могут быть недостатки у умных устройств, подключенных к интернету Выполняем самостоятельно Чем ESP32 лучше платы Arduino для создания устройства, которое должно отправлять сооб- щения. когда человек не дома? Выполняем самостоятельно Схематично изобрази, как ESP32, подключенный к нему датчик и Telegram связаны между собой для передачи информации пользователю. Стрелками покажи направление передачи информации. Интересный факт Telegram был создан Павлом Дуровым, одним из основателей социальной сети «ВКонтакте». Одной из ключевых особенностей Telegram с самого начала была безопасность и шифрова- ние переписки. API для богов появилось позже и открыло О1ромные возможности для раз- работ ЧИКОВ. Задание для любознательных Поищи в интернете информацию о других микроконтроллерах с Wi-Fi, которые можно ис- пользовать для создания умных устройств (например. ESP8266. Raspberry Pi Pico W). Чем они похожи на ESP32, а чем отличаются? Подведем итог В ходе этого урока мы заложили теоретическую основу для создания 1 оТ-устройств. Мы выяснили, что «умные» технологии делают нашу жизнь удобнее, а такие инструменты, как
ESP32 и Telegram, позволяют реализовывать подобные проекты своими руками. Мы опре- делили, что ESP32 является мощным микроконтроллером со встроенной поддержкой Wi-Fi, что делает его идеальным «мозгом» для сетевых устройств В свою очередь, Telegram, благодаря своему API для ботов, может служить удобным и уни- версальным интерфейсом для удаленного управления нашими проектами. Это фундамен- тальное понимание позволит нам в дальнейшем перейти к практической реализации соб- ственных умных устройств. Полученные знания служат прочной основой для следующего урока, где мы перейдем к настройке программной среды и подготовке к написанию нашего перво! о кода.
Урок № 1.2. Подготовка к работе Правильная настройка рабочей среды - это фундамент для успешной разработки. Уделив внимание установке и конфигурации программного обеспечения сейчас, мы обеспечим быструю и беспроблемную работу над всеми будущими проектами. В рамках этого урока мы выполним следующие ключевые задачи: • Установим интегрированную среду разработки Arduino IDE. • Настроим Arduino IDE для полноценной работы с микроконтроллерами ESP32. • Познакомимся с концепцией библиотек в программировании и их ролью • Установим специализированные библиотеки (FastBot и Universal Telegram Bot) для взаимодействия с мессенджером Telegram От Идеи к Первому Слову: Подготовка и "Привет, мир!" Подготовка среды Рождение бота 1 Установить Arduino IDE new bot Atnght, a new bot. How are we going to call It? Помощник на ESP32 2. Добавить поддержку плат ESP32 Good Now let’s choose a username It rnusi eno tn ’bot' supe- _boi_esp32_test_bot Done' Congratulations Use this token to access the HTTP API [ТОКЕН] 3. Установить библиотеки: FasTBot, Universal Telegram Bot Ваш секретный ключ доступа Читаем и выполняем Для работы с ESP32 требуется установить среду, где мы будем работать - Arduino IDE. Скорее всего, она уже известна тебе, но если нет, го здесь будет подробное объяснение, как се установить. 1. Перейти на сайт https://www.arduino.ee/en/software/ и выбрать файл для установки под нужную операционную систему:
Arduino IDE 2.3.6 Новый основной релиз Arduino IDE стал еще быстрее и мощнее1 Помимо более современного редактора и более отзывчивого интерфейса, он включает в себя автодополнение, навигацию по коду и даже живой отладчик. Более подробную информацию можно наити в документации Arduino IDE 2.0 Ночные сборки с последними исправлениями ошибок доступны в разделе ниже. исходный код Arduino IDE 2.0 имеет открытый исходный код, его исходный код размещен на GitHub ВАРИАНТЫ ЗАГРУЗКИ Окна Win 10 и новее, 64 бит Окна MSI-установщи* Окна ZIP-файл Линукс Appimage 64 бит (Х86 641 Линукс ZlP-файл 64 бит (Х86-64) macOS intel. 101S> «Catalina» или новее. 64 бита macOS Apple Silicon, 11: «Big Sun» или новее, 64 бита Заметки о выпуске Далее пойдет скачивание файла. Вы сможете настроить пайку, куда хотите установить среду. После этого откройте Arduino IDE, окно должно выглядеть следующим образом: Файл Изменить Скетч Инструменты Справка во 4* Arduino SKetch may21a.mo 1 2 3 4 5 6 7 8 9 10 void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: } 2. Для работы с платами ESP32 требуется установка драйвера в Arduino IDE. Для этого перейдите в менеджер плат, введите «ESP32» и установите пак от Espressif Systems:
МЕНЕДЖЕР ПЛАТ ESP32 sketch_may21a.ino 1 2 3 4 5 /old setup() { // put your se' } Туре АП Arduino ESP32 Boards от Arduino ввести 6 void lcup() { Boards included in this package; «"«Arduino Nano ESP32 ДоПОТШПТТЬНаЯ ПНфОГ’ г пня 7 // put your ma 2 1118-. ~ УСТАНОВКА 8 9 10 esp32 т Espressif Systems 3 0 3 installed установить Boards included in this oackage: ESPectro32 SWcognijtpn wES₽32, Senses's WEIZEN Ara Ino Nano Дополшпельная пнф» >W 32 0 v UPDATE ) На рисунке дополнение уже установлено, но в будущем оно может обновляться. Для обновления потребуется нажать на кнопку еще раз. 3. Теперь можно работать с платой! Но первый код мы за1рузим в следующем уроке, а сейчас требуется установить библиотеки для работы с нашим мессенджером. Для этого сле- дует перейти в менеджер библиотек, ввести «Universal Telegram Bot», установить. То же самое проделать с библиотеками FasiBot и FastBot2\ УПРАВЛЕНИЕ БИБЛИОТЕКАМИ FastB'jt<^^3 ввести Туре. АП Topic All V FastBot от AlexGyver Д <alex@alfexgyvet.ru> Д Г Fast ESP8266/ESP32 library for II Telegram Dot (messages, menus, нажатЬте ^пс' uPdate + spiffs, fil... Допоипггельная информация sketch_me 1 2 3 4 5 6 7 8 9 10 УПРАВЛЕНИЕ БИБЛИОТЕКАМИ Skt Universal Telegram Bot Type All Topic: AH FastBot2 от AlexGyver <alex@aiexgyver ru> Fast and universal Ardumo/ESP8266/ESP32 library for Telegram bot Fast and universal.. Дополнительная информация 110 - УСТАНОВКА k J УСТАНОВКА FastBot2 or AlexCbver <alex@alexgyv|efe.HOBMTb Fast and universal «- Arduino/ESP8266/ESF12 library for Telegram bot Fast art;Universal Дополнительная пнфоХ/аиия UniversalTelegramBot от Brian Lough 1 3 0 installed У™ОВИТЬ AidumoTelegiam But litflrJry for multiple different archidcLires A Universal Telegram hbraty/or... Дополнительная информация УСТАНОВКА 1.3.0 УДАЛИТЬ
Интересный факт Arduino IDE является программным обеспечением с открытым исходным кодом (open-source). Это означает, что любой желающий может изучить, как устроена программа, внести свои предложения по улучшению и даже участвовать в ее разработке. Благодаря такой открыто- сти вокруг платформы Arduino сформировалось огромное и активное сообщество пользова- телей и разработчиков со всего мира, которые делятся знаниями, создают новые библиотеки и помогают друг другу. Читаем Для общения ESP32 с Telegram мы будем использовать специальные библиотеки. Биб- лиотека - это набор уже готового кода, который упрощает нам жизнь. Вместо того чтобы пи- сать сотни строк сложного кода для каждого действия, мы можем использовать простые ко- манды из библиотеки. На протяжении всего курса мы будем изучать библиотеку FastBot от AlexGyver. Она быстрая, удобная и отлично подходит для наших задач. Для сравнения мы также познакомимся с библиотекой Universal Telegram Bot. FastBot создана для быстрой и легкой интеграции ESP32 с Telegram. Она берет на себя много сложной работы по обмену сообщениями, позволяя нам сосредоточиться на логике нашего умного устройства. Для сравнения, библиотека Universal Telegram Bot - это еще одна популярная библио- тека. Она тоже мощная, но иногда ее использование может показаться чуть более сложным, чем FastBot. Главное отличие в том, что FastBot обрабатывает команды быстрее, чем Universal Telegram Bot. Интересный факт Автор библиотеки FaslBot, AlexGyver, - известный в русскоязычном DIY-сообществе раз- работчик, блогер и популяризатор электроники. Он создал множество полезных проектов, библиотек и обучающих материалов, которые помогли тысячам начинающих энтузиастов освоить мир микроконтроллеров и сделать сложные вещи доступными и понятными. Подсказка Обратите внимание: на скриншотах показан интерфейс современной версии Arduino IDE 2.x. Рекомендация использовать версию 1.8.13 или новее также верна, но интерфейс старых вер- сий (1.8.x) будет выглядеть иначе. Для нашего курса подойдет любая из этих версий, но мы ре- комендуем использовать последнюю стабильную версию 2.x для соответствия изображениям. Обсуждаем Почему важно устанавливать именно ту версию поддержки плат ESP32, которая рекомен- дуется (или последнюю стабильную)? Зачем нужны библиотеки в программировании? Можно ли обойтись без них? Каковы были бы последствия?
Выполняем самостоятельно Для закрепления навыков работы с менеджером библиотек выполните простое практическое задание: самостоятельно найдите, установите, а затем удалите любую другую библиотеку в Arduino IDE (например, библиотеку для работы с сервоприводами Servo или для работы с дисплеями Adafruit GFX). Интересный факт Многие платы ESP32 оснащены двумя встроенными светодиодами: красным и синим. Крас- ный светодиод, как правило, жестко подключен к линии питания и горит, когда на плату пода- ется напряжение. Синий светодиод подключен к одному из GPIO-пинов микроконтроллера, что позволяет управлять им программно - включать, выключать или заставлять мигать. Задание для любознательных Найдите информацию о том. какая именно модель чипа установлена на вашей плате ESP32. Это может быть ESP32-WROOM-32, ESP32-S2, ESP32-C3 или дру1ая модификация. Попро- буйте выяснить их основные отличия (например, по количеству ядер, поддержке Bluetooth, набору периферии). Подсказка Маркировку чипа можно прочитать на металлическом экране самого микроконтроллера или найти в описании товара в магазине, где вы приобретали плату. Подведем итог В рамках этого урока мы проделали всю необходимую подготовительную работу и достигли нескольких ключевых целей: • Установили и подготовили интегрированную среду разработки Arduino IDE. • Добавили в нее поддержку плат семейства ESP32. • Установили ключевые библиотеки, которые понадобятся нам для взаимодействия с Telegram. Теперь ваше рабочее место полностью готово к созданию первого умного устройства. На сле- дующем уроке мы перейдем от теории к практике: напишем нашу первую программу и отпра- вим дебютное сообщение из микроконтроллера ESP32 прямо в ваш Telegram’
Урок № 1.3. Первый бот с FastBot: «Привет, мир!» из ESP32 Мы планируем • Создать простого бота в Telegram. • Получить токен бота. • Отправить сообщение от ESP32 в Telegram с помощью FastBot. • Выполнить анализ фундаментальной структуры программного кода (скетча) для взаимо- действия с библиотекой FaslBot. Читаем. Основы взаимодействия с Telegram Для успешного создания умного устройства необходимо понимать теоретические ос- новы взаимодействия с платформой Telegram. Telegram-бот выступает в роли программного посредника между вашим физическим устройством (микроконтроллером ESP32) и конечным пользователем. Программный интерфейс (API), предоставляемый Telegram, является ключом к интеграции, позволяя отправлять и получать сообщения, тем самым превращая мессенджер в универсальный пульт управления для 1оТ-проектов. Telegram-бот - это специализированная учетная запись, управляемая не человеком, а программным кодом через официальный API (Application Programming Interface) Telegram. Боты способны автоматически выполнять широкий спектр задач: от отправки уведомлений до обработки сложных команд. Для администрирования ботов существует официальный сервисный аккаунт- BotFather Он представляет собой специализированного бота, разработанного командой Telegram, кото- рый используется для регистрации, настройки и управления всеми пользовательскими ботами. Ключевым элементом в этой системе является токен. Это уникальный алфавитно- цифровой ключ, который BotFather выдает после успешной регистрации вашего бота. Токен служит для аутентификации вашей программы в HTTP API Telegram и является, по сути, секретным паролем, который предоставляет полный доступ к управлению ботом. Внимание: токен является критически важным элементом безопасности. Его разгла- шение может привести к тому, что посторонние лица получат контроль над вашим ботом. Никогда и никому не сообщайте свой токен и не публикуйте его в открытом доступе. Интересный факт Технология, лежащая в основе Telegram-ботов, нс является уникальной и отражает обще- принятый отраслевой стандарт для автоматизации взаимодействия с крупными платфор- мами. Концепция программных интерфейсов (API) для создания программных агентов и управления ими является фундаментальной для современной веб-разработки. Многие другие крупные сервисы, такие как VK, используют аналогичные механизмы. Разработчики также регистрируют своп приложения или ботов через специальный интер- фейс и получают уникальные токены доступа, которые служат ключом для взаимодействия с API платформы. Это подчеркивает универсальность навыков, которые вы приобретаете, изучая данную тех- нологию.
Выполняем по образцу 1. Открой Telegram (на телефоне или компьютере). 2. В поиске найди BotFather (у него должна быть синяя галочка верификации). 3. Начни с ним чат, нажав «Start» или отправив команду /start. 4. Отправь команду /newbot, чтобы создать нового бота. 5. BotFather попросит придумать имя для твоего бота (например, «Мой Супер ESP32 Помощ- ник»). Это имя будут видеть пользователи. 6. Затем BotFather попросит придумать уникальное имя пользователя (username) для бота. Оно должно заканчиваться на bot (например. MySuperESP32Bot или my super_esp32 hot). Это имя должно быть уникальным во всем Telegram. Если имя занято, придумай другое. 7. Если все успешно, BotFather пришлет сообщение с поздравлением и токеном твоего бота. Он будет выглядеть примерно так: 1234567890:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm. Скопируй этот токен. Пример: /newgame - create a new game /hslgames - get a list of your games /editgame - edit a game /deietegame - aelete an existing game । /newbot 17‘31 17:31 Alright, a new bot. How are we going to call it? Please choose a name for your oot. Помощник на ESP32 1731 Good. Now let's choose a username for your bot. It must end in ' bot'. Like this, for example TetnsBot or tetris_bot. super_bot_esp32_test_bot Done! Congratulations on your new bot. You will find it at t.me/super_bot_esp32_test_bot. You can now ado a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just таке sure the bot is fully operational before you do this. Use this token to access the HTTP API: 7969268386AAH62Pxm5RWIHzBKwAPNJeT4bluZw6PEBzA Keep your token secure and store it safely, it can be used by anyone to control your hot. For a description of the Bot API, see this page: https://coie.telegram.org/bots/api Читаем и выполняем Теперь требуется написать и загрузить первый код на нашу плату. Откройте Arduino IDE, перейдите в инструменты плата —► esp32 —> выберите свою модель.
kumc ЮГ 2.3.2 пч Инструменты Справка АвтоФорматирование I Архивировать скетч I Управление библиотеками.. Монитор порта Построить т рафики ит Данию в мониторе порта Fwmware Updater Загрузка корневого сертификата SSL Плата "ESP32 Wrover Module ‘ Порт -ООМ18- Получитъ информацию о подключенной плате Core Debug Level; "None* Erase Al Flash Before Sketch Upload: Disabled* Flash F requency *80MHr* Flash Mode: "QIO* Partition Scheme: Default 4MB with spiffs J 2MB APP/15MB SPIFFS)* Upload Speed: *921600* Программатор Записать Загрузчик Менеджер плат.. Arduino AvR BoaiOi Atmei AVR Xplamed-minrs * ► • esp32 ’ ’ esp8266 ► ► Raspberry Pl Pko/RP2040 » ESP32H2 Dev Module ESP32C6 Dev Module FSP32S3 Dei Module FSP32C3 De. Module ESP32S2 Dev Module ESP32 Dev Module ESP32 -WROOM-DA Module ESP32 Wraver Module ESP32 PKGD4 ESP32S3 De. Module Octal (WROOM3) ESP32-S3-BOX ESP32S3 USB GIG ESP32S3 CAM LCD ESP32S2 Native USB ESP32 Wtover Kit (all versions) Aventen S3 Sync UM BUNG UM FeatherS2 UM FeatherS? Neo UM FeatherS3 В качестве примера мы будем использовать «ESP32 Wrover Module». Теперь можно писать скетч (код для платы). Скопируйте приведенный ниже код и вставьте его в окно редактора Arduino IDE. Этот скетч реализует простейшую логику: подключается к указанной сети Wi-Fi и после успешного соединения отправляет однократное приветственное сообщение в ваш Telegram-бот. В этом же коде указано, как получить свой chatID - уникальный номер Telegram акка- унта. Комментарии указывают, что делает каждая строка в коде. ВАЖНО: - Замени «ИМЯ ВАШЕЙ WIF1 СЕТИ» на реальное имя твоей Wi-Fi сети. - Замени «ПАРОЛЬ ОТ WIFI» на реальный пароль от твоей Wi-Fi сети. - Замени «ВАШ БОТ ТОКЕН» на токен, который ты получил от BotFather.
Загрузка и проверка 1. Подключите плату ESP32 к компьютеру. 2. В Arduino IDE выберите правильный COM-порт в меню «Инструменты» —> «Порт». 3. Нажмите кнопку «Загрузить» (иконка со стрелкой вправо). 4. После завершения загрузки откройте «Монитор порта» (меню «Инструменты» или иконка с лупой). 5. В правом нижнем углу окна Монитора порта установите скорость 115 200 бод. 6. Проанализируйте служебные сообщения о статусе подключения к Wi-Fi и дождитесь подтверждения отправки сообщения. Если все прошло успешно, вы только что установили первую связь между физиче- ским устройством и облачным сервисом, через несколько секунд ты получишь сообщение «Привет, мир! Я ESP32, и я использую FastBot!» от своего бота в Telegram! Первый контакт: Отправляем «Привет, мир!» из ESP32. ♦include <FastBot.h> ^include <WiFi.h> 1. Подключаем библиотеки FastBot. h для Telegram и WiFi. h для интернета Il — настройки — trdeflne WIFI SSID "ИМЯ ВАШЕЙ WIFI СЕТИ'1 ^define WIF1_PASS "ПАРОЛЬ ОТ WIFI" ^define ВОТ TOKEN "Вад БОТ TOKEri" И----------_--------------------- FastBot bot(BOT.TOKEN); void setup!) { Serial.begin!115200); wiFi.begin(wIFI_SSTD. WTFI_PASS); < Serial.print InCConnecting to WiFi..."); while (WiFi, status!) I» WL COW EC TED) { delay(500); Serial.print!".*'); Serial.printin("Connected!”); 11 Отправляем сообщение при старте 11 ВАЖНО: Сначапа напишите боту любое сообщение! oot.sendHessagernoneeT, мир! Я ESP32.", "ВАШ_СНАТ_П)И); 2 Указываем учетные данные Вставьте ваши имя Wi-Fi, пароль и токен бота 3 Инициализация Е setup!) подключаемся к сети. 4. Отправка Команда Dot.sendMessageО отправляет текст в указанный чат Ваш СНАТ_Ю можно узнать у бота ©usennfooot void loopO { // Пока пусю Подскажи На данном этапе могут возникнуть некоторые сложности. В этом разделе собраны важные советы и решения наиболее частых проблем, которые помогут вам успешно запусти гь проект. Чувствительность к регистру: имена сетей Wi-Fi (SSID) и пароли к ним являются чув- ствительными к pei истру. Убедитесь, что вы ввели их в точности так, как они заданы в на- стройках вашего роутера. Любая опечатка или неверный регистр символа приведет к ошибке подключения. Отладка через Монитор порта: если сообщение не приходит в Telegram, в первую очередь изучите вывод в Мониторе порта. Там могут содержаться сообщения об ошибках, например, о невозможности подключиться к Wi-Fi. Также перепроверьте корректность введенного токена бота и стабильность вашего интернет-соединепия.
Инициация диалога с ботом: Telegram API имеет фундаментальное правило для защиты пользователей от спама: бот не может первым написать пользователю. Чтобы бот смог отпра- вить вам сообщение, вы должны сначала инициировать с ним диалог. Для этого найдите сво- его бота в Telegram по его username и отправьте ему любое сообщение, например, стандарт- ную команду /start. Обсуждаем Критическое осмысление пройденного материала помогает закрепить знания и увидеть более широкую картину. Подумайте над следующими аналитическими вопросами. * Каковы риски безопасности, связанные с компрометацией токена вашего бота? Приведите конкретные примеры вредоносных действий, которые мог бы совершить злоумышленник. Какие программные (например, хранение токена в отдельном конфигурационном файле) и организационные (например, политика ротации токенов) меры можно предпринять для его зашиты? * Опишите полный путь прохождения информации от вызова bot.sendMessage() на микро- контроллере ESP32 до появления уведомления на вашем смартфоне. Укажите функцию каж- дою ключевого узла (Wi-Fi роутер, серверы Telegram. API-шлюз, push-уведомления Apple/ Google) в этой цепочке. • Сравните использование Telegram-бота в качестве пользовательского интерфейса для loT-проекга с созданием специализированного мобильного приложения. Оцените оба подхода по следующим критериям: скорость разработки, стоимость, порог входа для разработчика, гибкость интерфейса и удобство для конечного пользователя. Выполняем самостоятельно Для закрепления полученных навыков и поощрения самостоятельного решения практических задач выполните следующее задание. Задание: модифицируйте предоставленный скетч. Измените текст сообщения, отправляе- мого ESP32. чтобы оно включало уникальную информацию, например, название вашего про- екта или ваше имя. Пример: «Проект "Умная метеостанция" успешно запущен!». Загрузите измененный скетч в ESP32 и убедитесь, что в Telegram пришло новое, кастомизированное сообщение. Это простое упражнение поможет вам лучше освоить структуру кода и процесс его модифи- кации. Задание для любознательных Для тех, кто хочет глубже изучить возможности платформы и выйти за рамки основного материала урока, предлагается следующее усложненное задание. Задание: модифицируйте скетч таким образом, чтобы ESP32 отправлял сообщение не один раз при старте, а периодически, например, каждые 30 секунд. Для этого вам потребуется перене- сти команду boi.sendMessaget ) из функции seiup() в основной цикл void 1оор() и использовать функцию delay() для создания необходимого временного интервала между отправками. Это задание познакомит вас с концепцией выполнения повторяющихся действий - ключевым элементом для большинства 1оТ-устройств.
Подведем итог В рамках этого урока мы успешно решили несколько ключевых задач: создали и зареги- стрировали нашего первого Telegram-бота, получили для него уникальный токен доступа и, самое главное, научили микроконтроллер ESP32 отправлять сетевые сообщения прямо в мессенджер. Освоенные навыки - получение токена, базовая настройка скетча с учетными данными Wi-Fi, использование библиотеки FastBot для отправки данных - являются фундамен- тальной основой для создания всех последующих, более сложных и функциональных умных устройств. Вы заложили прочный фундамент для дальнейшего изучения мира Интернета вещей.
Урок № 2. Прием и обработка сообщений от пользователя на ESP32 На предыдущем занятии мы освоили одностороннюю связь, научив микроконтроллер ESP32 отправлять сообщения пользователю. Сегодня мы делаем ключевой шаг к созданию по-настоящему интерактивных устройств - налаживаем двусторонний диалог. Мы научим наш микроконтроллер «слышать» команды из Telegram, обрабатывать их и осмысленно реа- гировать. Этот навык является стратегически важным, так как открывает безграничные воз- можности для создания полноценных проектов «Интернета вещей», где устройство не просто информирует, но и исполняет ваши указания. Мы планируем • Изучит ь механизм получения входящих команд, отправленных пользователем в Telegram-бот. • Освоить методы чтения текста входящего сообщения и идентификации его отправителя. • Реализовать базовую обработку команд, в частности, реакцию на стандартную команду ''start. • Научить микроконтроллер ESP32 формировать и отправлять ответные сообщения поль- зователю в Telegram. Читаем Переход от «монолога» устройства к полноценному «диалогу» - это фундаментальное изменение в логике взаимодействия. Если раньше ESP32 мог только рапортовать о событиях, то теперь мы внедряем концепцию обратной связи. Это означает, что пользователь получает возможность активно влиять на работу устройства в реальном времени, отправляя команды и запросы. Такая двусторонняя коммуникация является основой для создания интсракгивных проектов, где можно удаленно управлять физическими объектами, запрашивать актуальные данные с датчиков или менять режимы работы системы из любой точки мира. Интересный факт Первые попытки создать программы, имитирующие диалог с человеком (чат-боты), пред- принимались еще в 1960-х годах! Одна из самых известных ранних программ называлась ELIZA (создана в 1966 году). Она работала по простым шаблонам, пытаясь перефразировать реплики пользователя, и стала одним из первых прототипов современных чат-ботов. Изучаем на примере Абстрактная концепция приема сообщений преобразуется в конкретные и полезные функ- ции умных устройств. Рассмотрим несколько практических сценариев. 1. Умный выключатель: пользователь отправляет в чат с ботом команды /led on и /led off. Микроконтроллер ESP32, получив соответствующее сообщение, анализирует его текст и из- меняет логический уровень на одном из своих выводов, к которому подключен светодиод, тем самым включая или выключая его. 2. Запрос данных с датчика: к ESP32 подключен датчик температуры. Пользователь, желая узнать текущий микроклимат, отправляет команду /get temp. Устройство, получив команду, обращается к датчику, считывает показания, форматирует их в текстовое сообщение и отправ- ляет ответ в тот же чат.
3. Проверка статуса устройства: по команде /status микроконтроллер может сформировать и отправить отчет о своем текущем состоянии. Например, сообщение «Статус: онлайн, под- ключен к Wi-Fi, готов к работе» подтвердит пользователю, что устройство функционирует нормально. Эти примеры иллюстрируют, как простая отправка текстового сообщения трансформируется в реальное физическое действие или получение данных. Теперь рассмот рим, как это реализу- ется на программном уровне. Читаем Для приема сообщений в библиотеке FastBot предусмотрен удобный механизм, осно- ванный на системе событий (callback). Программа не должна вручную проверять наличие со- общений в условии if - вместо этого она поручает библиотеке вызывать специальную функ- цию каждый раз, когда приходит новое сообщение. Система строится на следующих компонентах: • Функция bot.tickQ. Эту функцию можно назвать «сердцем» всего механизма полу- чения сообщений. Ее основная задача - поддерживать связь с серверами Telegram и проверять наличие обновлений и обрабатывать их. Для обеспечения минимальной задержки в реакции на команды пользователя. bot.tick() необходимо вызывать как можно чаще в основном цикле программы void 1оор(). Именно внутри этой функции происходит матия: если пришло сооб- щение, tick() сама запускает функцию обработчик. • Подключение обработчика bot.attach(). Вместо ручной проверки обновлений в FastBot используется принцип: «Скажи мне, какую функцию запустить, когда придет сообще- ние». В блоке setupO необходимо один раз вызвать bot.attach(myFunction), где myFunction - это имя вашей функции для обработки сообщений. Теперь, как только bot.tick() обнаружит новое сообщение, он автоматически выполнит код внутри этой функции. • Структура FB msg. Когда срабатывает функция-обработчик, она получает входя- щий параметр - структуру FB msg. Ее можно представить как «конверт», который библиотека передает вам в руки. В этом конверте уже разложены все данные: кто написал, куда написал и что именно написал. Вам не нужно перебирать массивы сообщений, вы работаете с кон- кретным сообщением здесь и сейчас. Поля структуры FB msg Ниже приведены основные поля структуры, к которым можно обращаться внутри функции-обработчика. Таблица Поле структуры Описание msg.text Содержит непосредственно текст сообщения, отправленною пользователем msg.userlD Уникальный идентификатор (1D) пользователя, который отправил сообщение (строка) msg.usemame Имя пользователя (username) в Telegram (без символа @). если оно задано в насщой- ках аккаунта msg.chatlD Уникальный идеи шфика гор чага, из ко юрою пришло сообщение. Это поле критиче- ски важно для отправки ответных сообщений функцией bot.sendMessage() msg.messagelD ID конкретною сообщения (полезно дтя редактирования или удаления сообщений)
Интересный факт Библиотека FastBot д.гя получения обновлений от Telegram использует механизм, называе- мый «Long Polling» (длинный опрос). Вместо того чтобы ESP32 каждую секунду спрашивал сервер «Есть сообщения? А сейчас? А сейчас?», он отправляет запрос и «зависает» в ожидании ответа от сервера до 30 секунд. Если за это время приходит новое сообщение, сервер немед- ленно отвечает. Если нет - по истечении времени сервер отвечает, что сообщений нет, и ESP32 тут же отправляет новый запрос. Это снижает нагрузку на сеть и ESP32. делая общение более эффективным. Нас Услышали: Получаем Сообщения от Пользователя bot.tick(); bot.attach(newMsg) msg.text msg.chatld Сердце бота постоянно слушаем эфир Текст сообщения Адрес для ответа Пришло новое сообщение! Выполняем по образцу Давайте напишем скетч, который будет просто принимать сообщения от пользователя и выводить их текст, а также 11) чата в Serial Monitor. Это поможет нам увидеть, как ESP32 «видит» наши сообщения.
Теперь напишите своему боту любое сообщение в Telegram. Вы должны увидеть информацию об этом сообщении в Мониторе порта. Обратите внимание на 1D чата (msg.chatld). Именно этот II) мы будем использовать, чтобы бот знал, кому отвечать. Запишите его! Он вам понадобится, если вы захотите, чтобы бот отправлял сообщения по своей инициативе или если вам нужно будет задать чат для от- ветов. Подсказка • Не забудьте заменить «ВАШ SSID WIFI», «ВАШ ПАРОЛЬ WIF1» и «ВАШ ТОКЕН БОТА» на ваши реальные данные. • После затрузки скетча на ESP32, откройте Монитор порта (Serial Monitor) в Arduino IDE (убедитесь. что скорость установлена на 115200 бод). Обсуждаем Как вы думаете, почему так важно вызывать функцию bot ,tick() в цикле 1оор()? Что произойдет, если мы забудем ее добавить или будем вызывать очень редко (например, раз в 10 секунд)? В полученном сообщении есть msg.userll) (ID пользователя) и msg.chatld (ID чата). В ка- ком случае эти два 1D будут совпадать? А когда они могут быть разными? (Подумайте о личных сообщениях боту и о добавлении бота в групповой чат). Выполняем самостоят ельно Модифицируйте предыдущий скетч. Теперь, когда пользователь отправляет боту любое сооб- щение, ESP32 должен не просто выводить его в Монитор порта, а отвечать пользователю прямо в Telegram. Ответ должен быть таким: «Привет, [имя пользователя]! Я получил твое сообщение: '[текст сообщения]'». Для получения имени пользователя используйте msg. username Для отправки ответного сообщения используйте bot. sendMessage («Текст вашего ответа», msg. chatld);. msg. chatld здесь указывает, в какой чат нужно отправить ответ. Выполняем самостоят ельно Давайте научим нашего бота понимать простую команду. Дополните скетч из предыдущего задания: Если пользователь отправляет боту текст /start. ESP32 должен ответить: «Привет! Я твой ESP32-6ot. Чем мшу помочь?» На любые другие сообщения бот может отвечать, как в Задании 1, или просто: «Я получил твое сообщение: '[текст_сообщения]'».
Код-ответ. Интересный факт В Telegram сообщения, начинающиеся с символа косой черты (/), например, /help или /settings, принято считать командами. Многие Telegram-клиенты (приложения для телефона или компьютера) даже подсвечивают такие команды и могут предлаг ать их автодополнение, если бот заранее «объявил» о своих командах через специальный бот (^BotFather. Задание для любознательных Подумайте и попробуйте найти информацию, как можно научить бога обраба1ыва1ь команды, которые содержат нс только саму команду, но и какие-то параметры? Например, команда /set led brightness 150 могла бы установить яркость светодиода в значение 150. Какие функ- ции для работы со строками (тип String) в Arduino C++ могли бы помочь «разобрать» такую команду на части? (Например, index()f(). substring(), loln1()). Подведем итог На этом уроке мы совершили значительный шаг вперед, превратив нашего бота из простого «вещателя» в полноценного «собеседника». По итогам занятия были освоены следующие ключевые навыки: • Прием сообщений от пользователей в Telegram с использованием библиотеки FastBot и функции bot.iick(). • Извлечение из входящего сообщения текста, ID чата и информации об отправителе. • Обработка простых текстовых команд па основе анализа содержимого сообщения. • Отправка ответных сообщений пользователю, что делает бота по-настоящему интерак- тивным.
Урок№ 3. Сравниваем подход: отправка и получение сообщений с Universal Telegram Bot Мы планируем На этом уроке мы познакомимся с альтернативной и очень мощной библиотекой для работы с Telegram. Наша цель - сравнить ее с уже изученной FasrBot, чтобы расширить ваш инстру- ментарий как разработчика. Понимание различных подходов к решению одной и той же за- дачи является ключевым навыком, позволяющим выбирать наиболее подходящий инстру- мент для каждого конкретного проекта. В ходе этого занятия мы: • Познакомимся с библиотекой Universal Telegram Bot • Научимся отправлять сообщения с ее помощью. • Научимся получать и обрабатывать входящие сообщения. • Сравним синтаксис и принципы работы двух библиотек. Давайте погрузимся в теорию и рассмотрим, что представляет собой эта библиотека. Читаем. Введение в Universal Telegram Bot В мире программирования редко существует единственное верное решение для какой- либо задачи. Библиотека Universal Telegram Bot - яркий тому пример. В то время как FastBot ориентирована на максимальную простоту и скорость для базовых задач, Universal Telegram Boi позиционируется как более универсальный и полнофункциональный инструмент. Она стремится предоставить разработчику доступ к максимальному количеству функций, которые предлагает официальный Telegram Bot API. Изучение таких альтернативных решений имеет стратегическую важность: это не только расширяет ваш профессиональный кругозор, но и дает свободу выбора, позволяя подбирать технологию, которая идеально соответствует тре- бованиям и сложности вашего проекта. Для более комплексных задач, где требуется тонкая настройка взаимодействия с поль- зователем, Universal Telegram Bot может предложить больше готовых решений «из коробки». Например, она имеет развитые инструменты для работы с кастомными клавиатурами и так называемым inline-режимом, что может значительно упростить создание сложных интерак- тивных ботов. Теперь давайте рассмотрим несколько любопытных фактов об этой библиотеке. Интересный факт Библиотека Universal Telegram Bot существует довольно давно и имеет большую базу поль- зователей. Одной из причин ее популярности яв.гяется стремление автора поддерживать как можно больше функций официального Telegram Bol API. Это означает, что, когда Telegram вводит новые возможности для ботов, есть шанс, что они быстрее появятся в этой библио- теке.
Изучаем на примере 11режде чем мы напишем полноценный скетч, давайте рассмотрим ключевые концепту- альные отличия в коде при работе с Universal Telegram Bot по сравнению с уже знакомой нам FastBot. Эти три примера наглядно демонстрируют разницу в философии двух библиотек. 1. Инициализация бита и безопасное соединение В отличие от FastBot. Universal Telegram Bot требует явного создания объекта WiFiClientSectfre. Это связано с тем. что Telegram API работает исключительно через безопас- ное HTTPS-соединение, которое шифрует все передаваемые данные. Объект WiFiClientSecure как раз и отвечает за установку этого защищенного канала связи, в то время как FastBot скры- вает этот процесс от пользователя. tfinclude <WiFiClientSecure.h> ^include <UniversalTelegramBot.h> const char* BOT_TOKEN = "ВАШ_Т0КЕН_Б0ТА"; WiFiClientSecure client; UniversalTelegramBot bot(BOT_TOKEN, client); 2. Отправка сообщения Для отправки сообщения используется метод bot.sendMessage(). Обратите внимание на порядок аргументов: сначала ID чата, затем текст сообщения. Третий аргумент предназна- чен для указания режима разметки (Parse Mode), например, для отправки текста в формате Markdown или HTML. Для обычного текста его можно оставить пустым. String chat.id = "BAU1_CHAT_1D"; String text = "Привет от Universal Bot!"; bot>sendMessage(chat_idt text, "“); 3. Получение обновлений (сообщений) Здесь отличие наиболее заметно. Вместо неявного вызова bot.tickQ в цикле, как в FastBot, Universal Telegram Bot использует более явный метод bot.getUpdates(). Эта функция напрямую запрашивает у сервера Telegram новые сообщения, пришедшие после последнего получен- ного. Обычно вызов этой функции opi анизуют с определенным временным интервалом, чтобы не перегружать сервер частыми запросами. Этот явный подход дает разработчику больше кон- троля. Вы можете решать, как часто опрашивать сервер, что позволяет оптимизировать се- тевой график и энергопотребление, особенно в проектах с батарейным питанием. В отличие от этого, bot.tick() скрывает эту логику, предлагая простоту в обмен на гибкость. mt numNewMessages = bot.getUpdatesfbot.last_message_received + 1); // ... затем цикл no numNewMessages для обработки bot.messages[i]
Два Пути к Диалогу: FastBot против Universal Telegram Bot FastBot "Простота и скорость" Universal Telegram Bot "Полнота функций и универсальность" Инициализация Инициализация FastBot bot(TOKEN); WiFiClientSecure client; UniversalTelegramBot bot(T(fKEN, client); Проверка сообщений Проверка сообщений bot.tickO; bot.getUpdates(...) Лучше всего для: Быстрого старта, простых задач, высокой производительности Лучше всего для: Сложных проектов, использования всех возможностей Telegram API Читаем. Сравнительная таблица FaslBot и Universal Telegram Bot Обобщая ключевые различия, можно сделать вывод о философии каждой библиотеки. FastBot стремится к максимальной простоте и лаконичности, скрывая от пользователя многие детали реализации. Это делает се идеальной для быстрых стартов и решения базовых задач с минимальным количеством кода. Universal Telegram Bot, напротив, предлагает более явный и детализированный подход. Он требует от разработчика немного больше кода для начальной настройки, но взамен предоставляет более гибкий и потенциально более мощный контроль над сложными взаимодействиями с Telegram API. Таблица Функция FastBot Universal Telegram Bot Подключение библиотеки #include <FastBct.h> #include <WiF^Clj.entSecure .h><br>#in- clude CUniversalTelegramBot.h> Инициализация FastBot bot(TOKEN); WiFiClientSecure client;<br>(Jniver- salTelegramBot bot(TOKEN, client); Отправка сообщения bot.sendMessage("текст", CHAT_ID); bot.sendMessage(CHAT_1D, "текст", ""); Проверка обновлений bot.tickf);<br>if (bot.newUpdates()) int numNewMessages = bot.getUpdates(bot.last_message_re- ceived + 1); Доступ к сообщениям FB_Message msg = bot.new- Mes[i];<br>msg.text, msg.chat.id telegramMessage &msg = bot.mes- sages [i];<br>msg.text, msg.chat_id Обработка в 1оор() bot. tick () вызывается очень часто bot. getUpdates () вызывается периодически (например, раз в секунду) Выполняем по обращу: отправка первого сообщения Перейдем к практике. Наша первая задача - написать и загрузить на ESP32 скетч, кото- рый при старте устройства отправит приветственное сообщение в ваш Telegram-чат, используя библиотеку Universal Telegram Bot.
Разбор кода 1. Блок конфигурации: вынесение всех изменяемых параметров, таких как учетные данные сети и токены, в начало файла - это ключевая практика хорошего программирования. Она позволяет легко настраивать скетч без необходимости искать эти значения в коде, что снижает риск ошибок. 2. Объекты-помощники: здесь мы создаем два ключевых объекта. WiFiClientSecure - это наш «дипломат», отвечающий за установку безопасного, зашифрованного HTTPS-соеди- нения с серверами Telegram. UmversalTelegramBot - это наш «переводчик», который исполь- зует эго соединение для форматирования наших команд в понятный для Telegram API вид. 3. Логика однократною выполнения: мы размещаем код отправки в setup(), потому что эта функция выполняется ровно один раз при старте микроконтроллера. Это идеальное место для «приветственных» действий или инициализации, подтверждающей, что устройство вышло онлайн. Прежде чем загружать скетч, ознакомьтесь с несколькими важными советами. Подсказка - Убедитесь, что у вас установлена библиотека UniversalTelegramBot через Менеджер библио- тек Arduino IDE. - Не забудьте заменить переменные WIFI SSID, WIFI PASS, ВОТ TOKEN и СНА Т ID вашими реальными данными. - Для отправки сообщения по инициативе ESP32 необходимо явно указать СНА Т ID. Вы мо- жете взять его из предыдущих уроков, где мы получали его с помощью FastBot, или через специальных ботов в Telegram. Обсуждаем Анализ кода - это не просто проверка его работоспособности, а понимание проектных ре- шений, заложенных авторами. Давайте разберем два ключевых момента, которые отли- чают философию этой библиотеки:
1. Какое основное отличие в коде инициализации бота (в setupO) вы заметили по сравне- нию с FastBot? Почему, на ваш взгляд, Universal Telegram Bot использует такой подход с WiFiClientSecurel 2. Сравните синтаксис функции bot.sendMessage() в FastBot и Universal Telegram Bot. Какие параметры совпадают, а какие отличаются по своему порядку или наличию? Выполняем самостоятельно: создание интерактивного эхо-бога Отлично, наш бог научился «говорить». Теперь научим его «слушать» и отвечать. Следующая задача - создать интерактивною эхо-бот а, который будет работать по следующему алгоритму: • При получении команды /start utb он будет приветствовать пользователя по имени. • На любое другое текстовое сообщение он будет отвечать, цитируя полученный текст. Разбор новой лоз ики Главные изменения произошли в функции 1оор() и в появлении новой функции handleNew Messages. 1. Проверка по таймеру в 1оор()\ вместо того чтобы опрашивать сервер Telegram в каждой итерации цикла, мы делаем это раз в секунду (botRequestDelay). Это снижает нагрузку на сеть и ESP32. 2. Получение обновлений: команда bot.getUpdates() запрашивает новые сообщения. Если они есть (numNev,Messages > 0), мы передаем их количество в нашу функцию-обработчик. 3. Обработка в handleNewMessages(): мы проходимся по всем полученным сооб- щениям в цикле. Внутри цикла мы для удобства создаем ссылку на текущее сообщение: telegramMessage &msg = bot messages[i],. Это позволяет нам обращаться к его свойствам, таким как 1D чата (msg.chat_id) и текст сообщения (msg.text), с помощью более короткого и читаемого синтаксиса. С помощью условия if (text == "/start _utb") мы проверяем текст команды и формируем соответствующий ответ, который отправляем обратно в тот же чат. Использование этой биб- лиотеки открывает широкие возможности, многие из которых уже реализованы другими раз- работчиками.
Интересный факт На GitHub для библиотеки UniversalTelegramBot (репозиторий автора Brian Lough) часто можно найти подробное описание поддерживаемых методов Telegram Bot API и множество примеров. Это хороший ресурс, если вы захотите использовать более продвинутые функции. Задание для любознательных Для самостоятельного изучения загляните в примеры, которые поставляются вместе с биб- лио гекой UniversalTelegramBot (в Arduino IDE: Файл -> Примеры -> UniversalTelegramBot). Найдите пример, демонстрирующий работу с inline-клавиатурами (Inline Keyboards) или обычными клавиатурами (Reply Keyboards). Попробуйте понять, как они создаются и как обрабатываются нажатия па их кнопки. Хотя мы разберем эту тему в будущих уроках, пред- варительное знакомство покажет вам всю мощь этой библиотеки. Подведем итог • На этом уроке мы сделали важный шаг в расширении вашего арсенала разработчика. Теперь вы не только знаете о существовании альтернативных инструментов, но и умеете с ними работать. • Мы познакомились с библиотекой Universal Telegram Bot - мощным инструментом для создания ботов на ESP32. • Научились отправлять сообщения и реализовали базовый ответ на команды пользователя. • Провели детальное сравнение синтаксиса и подходов Universal Telegram Bot с ранее изу- ченной FastBot. • Увидели на практике, что для решения одной и той же задачи могут существовать разные инструменты со своими сильными сторонами. Теперь в вашем арсенале есть два разных подхода к интеграции ESP32 с Telegram. Выбор между ними будет зависеть от специфики и требований вашего будущего проекта.
Урок № 4. Управление светодиодом через Telegram - первый шаг к реальным устройствам Мы планируем На предыдущих занятиях мы научились обмениваться текстовой информацией с ESP32 через Telegram. Сегодня мы совершаем ключевой переход от виртуального мира к физиче- скому. Этот урок стратегически важен, так как мы впервые будем использовать команды из мессенджера для управления реальным объектом - светодиодом. Это фундаментальный шаг, открывающий дверь в мир интернета вещей (1оТ), где цифровые команды вызывают физические действия. На этом уроке мы: • Научимся подключать светодиод к ESP32 и управлять им через цифровой выход. • Настроим Telegram-бота на прием команд от пользователя. • Реализуем код, который будет включать и выключать светодиод по команде из Telegram. • Закрепим принципы обработки входящих сообщений с FastBot. Приступим к рассмотрению аппаратной части. Читаем. Физическое подключение и основы управления Светодиод является простейшим, но важнейшим исполнительным элементом в мире электроники. Умение управлять им - это базовый навык, на котором строятся более сложные проекты. Понимая, как зажечь один светодиод, вы поймете принцип управления реле, мото- рами и другими устройствами. Что такое светодиод и GPIO1 Для успешной сборки схемы необходимо формально определить три ключевых ком- понента: • Светодиод (LED): это полупроводниковый прибор, который излучает свет при про- хождении через него электрического тока. У него есть два вывода с определенной поляр- ностью: анод (длинная ножка, подключается к «+») и катод (короткая ножка, подключается к «-» или земле). • Токоограничивающий резистор: это критически важный компонент. Светодиод нельзя подключать напрямую к выводу микроконтроллера, так как он будет потреблять слиш- ком большой гок, что приведет к его сгоранию и может повредить порт ESP32. Резистор oipa- ничивает ток до безопасного уровня. Для стандартных светодиодов обычно используется резистор номиналом 220-330 Ом. • Цифровые выходы (GPIO): GPIO (General-Purpose Input/Output) - это универсаль- ные контакты на плате ESP32, которые мы можем программно настраивать на вход или выход. Когда пин настроен как выход, он может находиться в двух состояниях: о HIGH (высокий уровень): па пин подается напряжение (для ESP32 это 3.3 В). В нашей схеме это приведет к включению светодиода. о LOH (низкий уровень): напряжение на пине отсутствует (0 В). Это приведет к вы- ключению светодиода. Изучив эти основы, мы можем перейти к сборке нашей первой физической схемы.
Изучаем на примере: схема подключения Теперь мы применим полученные теоретические знания для сборки реальной схемы. Процесс подключения очень прост и требует всего трех шагов. 1. Катод (короткая ножка светодиода): подключается к пину GND (земля) на плате ESP32. 2. Анод (длинная ножка светодиода): подключается к одному концу токоограпичи- вающего резистора (например, номиналом 220 Ом). 3. Второй конец резистора: подключается к выбранному нами цифровому пину ESP32, например, к GP1O2. Как видите, схема элементарна. Теперь, когда аппаратная часть готова, мы можем перейти к написанию программы. СХЕМА РЕАЛЬНОСТЬ Интересный факт Несмотря па простоту светодиода, именно управление таким элементом традиционно ста- новится первым шагом в освоении любой платформы - от Arduino до ESP32. С включением светодиода связано понятие «Hello. World!» в мире электроники. Теперь мы расширяем это простое действие, подключая к нему сеть, облако и обмен сообщениями в реальном времени через Telegram. Это и есть суть интернета вещей - когда простое устройство ста- новится частью распределенной интеллектуальной системы. Читаем. Программная реализация с FastBot Программный код - эго мост, который свяжет наши команды в чате Telegram с физиче- ским действием - включением и выключением светодиода. Мы напишем программу, которая будет «слушать» сообщения от бота и в зависимости от их содержания подавать высокий пли низкий сигнал на пин GP1O. Напомним, что для связи ESP32 с Telegram мы используем библиотеку FastBot Это легкий и оптимизированный инструмент, который берет па себя всю сложную работу по обмену данными с серверами Telegram, позволяя нам сосредоточиться на логике нашего устройства.
В нашем коде мы будем использовать три основные функции для управления цифро- вым выходом: • pinMode(pin, OUTPUT);', эта команда настраивает указанный пин (в нашем случае GP1O2) на работу в режиме выхода. Это необходимо сделать один раз в блоке setup(), чтобы сообщить ESP32, что мы собираемся «выдавать» сигнал с этого пина, а нс считывать. • digitalWrite(pin, HIGH);', эта команда подает высокий уровень напряжения (3.3 В) на указанный пин. Когда ток потечет через нашу схему, светодиод загорится. • digitalWrite(pin, LOW);: эта команда устанавливает на пине низкий уровень напряже- ния (О В). Цепь размыкается, ток перестает течь, и светодиод гаснет. В нашей программе мы установим простую логическую связь: если бот получает тек- стовое сообщение /оп, мы вызываем функцию digital Write (LED PIN, HIGH);. Если приходит сообщение /off, мы вызываем digitalWrite(LED PIN, LOW). От Кода к Свету: Управляем Первым Физическим Объектом ESP32 получает команду dieitalWritei ГО.РТМ, HIGH); Г АС Светодиод wr* загорается I______________ Ваша первая команда, изменившая реальный мир Теперь давайте перейдем к написанию и загрузке нашего скетча. Выполняем по образцу Пришло время объединить аппаратную и программную части. Следуйте приведенным выше инструкциям, чтобы «оживить» ваш светодиод.
• • • • • ••• • « •• ••• «<«*« •**« ««»«**«• ф«* »« •• •• •• ••• • • « * •• •• »««••« «••• а* а После того как вы вставили код, необходимо выполнить три завершающих шага: - В коде замените «ВАШ SSID», «ВАШ ПАРОЛЬ» и «ВАШ ТОКЕН» на ваши реаль- ные данные: имя вашей Wi-Fi сети, пароль от нее и токен, полученный от (cyBotFalher. - Убедитесь, чго номер пина в строке const mt LED PIN = 2; соответствует тому пипу на ESP32, к которому вы физически подключили светодиод через резистор. - Подключите плату ESP32 к компьютеру и загрузите скетч. - Откройте чат с вашим ботом в Telegram. Отправьте ему команды /оп и /off и наблю- дайте, как светодиод реагирует на ваши сообщения! Подскажи Если светодиод не загорается или работает некорректно, проверьте следующие моменты: • Проверьте полярность: убедитесь, что светодиод подключен правильно. Длинная ножка (анод) должна быть подключена к пину ESP32 через резистор, а короткая (катод) - к GND. * Соо1встствие пинов: дважды проверьте, что номер пина, указанный в коде (const int LED PIN = 2;), совпадает с тем физическим пином на плате, который вы используете. • Данные для подключения: проверьте правильность ввода имени Wi-Fi сети (SSID), па- роля и токена бота. Помните, что они чувствительны к регистру. • Диагностика: используйте инструмент «Монитор порта» в Arduino IDE (скорость 115200). Он может выводить сообщения об ошибках подключения к Wi-Fi или другую полезную от- ладочную информацию, которую мы добавили в код с помощью Serial.printlnQ. Обсуждаем Давайте поразмышляем над выполненной работой и ее значением. 1. Почему необходимо использовать токоограничивающий резистор? Что может произойти, если подключить светодиод напрямую к пину ESP32? 2. Какие еще реальные устройства можно включать таким же способом? В чем будет прин- ципиальное отличие при подключении, например, реле для управления лампой 220 В по срав- нению с подключением светодиода?
3. В чем заключаются преимущества и потенциальные недостатки управления устройством через Telegram по сравнению с физической кнопкой? (Подумайте о надежности, задержке и зависимости от сети). Выполняем самостоятельно Чтобы закрепить полученные знания, предлагаем вам выполнить два дополнительных зада- ния. Они помогут вам глубже понять логику обработки команд и управления периферией. Задание 1: Команда «/blink» Добавьте в ваш код обработку новой команды /blink. При получении этого сообщения свето- диод должен моргнуть три раза с интервалом в одну секунду (полсекунды горит, полсекунды не горит). Подсказка: для реализации этого вам понадобится цикл for и функция delay/). Задание 2: Команда «/status» Реализуйте команду /status. При ее получении 6oi должен проверить текущее состояние светодиода и отправить в Telegram ответ: «Светодиод включен» или «Светодиод выклю- чен». Подсказка: для чтения текущего состояния цифрового пипа используйте функцию digitalRead(LED PIN). Она вернет HIGH или LOW. Задание для любознательных Для тех, кто хочет изучить тему глубже, предлагаем более сложное задание. Реализуйте но- вую команду /оп5. При ее получении светодиод должен включиться, горет ь ровно 5 секунд, а затем автоматически выключиться. После того как светодиод погаснет, бот должен отпра- вить в чат сообщение «Светодиод выключен автоматически». Подведем итог На этом уроке мы совершили важный прорыв: научились управлять физическим устрой- ством, светодиодом, с помощью команд из Telegram-бота. Мы рассмотрели схему подклю- чения, написали управляющий код на основе библиотеки FastBot и реализовали интерак- тивный обмен командами между пользователем и ESP32. Вы освоили фундаментальный принцип взаимодействия между цифровой средой (Telegram) и физическим миром (светодиод). Этот навык является основой для создания более сложных JoT-проектов. В следующих уроках мы будем использовать этот же подход для управления датчиками, реле, моторами и даже бытовыми приборами.
Урок № 5. Управление несколькими светодиодами Мы планируем Переход от управления одним устройством к координации работы целой iруины - это ключевой этап в создании по-настоящему сложных и функциональных 1оТ-систсм. На этом урокс мы сделаем именно этот шаг, расширив наш предыдущий проект для управ- ления сразу несколькими светодиодами. Мы не только научимся контролировать каждый из них по отдельности, но и создадим удобные 1рупповые команды, закладывая основу для будущих, более масштабных проектов умного дома. В рамках этого занятия мы достигнем следующих целей: • Цель 1: изучить принципы подключения и управления несколькими исполнительными устройствами (светодиодами) на одном микроконтроллере ESP32. • Цель 2: разработать систему команд в Telegram для индивидуального управления каждым светодиодом. • Цель 3: создать и реализовать групповые команды для одновременного управления всеми подключенными светодиодами. • Цель 4: проаначизировать более сложные подходы к управлению, включая обработку ко- манд с параметрами и использование массивов для повышения масштабируемости кода. Читаем Масштабирование - это фундаментальный принцип, лежащий в основе любого се- рьезного проекта. Переход от управления одним светодиодом, как мы делачи на уроке № 4. к управлению несколькими устройствами является не просто количественным, а качествен- ным скачком. Именно этот навык позволяет перейти от простых экспериментов к созданию реальных систем «умного дома», где необходимо слаженно координировать работу десятков датчиков и исполнительных механизмов: ламп, розеток, приводов и реле. Аппаратная реализация гаког о проекта достаточно прямолинейна. Для управления каж- дым новым исполнительным устройством, в вашем случае светодиодом, требуется выделить отдельный цифровой вывод (GPIO) на плате ESP32. Критически важно помнить, что каждый светодиод должен быть подключен через собственный токоограничивающий резистор. Это защищает нс только сам светодиод от выгорания, но и пор гы микроконтроллера от повре- ждения из-за чрезмерно) о тока. С программной точки зрения логика также усложняется. Для каждого светодиода в коде будет определена своя константа, хранящая номер назначенного ему пина. Обработка команд от пользователя потребует более разветвленной струкгуры. Мы будем использовать цепочку условных операторов (if-else if) для анализа входящего сообщения от Telegram-бота. Программа будет последовательно проверять текст сообщения, чтобы определить, для какого именно светодиода предназначена команда (Hedl on, /led2 on и т. д.) и какое действие необ- ходимо выполнить (включить или выключить). Давайте детально разберем, как эта логика реализуется на практическом примере.
Интересный факт Как управлять десятками светодиодов, если у микроконтроллера не хватает выводов? Ла по- мощь приходит техника под названием мультиплексирование. Ее суть в том, чтобы под- ключать светодиоды в виде матрицы (строки и столбцы) и очень быстро по очереди зажигать нужные диоды в каждой строке. Из-за инерции человеческого зрения нам кажется, что все они горят одновременно! Этот метод позволяет управлять, например, 64 светодиодами, используя всего 16 выводов (8 для строк и 8 для столбцов) вместо 64. Именно так работают светодиодные кубы и матричные дисплеи. Изучаем на примере В этом разделе мы подробно проанализируем архитектуру нашего проекта, рассмотрев как аппаратную схему подключения, так и программную логику, которая приводит ее в дей- ствие. Аппаратная часть Схема подключения предельно проста и легко масштабируется Мы будем использо- вать три светодиода: 1. Анод (длинная ножка) каждого светодиода подключается через свой собственный токоотраничивающий резистор номиналом 220 Ом к отдельному цифровому выводу ESP32. Для примера мы будем использовать пины GP1O2, GP1O4 и GPIO5. 2. Катоды (короткие ножки) всех трех светодиодов объединяются вместе и подключа- ются к одному из выводов GND (земля) на плате ESP32. Программная часть Логика кода строится на нескольких ключевых принципах: • Определение пинов: в начале программы мы создаем именованные константы для каждого пина, к которому подключен светодиод (ledPinl, ledPin2, ledPin3). Это делает код более читаемым и упрощает его изменение в будущем, если потребуется сменить пины. • Инициализация в setupf): внутри функции setup() каждый из этих пинов настраи- вается на работу в режиме выхода с помощью командыpinMode(pin, OUTPUT). Это подготав- ливает их к управлению светодиодами. • Обработка команд: в основном цикле программы 1оор() мы постоянно опрашиваем бота на предмет новых сообщений. Когда сообщение поступает, его текст анализируется с по- мощью длинной цепочки условных операторов. Конструкция вида if (msg.text == *7ledl_on") { ... } else if (msg.text == 'Vledl off) { ... } else if (msg.text == "/led2_on") {... } позволяет про- грамме точно определить, какую команду прислал пользователь, и выполнить соответству- ющее действие - вызвать функцию digital Write() с нужными параметрами (ledPinl, HIGH или LOH) для управления конкретным светодиодом. Теперь, когда мы разобрали принципы работы, давайте перейдем к написанию и загрузке полного кода па нашу плату.
Оркестр Света: Управление Несколькими Светодиодами От индивидуальных команд к групповому управлению /led 2 toggle Выполняем по образцу Пришло время применить полученные знания на практике и собрать нашу систему управления. 1. Соберите схему: подключите три светодиода к пинам GPIO2, GP1O4 и GPIO5 через токоограничивающие резисторы номиналом 220 Ом. Катоды (короткие ножки) светодиодов соедините с выводом GND на ESP32. 2. Под] отовьте код: скопируйте приведенный ниже код в Arduino IDE. 3. Вставьте код. 4. Настройте переменные: в коде замените «ИМЯ ВАШЕЙ_WIFI_CETH», «ПАРОЛЬ ОТ WIFI» и «ВАШ БО7 ТОКЕН» на ваши реальные данные. 5. Загрузите и проверьте: загрузите скетч на вашу плату ESP32. После успешной загрузки и подключения к Wi-Fi отправьте вашему боту команды /ledl on, /ledl off, /led2 on и так далее, чтобы убедиться, что каждый светодиод управляется индивидуально. • • ♦ • •
Подсказка Если что-то пошло не так, проверьте следующие моменты: • Убедитесь, что номера пинов в коде (const ini ledPinl = 2;) точно соответствуют физиче- ским иннам, к которым подключены светодиоды. • Проверьте полярность светодиодов: длинная ножка (анод) должна быть подключена к пину ESP32 (через резистор), а короткая (катод) - к GND • Если команды не работают, откройте Монитор порта в Arduino IDE (скорость 1 15200), чтобы проверить сообщения о подключении к Wi-Fi и возможные ошибки. Обсуждаем • Проанализируйте текущий подход к обработке команд с помощью множества операторов if-else if. Каковы его основные недостатки при увеличении количества светодиодов до 10 или 20? • Какие преимущества может дать использование команд с параметрами (например, /led 1 on) по сравнению с созданием уникальной команды для каждого действия (/ledl оп)2 • Подумайте о групповых командах, таких как./all on. Почему реализация таких команд делает интерфейс управления более удобным для пользователя? Выполняем самоетоягельно Задание 1:групповое управление Модифицируйте существующий код, добавив две новые команды: /all on для одновремен- ного включения всех трех светодиодов и /all off для их одновременного выключения. Инструкция: для реализации вам потребуется в обработчиках этих команд последовательно вызвать функцию digital Write() для каждого пипа светодиода, устанавливая соответствующее состояние {HIGH или LOfP). Задание 2: управление по номеру (продвинутый уровень) Переработайте систему так, чтобы можно было управлять светодиодами, указывая их помер и состояние в одной команде, например: /led 1 on или /led 2 off. Подсказка: это потребует более сложного анализа (парсинга) входящей строки. Вам могут понадобиться функции работы со строками, такие как startsWithQ, indexOff) и substringO, чтобы выделить номер светодиода и команду действия. Задание для любознательных • Эффект «Бегущий огонь»: реализуйте команду /run lights, которая запускает эффект по- следовательно! о включения и выключения светодиодов. Добавьте команду /stopjeffect для его остановки. • Запрос статуса: создайте команду /all status, в ответ па которую бот присылает сообщение с текущим состоянием каждого светодиода (например. «Светодиод 1: ВКЛ. Светодиод 2: ВЫКЛ, Светодиод 3: ВКЛ»). • Рефакторинг с использованием массивов: оптимизируйте ваш код. Вместо отдельных переменных для каждог о пина используйте массив для хранения номеров пинов. Это сделает код более чистым и легко масштабируемым. • Команда-переключатель: добавьте команду /all toggle, которая инвертирует текущее состояние всех светодиодов (включенные выключаются, выключенные включаются).
Подведем итог Урок успешно завершен. Вы сделали важный шаг в освоении разработки 1оТ-устройств, перейдя от управления одиночным элементом к координации группы. В ходе этого занятия вы приобрели следующие ключевые навыки: • Управление несколькими исполнительными устройствами с одной платы ESP32. • Создание индивидуальных и групповых команд управления через Telegram-бота. • Анализ и реализация более сложных сценариев взаимодействия, включая парсинг команд и применение массивов для масштабирования. Эти навыки являются прочным фундаментом, который позволит вам в будущем создавать более сложные и mhoi окомпопентные проекты «умного дома», способные решать комплекс- ные задачи автоматизации.
Урок № 5.1. От команд к кнопкам: простое меню для бота Мы планируем На предыдущих уроках мы освоили обработку текстовых команд, что является основой для любого чат-бота. Однако для конечного пользователя ввод команд вручную не всегда удобен: можно допустить опечатку или просто забыть точную формулировку Следующим логическим шагом в улучшении пользовательского опыта яв.гяется создание интуитивно по- нятных кнопочных интерфейсов Этот урок посвящен простому, но мощному инструменту, который позволит сделать ваши проекты более профессиональными и дружелюбными. В рамках этого занят ия мы достигнем следующих целей: • Узнаем, чго такое меню-кнопки (reply keyboard) и чем они отличаются от инлайн-кнопок. • Научимся создавать простое меню с помощью функции bot. showMenu () из библио- теки FaslBot. • Сначала разберем базовый пример: создание меню для конкретного администратора при запуске устройства. • Затем создадим универсального бота, который показывает меню любому пользователю в ответ на сообщение. • Реализуем обработку нажатий на кнопки для управления устройством на ESP32. Читаем Основная проблема ручного ввода команд заключается в человеческом факторе. Опе- чатки, лишние пробелы или забытые команды могут привести к тому, чго устройство не отре- агирует на запрос. Это создает барьер для пользователей, которые не знакомы с точным син- таксисом. Кнопочные меню элегантно решают эту проблему, предлагая заранее определен- ный набор действий в удобном и наглядном формате. Медленно и легко ошибиться После Быстро, понятно, без ошибок
В Telegram существует два основных типа кнопок. Сегодня мы сосредоточимся на меню-кнопках, также известных как reply keyboard Это кнопки, которые появляются в ниж- ней части экрана, заменяя стандартную клавиатуру для ввода текста. Они идеально подходят для создания главного меню или предоставления основных команд управления. В следующем уроке мы изучим инлайн-кнопки, которые прикрепляются непосред- ственно к сообщению. Ключевое отличие для нас как для разработчиков заключается в спо- собе обработки нажатия. Меню-кнопки гораздо проще для начинающих: при нажатии на та- кую кнопку боту отправляется обычное текстовое сообщение, которое в точности совпадает с текстом на кнопке. Это означает, что мы можем обрабатывать нажатие на кнопку точно так же, как мы обрабатывали введенную вручную команду, используя уже знакомые нам кон- струкции if (msg.text == "... "). Таким образом, для главного меню или навигации, где команды не привязаны к кон- кретному сообщению, reply-клавиатура (меню-кнопки) - идеальный и простой выбор. Для кон- текстных действий, связанных с определенным сообщением (например, 'Удалить это фото?' или 'Подтвердить заказ'), лучше подходят инлайн-кнопки, с ними детально будем разбираться на следующем занятии. Интересный факт Первые графические пользовательские интерфейсы с кнопками и меню значительно сни- зили порог вхождения для работы с компьютерами, так как пользователям больше не нужно было запоминать десятки текстовых команд. Тот же принцип работает и в чат-ботах: кнопки делают управление устройством доступным для любого пользователя, даже не знакомою с командами. Изучаем на примере № 1: базовое меню (статичное) Для создания меню-кнопок в библиотеке FastBot используется всего одна простая функция - bot.showMenu(). Вся магия заключается в том, как мы формируем строку, которую передаем в эту функцию. Функция bot.showMenu() принимает строку, в которой текст кнопок и специальные символы форматирования определяют структуру будущего меню. Это позволяет очень быстро и наглядно описывать даже сложные раскладки. Для форматирования используются следующие символы: Символ Действие Пример \t Горизонтальное разделение «Кнопка! \1 Кнопка?» создает две кнопки в одном ряду \п Вертикальное разделение «Кнопка! \п Кнопка?» создает две кнопки друг под другом Вы можете комбинировать эти символы для создания сложных раскладок. Например, строка «Q Включить \t ф Выключить \п II iT Статус \п 0 Настройки» создаст меню из трех рядов: в первом ряду будут две кнопки рядом, а во втором и третьем - по одной кнопке на всю ширину.
Конструктор меню: \t и \п Разметка кнопок интуитивно понятна. Используйте \t для добавления кнопки в тот же ряд и \п для перехода на новый. Ключевой принцип, который нужно запомнить: при нажатии иа любую из этих кно- пок, ESP32 получит новое сообщение. Поле msg.text этого сообщения будет содержать строку, в точности совпадающую с текстом на нажатой кнопке. Это делает обработку нажатий пре- дельно простой. Прежде чем делать «умного» бота, давайте научимся просто показывать меню при вклю- чении устройства. В этом примере мы заранее указываем II) чата (CHAI ID), куда нужно от- править меню. Это полезно, если богом будете пользоваться только вы. Для того чтобы по- лучить chat id пользователя, вы можете поискать специализированных богов в телеграмме, либо в предыдущих уроках мы с вами выводили всю информацию про полученные данные с msg и в консоли выводилась вся информация, включая chat id пользователя. Этот код показывает меню один раз при запуске ESP32 (setup), а в loop просто ждет нажатий. Скопируйте и зат^рузите код (не забудьте вставить свой CHAT ID). В этом примере мы использовали hot.setChatID(CHAl ID}. Это удобно, когда у бота один хозяин. Функция bot.showMemi («...») здесь вызывается с одним аргументом - строкой кнопок. ESP32 отправит это меню сразу после подключения к Wi-Fi.
Изучаем на примере № 2: интерактивное меню (динамическое) Пример выше имеет недостаток: если вам напишет друг, меню ему не покажется (или покажется вам, а не ему). Чтобы сделать бота по-настоящему дружелюбным, мы должны показывать меню тому, кто нам написал. Для этого мы перенесем вызов bot.showMenu() из setupO внутрь функции обработки сообщений newMsg(). Алгоритм такой: • Бот получает любое сообщение от пользователя. • Бот смотрит ID этого пользователя (msg.chatlD). • Бот отправляет меню именно этому пользователю. 3ai рузите обновленный код. Проверка работы: 1. Откройте Telegram, очистите историю с ботом. 2. Напишите «Привет». 3. Бот ответит вам появлением клавиатуры. 4. Нажатие на «Команда 1» отправит текст «Команда 1» и снова покажет (обновит) меню. Обсуждаем • Почему во втором примере мы передавали msg.chatlD в функцию showMenu, а в первом - нет? • Что произойдет, если в первом примере (статичном) вы не нажмете кнопку Close, а просто напишете текст «Close» вручную? Сработает ли закрытие меню? (Подсказка: бог не отли- чает нажатие кнопки от ручного ввода того же текста).
Выполняем по образцу 1. Свет п Тьма. Модифицируйте код из Примера № 2. Сделайте меню с двумя кноп- ками: Q Включить и ф Выключить. • При нажатии на Q Включить: зажигайте вез роенный светодиод (обычно GP1O 2) и пишите в ответ «Свет включен». • При нажатии на О Выключить: гасите светодиод и пишите «Свет выключен». (Не забудьте настроить pinMode (2, OUTPUT) в setup). 2. Статус. Добавьте третью кнопку О Статус (используйте \п, чтобы поместить ее под кнопками управления светом). При нажатии бот должен проверять digitalRead(2) и отве- чать реальным состоянием светодиода. Подсказка Если меню не появляется, в первую очередь проверьте правильность токена бота и стабиль- ность Wi-Fi соединения. Также убедитесь, что вы передаете корректный msg.chatlD в функ- цию bot.showMenu(), ведь богу нужно знать, какому именно пользователю показывать меню. Задание для любознательных Попробуйте реализовать вложенное меню. 1. Главное меню: кнопка Настройки. 2. При нажагии на Настройки меню меняется на: Вкл LED \t Выкл LED \п Ц Назад. 3. При нажатии н Назад снова показывается Главное меню с кнопкой Настройки. Подсказка: вам просто нужно вызывать hot. show Menu () с разным набором кнопок в зависимости от того, какой msg.text пришел. Подведем итог Сегодня мы прошли путь от жестко заданного меню (для одного админа) до гибкого интер- фейса, который реагирует на любого пользователя. Мы научились рисовать кнопки рядами и столбцами, а также поняли главный секрет Reply-кнопок: для кода это просто текст, по для пользователя - это удобный пульт управления. Теперь ваши проекты на ESP32 станут гораздо профессиональнее!
Урок № 6. Интерактивное управление: инлайн-кнопки в Telegram с FastBot2 Мы планируем До сих пор мы общались с нашими устройствами на языке простых команд - это надежно, но напоминает телеграф. Сегодня мы переходим на новый уровень, создавая полноценный графический пульт управления прямо в Telegram. Это не просто улучшение; это смена парадигмы, которая отделяет любительский проект от профессионального. В рамках этого урока мы: • Разберемся, чз о такое инлайн-кнопки в Telegram и чем они лучше текстовых команд. • Научимся создавать интерактивные меню с помощью библиотеки FastBotl. • Реализуем обработку нажатий на кнопки для управления светодиодом. • Улучшим пользовательский опыт, изменяя сообщение с кнопками после действия, чтобы отображать актуальное состояние устройства. Прежде чем погружаться в код, давайте вооружимся теорией. Поняв «под капотом» механику инлайн-кнопок, вы сможете не просто копировать код, а уверенно создавать соб- ственные сложные интерфейсы. Читаем Для этого урока мы будем использовать FastBotl - обновленную версию библиотеки, с которой мы работали ранее. Этот переход не случаен: FastBot2 предлагает более совре- менный и удобный подход к созданию интерактивных элементов через механизм функций- обработчиков {callback handlers}. Этот подход, известный как событийно-ориентированное программирование, позволяет избежать 1ромоздких конструкций if-else в основном цикле программы. Вместо постоянного опроса «Л не нажали ли кнопку’?», мы просто говорим биб- лиотеке: «Когда нажмут кнопку, вызови вот эту функцию». Это делает код не только чище и более читаемым, но и эффективнее. Инлайн-кнопки - это интерактивные элементы, которые появляются непосредственно под сообщением в чате Telegram. Они являются фундаментальным улучшением по сравнению с текстовыми командами по нескольким причинам: • Интуитивность: они устраняют необходимость запоминать и вручную вводить ко- манды. • Надежность: снижается вероятность ошибок и опечаток, которые неизбежны при ручном вводе. • Чистота интерфейса: взаимодействие с инлайн-кнопками не «засоряет» историю переписки лишними сообщениями с командами. Принцип их работы основан на callback-запросах (callback query). Когда пользователь нажимает на инлайп-кнопку, Telegram отправляет вашему боту не обычное текстовое сообще- ние, а специальное, невидимое для пользователя событие. Этот запрос содержит уникальные callback-данные - строку, которую вы заранее привязали к этой кнопке в коде. Таким обра- зом, ваша программа на ESP32 точно знает, какая именно кнопка была нажата, и может вы- полнить соответствующее действие.
Интересный факт Введение инлайн-кноиок в Telegram в 2016 году значительно расширило возможности ботов, позволив создавать более сложные и интуитивно понятные интерфейсы, превращая ботов в интерактивные приложения внутри мессенджера. Изучаем на примере Прежде чем приступить к написанию кода, крайне важно понять полный цикл взаимо- действия между пользователем, серверами Telegram и вашим микроконтроллером ESP32. Успешная реализация проекта зависит от четкого понимания этой последовательности. Разберем логику управления светодиодом с помощью инл айн-меню пошагово: 1. Создание меню: программно на ESP32 мы формируем инлайн-клавиатуру. Каждая кнопка па этой клавиатуре состоит из двух ключевых элементов а. Видимый текст: то, что пользователь видит в чате (например, «Q Включить»). Ь. Скрытые callback-данные: уникальный строковый идентификатор, который по- нятен пашей программе (например, «led on»). Такой подход разделения представ- ления (что видит пользователь) и логики (что делает программа) является основой надежного кода. Вы можете менять текст на кнопках, добавлять эмодзи или пере- водить его на другие языки, не затрагивая при этом основную логику обработки. 2. Обработка нажатия: когда пользователь нажимает па кнопку «Q Включить», при- ложение Telegram отправ.тяет на серверы Telegram, а те - вашему боту, специальный callback- запрос. Этот запрос содержит именно скрытые callback-данные, в нашем случае - строку «led он». 3. Выполнение действия: код на ESP32 получает этот запрос, анализирует поле с дан- ными и видит строку «led оп». Обнаружив совпадение, программа выполняет соответствую- щее физическое действие - подает высокий уровень сигнала (HIGH) на пин, к которому под- ключен светодиод, и он загорается. 4. Обратная связь: это ключевой аспект для создания качественного интерфейса. Вместо того чтобы отправлять новое сообщение «Светодиод включен», бот редактирует исходное сообщение, с которого была нажата кнопка. Представьте, что вместо того, чтобы каждый раз получать новый чек с обновленной суммой, кассир просто магически исправляет цифру на старом чеке. Именно это и делает editMessageText - превращает статичное сообще- ние в живую, динамическую панель состояния. Быстро Интуитивно Наглядно
Эта элегантная цепочка событий позволяет создать полноценный интерактивный пульт управления прямо в окне чата. Интересный факт Telegram ЛР1 позволяет ботам не только отправлять сообщения с инлайн-кноиками, но и редактировать уже существующие сообщения, заменяя их текст и/или инлайн-кл авиа гуру (editMessageText, edit MessageReply Markup). Это ключ к созданию плавных, интерактивных меню без «засорения» чата. Читаем Для реализации интерактивных меню библиотека Fa.stBot2 предоставляет набор специ- ализированных функций. Понимание их назначения является ключом к успешной разработке. • bot.onUpdate. Это единый обработчик всех обновлений в FastBot2. Вместо отдель- ных обработчиков для сообщений и callback-запросов, вы регистрируете одну функцию, кото- рая принимает объектfb ::Update. Внутри нее вы проверяете тип обновления с помощью мето- дов isMessage() и isQueryf) и обрабатываете их соответственно. • fb::Lpdate. Это основной объект, содержащий всю информацию об обновлении от Telegram. Методы isMessage() и isQuery() позволяют определить тип обновления, a messagef) и query() — получить соответствующие данные. • fb::InlineMenu. Класс для создания инлайн-клавиатуры. Метод addButton(«meKcm>>, «callback data») добавляет кнопку, a newRowf) переносит на новую строку. Клавиатура при- вязывается к сообщению через setInlineMenu(). • bot.edilText. Эта функция - ваш инструмент для изменения текста уже отправлен- ного сообщения. Она принимает объект fb:: TextEdit, который содержит новый текст, id сооб- щения и id чата. • bof.answerCallbackQuery. После обработки нажатия на кнопку важно отправить под- тверждение серверу Telegram. Эта функция как раз это и делает. Для пользователя это выгля- дит как исчезновение значка загрузки («часиков») с нажатой кнопки. Это важный элемент хорошего пользовательского опыта, дающий понять, что действие выполнено. Теперь, когда мы разобрались с теорией, перейдем к практической реализации. Выполняем по образцу Пришло время применить полученные знания на практике. Следующий скетч реализует пат- терн с единым обработчиком onUpdate, внугри которого мы проверяем тип обновления и об- рабатываем его соответствующим образом. Этот подход позволяет четко разделить логику и сделать код более читаемым.
Callback Query: ed j r ESP32 Пошаговое объяснение кода 1. Настройка: в начале скетча мы подключаем необходимые библиотеки (WiFi.h, FasiBot2.h), определяем константы для учетных данных Wi-Fi и токена бота, а также указы- ваем пин, к которому подключен светодиод. Обратите внимание, что объект FastBot2 bot создается без параметров — токен устанавливается позже через bot.setTokenQ. 2. setup(): здесь происходит вся первоначальная инициализация: запускается Serial-порт, пин светодиода настраивается на выход (OUTPUT), и устанавливается соединение с Wi-Fi. Ключевые строки здесь: • bot.setToken(BOT_ TOKEN); - устанавливаем токен бота * bot.onUpdate(onUpdate); - регистрируем единый обработчик всех обновлений. В отли- чие от раздельных обработчиков, здесь одна функция отвечает за все типы событий.
3. onUpdate(fb::Update& и). Это единый обработчик всех обновлений от Telegram. Внутри функции мы проверяем тип обновления с помощью методов isQueryO и isMessage(). Если пришел callback-запрос (нажатие на инлайн-кнопку), мы получаем объект fb:: Query Read через u.quety(). Для обычного текстового сообщения - fb:: MessageRead через u.message(). 4. Обработка callback-запросов. Когда u.isQueryf) возвращает true, мы извлекаем callback-данные через query.data().toString(). Это строка, которую мы задали при создании кнопки (например, \"led оп\"). Анализируя ее в конструкции if-else if, мы выполняем физи- ческое действие с помощью digiialWrite(). 5. Создание инлайн-меню. Для создания кнопок используется класс fb::InlineMenu Метод addButton(\"meKcm\", ["callback data\") добавляет кнопку, а метод newRow() перено- сит следующие кнопки на новую строку. Клавиатура привязывается к сообщению через setinline Menu (menu). 6. Обратная связь. После выполнения действия мы редактируем исходное сообщение с помощью bot.editText(). Для этого создаем объект fb::TextEdit с новым текстом, id сообщения (query.message().id().tolnt32()) и id чата (query.message().chat().id()). Важно также добавить инлайн-меню к отредактированному сообщению, иначе кнопки исчезнут. 7. 1оор(). В основном цикле программы мы постоянно вызываем bot.tick(). Важно пони- мать, что без bot.tick() в 1оор() ваша ESP32 будет I"глухой\" ко всем событиям из Telegram. Эта функция - ["пульс[" вашего бота, который поддерживает его связь с внешним миром. Подсказка Для создания инлайн-кнопок в FastBot2 используется класс fb::InlineMenu. Ключевым моментом является то. что каждая кнопка определяется парой параметров через метод addButton(\"meKcm\", ["callback data\")‘. текстом, который видит пользователь в чате, и callback-данными - уникальной строкой, которую получает ваша программа при нажатии. Для корректной обработки нажатий необходимо в едином обработчике bot.onUpdateQ про- верять u.isQueryQ и извлекать данные через u.query().data(). Обсуждаем Критический анализ проделанной работы - важный этап для понимания возможностей тех- нологии и поиска путей для улучшения ваших проектов Подумайте над следующими во- просами: • Как можно улучшить интерфейс бога с помощью инлайн-кнопок? Какие еще команды или функции удобно выводить в виде кнопок? • Как сделать так, чтобы пользователь всегда понимал текущее состояние устройства, осно- вываясь на тексте и виде меню? Выполняем самостоятельно Теперь, когда вы поняли основной принцип, закрепите знания на практике, модифицировав наш проект. Задание 1: кнопка статуса. Это задание научит вас отделять логику чтения состояния (read- only) от логики управления, что является ключевым для создания информационных панелей.
Расширьте меню, добавив третью кнопку «□ Статус». При нажатии на нее бот не должен изменять состояние светодиода, а должен проверить его реальное состояние с помощью функ- ции digitalRead(LED PIN). После этою он должен отредактировать сообщение, выведя акту- альную информацию: «Статус: Светодиод включен» или «Статус: Светодиод выключен». Задание 2: книпка-переключатель. Это упражнение закрепляет навык работы с состоянием (stale management), когда одно действие должно учитывать предыдущее состояние устройства. Реализуйте кнопку «0 Переключить». При нажатии на эту кнопку логика должна инверти- ровать текущее состояние светодиода: если он был включен - выключить, и наоборот. Текст в сообщении также должен обновиться, чтобы отражать новое состояние. Интересный факт Telegram позволяет использовать Emoji в тексте инлайн-кнопок (например, Q для «Вклю- чить», ф для «Выключить»). Это может сделать интерфейс бота привлекательнее. FastBot2 поддерживает UTF-8, включая Emoji. Задание для любознательных Это задание бросает вызов вашим навыкам управления состоянием и динамического кон- струирования интерфейсов. Задача: реализовать управление несколькими светодиодами (например, тремя) с помощью одно! о динамического меню. Описание: меню должно содержать кнопки для индивидуального управления каждым свето- диодом (например, «LED 1 ON/OFF», «LED 2 ON/OFF»). 1 'лавная сложность заключается в том, что после каждого нажатия бот должен не просто обновить текст, но и, возможно, изменить саму клавиатуру, чтобы наглядно отразить новое состояние всех светодиодов. Подведем итог На этом уроке мы совершили важный переход от текстовых команд к созданию полноцен- ных интерактивных интерфейсов в Telegram. Вы освоили мощный инструмент, который делает ваши 1оТ-устройства более профессиональными и удобными для пользователя Ключевые навыки, которые вы приобрели: • Понимание и использование инлайн-кнопок для создания интерактивных меню. • Применение библиотеки FastBot! и ее событийно-ориентированного подхода с функциями- обработчиками. • Реализация динамического интерфейса путем редактирования существующих сообщений. • Улучшение пользовательского опыта за счет наглядного и безошибочного управления устройством. Овладение этим инструментом является важным шагом в разработке продвинутых и функ- циональных 1оТ-проектов.
Урок № 7* Инлайн-кнопки в Universal Telegram Bot Мы планируем • Понял ь, как создавать инлайн-кнопки с помощью библиотеки UniversalTelegramBot. • Научиться обрабатывать нажатия на эти кнопки. • Сравнить процесс создания и обработки инлайн-кнопок в UniversalTelegramBot с тем, как мы это делали в FastBot2 (урок № 6). • Конечно же, мы будем управлять светодиодом с помощью наших новых кнопок! Читаем. Знакомство с Universal Telegram Bot и инлайн-кнопками В предыдущем уроке мы научились создавать удобные инлайн-кнопки с помощью биб- лиотеки FastBot? Они делают управление нашими устройствами через Telegram гораздо на] ляднее и проще - не нужно каждый раз вводить команды вручную. Сегодня мы рассмотрим, как реализовать такую же функциональность, но с использо- ванием другой популярной библиотеки -UniversalTelegramBot. Эта библиотека также очень мощная и предоставляет множество возможностей для работы с Telegram Bot API. Что такое инлайн-кнопки (вспомним)? Инлайн-кнопки (inline keyboard buttons) - интерактивные кнопки, которые отобража- ются прямо под сообщением бота. При нажатии Telegram отправляет callback query - специ- альный запрос, который ESP32 должен обработать. Universal Telegram Bot и обработка нажатий В UniversalTelegramBot обработка сообщений происходит через массив bot.mcssagcs[]. Поле type содержит строку с типом сообщения: • «message» - обычное текстовое сообщение; • «callback query» - нажатие на инлайн-кнопку. При callback query иоле text содержит данные кнопки {callback data). Интересный факт Библиотека UniversalTelegramBot была одной из первых полнофункциональных биб- лиотек для Arduino и ESPS266/ESP32 для работы с Telegram Благодаря этому у нее очень большое сообщество пользователей и огромное количество примеров и обсуждений в ин- тернете. Если вы столкнетесь с какой-то специфической задачей, велика вероятность, что кто-то уже решал подобное с этой библиотекой! Изучаем на примере. Как это работает в Universal Telegram Bot? Создание клавиатуры в JSON В UniversalTelegramBot инлайн-клавиатура описывается строкой в формате JSO5J: String keyboard]son = ”[[{ V'textV': \*Включитъ\", ^'callback data\" : \”LED_ON\" }, { \"text\": \"Выключить^", ^callback data\": V'LED OFF\”}]]";
Структура: • text - текст на кнопке; • callback data - данные, которые получит ESP32 при нажатии. Сообщение от бота Нажатие отправляет callback-query на ESP32 Отправка сообщения с кнопкой bot.sendMessageWith!nlineKeyboard(chat id, "Управление LED:", keyboarddson); Обработка нажатия Пользователь нажимает кнопку Telegram API отправляет "callback_query" Telegram уведомляет бота о событии ESP32 получает сообщение В коде мы проверяем bot.messages[i].type == "callback-query" //Проверяем тип сообщения (строка!) if (bot.messages[i].type == "callback query") { // При callback queiy поле text содержит callback data String callback data = bot.messages[i] .text; String queiyid - bot.messages [i] query id; // Обратите внимание: query id //Выполняем действие... //Обязательно отвечаем на callback! hot. answerCallbackQuery (query id); 1
Читаем. Структура JSO>l для клавиатур JSON для нескольких рядов кнопок: //Два ряда по одной кнопке ”[[{ /'text/': \"ВКЛ\", /'callback data/': \"ON\" }], [{ /'text/': \"ВЫКЛ\", /'callback data/': /'OFF/'}]]" // Один ряд с двумя кнопками "[[{ I "text\" : I "ВКЛ\", \ "callback data\" : I "ON\"}, {\ "text\" : I "ВЫКЛ\", I "callback_ data/' 1 "OFF" }]]" Интересный факт Инлайн-кнопки могут не только отправлять callback_data, но и содержать URL-ссылку (кнопка-ссылка), или предлагать переключиться в другой чат для ввода сообщения боту (switch_inline_query). Это позволяет создавать очень гибкие интерфейсы. UniversalTelegramBot поддерживает разные типы таких кнопок, если вы правильно сформируете JSON. Выполняем по образцу. Управляем светодиодом с Universal Telegram Bot Цель: создать Telegram-бота, который по команде /led присылает сообщение с двумя инлайн- кнопками: «Включить LED>> и «Выключить LED». Нажатие на кнопки должно, соответ- ственно. включать и выключать светодиод, подключенный к ESP32. Что понадобится 1. Плата ESP32. 2. Светодиод. 3. Резистор (220-330 Ом). 4. Макетная плата и соединительные провода. 5. Установленная Arduino IDE с поддержкой ESP32.
6. Библиотека UniversalTelegramBot (установите через месенджер библиотек Arduino IDE). 7. Токен вашего Tel egram-бота. Схема подключения: такая же, как в уроках № 4 и 6. • Катод светодиода (короткая ножка) через резистор к GND ESP32. • Анод светодиода (длинная ножка) к одному из цифровых пинов ESP32 (например. GPI02). Мы будем использовать встроенный светодиод на многих платах ESP32, он обычно naGPI02. Код программы.
Пояснения к коду: • bot.messages[i].type: строка с типом - «message» или «.callback query»} • bot.messageslij.text: при callback query содержит callback data нажатой кнопки; • bot.messages[ij.query_ id: ID запроса для answerCallbackQuery} • bot.answerCallbackQuery(query id, text, show alert): ответ на callback - убирает «часики» на кнопке; • client.setCACert(TELEGRAM_CERTIFICATE ROOT): корневой сертификат встроен в библиотеку. С равнение с FastBot (ключевые моменты) Аспект FastBot2 LniversalTelegramBot Инициализация FastBot2 bot; bot.setTokenO UniversalTelegramBot bot(token, client) Инлайн-кнопки fb::InlineMenu класс JSON строка Тип сообщения и. is Message ()> u- isQuery() type == "message”, type == "callback query" Callback data u.query ().data() text (при callback query) Основной цикл bot.tickQ bot.getUpdatesf) + обработка Подсказка • JSOM - строго! Малейшая ошибка в JSON (лишняя запятая, пропущенные кавычки) - кнопки не появятся. • answerCallbackQuery: обязательно вызывайте для каждого callback, иначе на кнопке будут «часики». • Синхронизация времени: без configTime() HTTPS может не работать. Обсуждаем 1. Какая из двух библиотек (FastBot2 или UniversalTelegramBot) показалась вам проще для создания инлайн-кнопок? Почему? 2 В чем разница в проверке типа сообщения в FaslBot2 и UTB? 3. Как вы думаете, для каких задач может быть удобнее FastBot. а для каких - UniversalTelegramBot, если говорить именно о кнопочных интерфейсах или проектах? Выполняем самостоятельно Модифицируйте код так, чтобы по команде /menu бот присылал сообщение с тремя инлайн- кнопками в одном ряду: 1. «LED ON» (включает светодиод). 2. «LED OFF» (выключает светодиод). 3. «LED BLINK» (заставляет светодиод мигнуть 5 раз с интервалом 200 мс). Не забудьте обработать новую callback data «LED BLINK».
Задание для любознательных Изучите функцию bot.sendMessageWithlnlineKeyboard() с параметром message_id для редакти- рования существующего сообщения вместо отправки нового. Это позволяет обнов.зять кнопки «на месте» без засорения чата. Подведем итог Сегодня мы сделали важный шаг в изучении Telegram-ботов! Мы научились: • Создавать инлайн-кнопки с помощью UniversalTelegramBot. • Обрабатывать callback query по полю type == "callback query". • Получать callback data из поля text. • Отправлять подтверждение через answerCallbackQuery. Теперь у вас в арсенале два мощных инструмента для создания интерактивных интерфейсов для ваших Е8Р32-проектов. Выбор библиотеки часто зависит от конкретной задачи и лич- ных предпочтений. Главное - понимать принципы их работы!
Урок № 8, Физическая кнопка и уведомления в Telegram (FastBol2) Мы планируем • Научиться подключать физическую кнопку к ESP32. • Понять, как считывать состояние этой кнопки (нажата или отпущена). • Разобраться с проблемой «дребезга контактов» и способами ее решения. • Написать программу; которая будет отправлять сообщение в Telegram (используя FastBot), когда кнопка на ESP32 будет нажата. Читаем. Физические кнопки и ESP32 До сих пор мы управляли ESP32 командами из Telegram. А что, если мы хотим, чтобы ESP32 сам реагировал на какие-то события во внешнем мире и сообщал нам об этом? Напри- мер, если кто-то нажал на кнопку звонка, или открылась дверь. Как работает кнопка? Самая простая кнопка - это механическое устройство, которое замыкает или размыкает электрическую цепь. Когда мы нажимаем на кнопку, два контакта внутри нее соединяются, позволяя току течь. Когда отпускаем - контакты размыкаются Подключение кнопки к ESP32 Чтобы ESP32 мог «увидеть» нажатие кнопки, мы подключаем ее к одному из его циф- ровых пинов (СРЮ). Нам нужно сделать так, чтобы при нажатии кнопки напряжение на этом пине изменялось. Есть два основных способа: 1. Стягивающий резистор (Pull-down resistor): резистор подключается между пином и GNI). Кггопка подключается между пшгом и VCC (3.3V для ESP32). Когда кнопка не ггажата. пин «стянут» к земле (LOW). При нажатии - пин подключается к VCC (HIGH). 2. Подтягивающий резистор (Pull-up resistor): резистор подключается между пином и VCC. Кнопка подключается между пином и GND. Когда кнопка не нажата, пин «подтянут» к VCC (HIGH). При нажатии - пин подключается к GND (LOW). Встроенный подтягивающий резистор INPUT.PULLUP К счастью, у ESP32 (как и у многих мггкроконтроллеров) есть встроенные подтягиваю- щие резисторы, которые можно активировать ггрограммно. Если мы настроим пин в режим pinMode(buttonPin, 1NPUT_PULLUP);, то нам не нужен внешний резистор! Кнопку доста- точно подключить между этим пином и GND. Это самый простой способ. Проблема: дребезг контактов (Contact Bounce) Когда вы нажггмаете или отпускаете механическую кнопку, ее контакты не замыка- ются/размыкаются мггговенно и чисто. Вместо этого происходит серия очень быстрых замы- каний и размыканий (вибрация), ггрежде чем контакт установится окончательно. Это называ- ется «дребезгом контактов». Для микроконтроллера, который работает очень быстро, это может выглядеть так, как будто кнопку нажали несколько раз подряд за одгго физическое нажатие. Это может привести к ложным срабатываниям нашей программы.
Мир Отвечает: Реакция на Физическое Нажатие bot.sendMessage( "Кнопка нажата!"); Концепция "Дребезга" время Идеальное нажатие- Реальное нажатие Проблема: Дребезг контактов. Решение: Программная задержка (Debounce). Как бороться с дребезгом? • Программная задержка (Debouncing): самый простой способ - после первого об- наружения изменения состояния кнопки, мы делаем небольшую паузу (например, 50 милли- секунд) и только потом снова считываем состояние. Если оно все еще такое же, значит, это было «настоящее» нажатие/отпускание, а не дребезг. Интересный факт Дребезг контактов - это не только проблема кнопок. Он может возникать в любых механи- ческих переключателях, например, в реле. В старых телефонных аппаратах с дисковым но- меронабирателем дребезг был серьезной проблемой, и для борьбы с ним разрабатывались специальные механические и электрические схемы! Выполняем по образцу. Кнопка-уведомитель для Telegram Цель: сделать так, чтобы при нажатии на физическую кнопку, подключенную к ESP32, в ваш Telegram-чат приходило сообщение «Кнопка нажата!». Будем использовать библиотеку FastBot2. Что понадобится 1. Плата ESP32. 2. Тактовая кнопка (без фиксации). 3. Макетная плата и соединительные провода. 4. Установленная Arduino IDE с поддержкой ESP32. 5. Библиотека FastBot2 6. Токен вашего Telegram-бота и ваш CHAT_ID (Как получить CHAT_ID отправьте лю- бое сообщение боту @userinfobot в Telegram, он пришлет ваш 1D). Схема подключения: мы будем использовать внутренний подтягивающий резистор ESP32. • Один вывод кнопки подключаем к GND ESP32. • Другой вывод кнопки подключаем к цифровому пину ESP32 (например. GPI04).
Код upoi раммы. Пояснения к коду: • #include <FasiBot2.h>: подключаем библиотеку FastBot2. • bof.setTokenfBOT TOKEN): устанавливаем токен бота. • pinModefbuttonPin, INPUT PULLUP): настраиваем пин с внутренним подтягива- ющим резистором. Без нажатия пин будет HIGH, при нажатии - LOW . • Логика debounce: используем lastDebounceTime и debounceDelay для фильтрации ложных срабатываний. • fb::Messagc msg(text, chatID): создаем объект сообщения с текстом и ID чата. • bot.sendMessage(msg): отправляем сообщение. • bot.tick(): вызываем в 1оор() для корректной работы библиотеки.
Подсказка • Правильный CHAT_ID: убедитесь, что вы указали верный СНАТ_1С Если сомневаетесь, отправьте любое сообщение боту @userinfobot в Telegram, и он пришлет вам ваш ID. • Подключение кнопки: проверьте, что кнопка подключена правильно: один контакт к пину (GP1O4). другой - к GND. Если перепутать, ничего страшного не случится, но работать не будет. • Дребезг: если сообщения приходят пачками при одном нажатии, попробуйте увеличить debounceDelay (например, до 75 или 100). Выполняем самостоятельно Измените программу так, чтобы сообщение в Telegram отправлялось не при нажатии кнопки, а при ее о iпускании Выполняем самостоятельно Подключите вторую кнопку к другому пину ESP32 (например, GPIO5). Сделайте так, чтобы при нажатии первой кнопки отправлялось сообщение «Нажата кнопка 1», а при нажатии второй - «Нажата кнопка 2». Задание для любознательных Реализуйте «долговременное нажатие». Если пользователь удерживает кнопку нажатой бо- лее 3 секунд, ESP32 должен отправить специальное сообщение в Telegram, например, «Кнопка удерживается'». Вам понадобится отслеживать время, пока кнопка находится в состоянии LOW Подведем итог Отлично! Теперь мы умеем: • Подключать физические кнопки к ESP32. • Программно обрабатывать их состояние, включая борьбу с дребезгом контактов. • Отправлять уведомления в Telegram при помощи FastBot2 в ответ на физические со- бытия. Это очень важный навык! Теперь ваши проекты могут взаимодействовать не только с вир- туальным миром Telegram, но и с реальными физическими объектами и действиями. Пред- ставьте: дверной звонок, который шлет уведомление в Telegram, или датчик открытия окна - все это теперь вам по силам!
Урок № 9. Датчик расстояния HC-SR04 и Telegram (FastBot!) • Познакомиться с ультразвуковым датчиком расстояния HC-SR04. • Узнать, как он работает и для чего используется. • Научиться подключать HC-SR04 к ESP32. • Написать программу, которая измеряет расстояние до объекта и отправляет результат в Telegram по команде, используя библиотеку FastBot2 Читаем. Ультразвуковой дальномер/датчик расстояния HC-SR04 Представьте, что у вашего ESP32 появились «глаза», которые могут измерять расстоя- ние до предметов! Именно это и делает ультразвуковой датчик расстояния, такой как попу- лярный HC-SR04. Как он работает? Принцип эхолокации Датчик HC-SR04 работает подобно летучей мыши или дельфину, используя эхолока- цию: 1. Излучение: по команде от ESP32 один из «глазков» датчика {Trig - Trigger} испус- кает короткую пачку ультразвуковых волн (звук очень высокой частоты, который мы не слы- шим). 2. Отражение: эти волны летят вперед, отражаются от ближайшего препятствия и воз- вращаются назад. 3. Прием: второй «глазок» датчика (Echo) «слушает» и ожидает возвращения отра- женного сигнала. 4. Расчет времени: ESP32 измеряет время, которое прошло между отправкой им- пульса и получением эха. Зная это время и скорость звука в воздухе (примерно 343 метра в секунду при комнатной температуре), мы можем рассчитать расстояние до объекта Расстояние = (Еремя полета звука * Скорость звука) / 2 Делим на 2, потому что звук прошел путь «туда и обратно». Характеристики HC-SR04: • Напряжение питания: обычно 5V. • Рабочий ток: ~15 mA. • Диапазон измерения: от 2 см до 400 см (4 метров). За пределами этого диапазона точность падает. • Угол обзора: около 15-30 градусов (он измеряет расстояние до ближайшего объекта в этом конусе). • Пины: о VCC: Питание (+5V). о Т rig: Триггер, пин для запуска измерения (вход для датчика, выход для ESP32). о Echo Эхо, пин для получения сигнала о времени (выход для датчика, вход для ESP32). о GND: Земля.
Где используется? • Робототехника: для обнаружения препятствий роботами-пылесосами, мобильными платформами. • Паркгроннки: в автомобилях для помощи при парковке. • Измерение уровня: уровня воды в баке, снега, сыпучих материалов. • С истемы безопасности: обнаружение движения. • Интерактивные инсталляции. Важный момент: согласование уровней напряжения! HC-SR04 обычно питается от 5V, и его пив Echo также выдает сигнал с уровнем 5V. Однако пины ESP32 рассчитаны на логические уровни 3.3V. Подача 5V на пип ESP32, не толерантный к 5V, может его повредить! Поэтому ОЧЕНЬ ВАЖНО использовать дели- тель напряжения па линии Echo -> ESP32 GPIO или убедиться, что ваш конкретный модуль ESP32 имеет 5У-толерантные пины (что бывает не всегда). Безопаснее всегда использовать делитель. +5V >---- TTL-уровень (Echo) R1 1К к выводу микроконтроллера -------> +3.3V ГП R2 2 К. GND <^> Обретение Зрения: Измеряем Расстояние с HC-SR04 Как это работает (Эхолокация) Результат Схема и Безопасность GND “Расстояние до объекта: Зд см" ВАЖНО: Защищаем ESP32 от 5В сигнала!
На пин ESP32 придет напряжение: 5V * (2000 / (1000 + 2000)) = 5V * (2/3) = 3.33V, что безопасно. Для тестов, конечно, нам достаточно использование резистора на 220 Ом. Интересный факт Скорость звука зависит от температуры и влажности воздуха. Для очень точных измерении расстояния в профессиональных системах вводят поправки на эти параметры. Для наших DIY-проектов обычно достаточно усредненного значения скорости звука (0,0343 см/мкс). Выполняем по образцу Цель: создать систему, где ESP32 по команде /distance из Telegram измеряет расстояние с помощью HC-SR04 и отправляет результат обратно в чат. Используем FastBot2. Что понадобится 1. Плата ESP32. 2. Датчик ИС-SR04. 3. Резисторы для делителя напряжения: 1 шт. на 1 кОм и 1 шт. на 2 кОм (или близкие номиналы, например, 1,2 кОм и 2,2 кОм). 4. Макетная плата и соединительные провода. 5. Установленная Arduino IDE с поддержкой ESP32. 6. Библиотека FastBot2. 7. Токен вашего Telegram-бота.
Схема подключения. VCC HC-SR04: Подключите к пину VIN на ESP32, если ESP32 питается от USB (на VIN будет 5V). Либо используйте отдельный источник 5V. Не подключайте к 3.3V ESP32, датчику нужно 5V для стабильной работы. Trig HC-SR04: К любому цифровому пину ESP32, например. GPI04. Echo HC-SR04: Через делитель напряжения (в идеале, но пока через резистор в 220 Ом) к другому цифровому пину ESP32, например. GPI015 • Echo датчика к одному концу резистора R1 (220 Ом). • От другого конца R1 - к пину GPI01 5 ESP32. GND HC-SR04: К GND ESP32.
Код программы. Пояснения к коду: • measnrel)istance(): функция отправляет ультразвуковой импульс и измеряет время отклика черезpulseln(). • bot.onUpdate(onUpdate): регистрируем единый обработчик всех обновлений - это ключевая особенность FastBot2 • fb::C'pdate& и: объект обновления содержит информацию о входящем событии. • u.isMessage(): проверяем, что пришло именно сообщение. • u.message(): получаем объект сообщения типа fb::MessugeRead. • nisg.text().toString(): извлекаем текст сообщения как String. • fb::Message(text, chatlD): создаем сообщение для отправки. 1. Пин ‘Trig’’ посылает ультразвуковой импульс. 2 Импульс отражается от препятствия. 3. Пин “Еспо1, принимает отраженный сигнал. 4. ESP32 измеряет нремя полета сигнала. Расстояние = (Время полета х Скорость звука) / 2 Подсказка • Делитель напряжения - это важни! Не пренебрегайте им, чтобы не повредить ESP32. Тщательно проверьте подключение резисторов. • Питание HC-SR04: убедитесь, что датчик получает стабильные 5V. От 3.3V он может работать нестабильно или вообще не работать.
• Препятствия: для корректного измерения перед датчиком должно быть свободное про- странство. Мягкие, пористые или очень маленькие объекты Moiyr плохо отражать ультразвук. • 1 айм-аут pulseln(): если pulseln () не дождется ответного сигнала (например, объект слишком далеко или звук не отразился), она вернет 0 после определенного тайм-аута (по умол- чанию 1 секунда). Ваша функция measu reDistance это учтет (расстояние будет 0 или близко к нему). Выполняем самостоятельно Измените команду для запроса расстояния с /distance на /ping или любую другую, какая вам правится. Не забудьте обновить вызов bot. attachCommandf) Выполняем самостоятельно Модифицируйте код так, чтобы бот отправлял расстояние не только в сантиметрах, но и в дюй- мах (1 дюйм = 2,54 см). Сообщение может выглядеть так: «Расстояние: X см (Y дюймов)». Задание для любознательных Попробуйте сделать так, чтобы ESP32 автоматически отправлял данные о расстоянии в Telegram каждые 10 секунд (без команды от пользователя). Вам понадобится использовать millis() для отслеживания времени (по аналогии с уроком № 12, который будет про датчик DHT и отправку по расписанию) и указать конкретный CHAT_ID для отправки сообщений. Подведем итог Поздравляю! Вы освоили ультразвуковой датчик расстояния HC-SR04! Теперь вы можете: • Подключать HC-SR04 к ESP32, не забывая про согласование уровней напряжения. • Измерять расстояние до объект ов. • Интегрировать эти измерения с Telegram, отправляя данные по команде с помощью FastBot2. Этот датчик открывает массу возможностей для ваших проектов: от простого робота, объез- жающего препятствия, до системы мониторинга уровня жидкости в аквариуме. Эксперимен- тируйте и создавайте!
Урок № 10. Управление сервоприводом через Telegram (FastBot!) Мы планируем • Познакомиться с сервоприводами: что это такое, как они работают и где их можно при- менять. • Научиться подключать популярный сервопривод SG90 (или аналогичный) к нашей плате ESP32. • Разобраться, как управля гь точным углом поворота сервопривода с помощью специаль- но! о сигнала - ШИМ (широгно-импульсной модуляции). • Написать про1рамму, которая позволит нам управлять сервоприводом прямо из Telegram с помощью FastBot 2! Читаем. Часть 1: что такое сервопривод и зачем он нужен? Представьте себе маленький, но очень умный моторчик, который может не просто вра- щаться. а поворачиваться на точно заданный угол и удерживать это положение. Это и есть сервопривод! В отличие от обычного мотора, который крутится без остановки, сервопривод позволяет нам контролировать его позицию. И з чего он состоит? Внутри небольшого корпуса сервопривода (например, популяр- ного синего SG90) скрываются: 1. Электродвигатель: обычный маленький мотор постоянного тока. 2. Редуктор: набор шестеренок, который уменьшает скорость вращения мотора, но увеличивает его силу (крутящий момент). Это позволяет сервоприводу удерживать поло- жение даже под небольшой нагрузкой. 3. Потенциометр (датчик положения): это специальный переменный резистор, ко- торый связан с выходным валом сервопривода. Он постоянно сообщает плате управления, на какой угол повернут вал. 4. Плата управления (электроника): маленькая электронная схема, которая получает от нас управляющий сигнал (об этом чуть позже), сравнивает его с текущим положением вала (считанным с потенциометра) и подает питание на мотор так, чтобы вал повернулся в нужное положение. Внутреннее устройство
Где применяются сервоприводы? Сервоприводы - незаменимые помощники во многих областях: • Робототехника: «суставы» роботов-манипуляторов, поворотные механизмы для ка- мер или датчиков, рулевое управление в мобильных роботах. • Авиа- и судомоделизм: управление рулями высоты, направления, элеронами у са- молетов; рулями у кораблей. • DIY-ироекты: открытие и закрытие маленьких дверок, заслонок, клапанов: управ- ление стрелками на макетах; создание анимированных фигурок и многое другое! Интересный факт Сервоприводы бывают очень разными! Маленькие, как наш SG90, обычно используются в хобби-проектах. Но существуют и огромные промышленные сервоприводы, которые мо- гут развивать невероятную силу и используются, например, в станках с ЧПУ (числовым про- граммным управлением) или в больших роботах на заводах. Точность позиционирования у промышленных сервоприводов может достигать долей градуса! Изучаем на примере. Как ESP32 командует сервоприводом? Сервопривод понимает команды не в виде чисел «О» или «1», а в виде специальных импульсов, которые называются ШИМ-сигналом (широтно-импульсная модуляция). Представьте, что мы очень быстро включаем и выключаем лампочку. Если мы будем включать ее на короткое время, а выключать надолго, она будет светить тускло. Если наобо- рот - ярко. ШИМ работает похожим образом, но вместо яркости мы управляем углом. • Частота сигнала: для большинства популярных среди хоббинстов сервоприводов (как SG90) управляющий сигнал должен приходить с частотой 50 Гц. Это значит, что полный цикл «импульс + пауза» повторяется 50 раз в секунду, или каждые 20 миллисекунд (1 се- кунда / 50 = 0,02 секунды = 20 мс). • Длительность импульса: вот это самое главное! Именно длительность активной части импульса (когда на управляющем проводе «высокий» уровень напряжения) говорит сервоприводу, на какой угол ему нужно повернуться. о Импульс длительностью примерно 1 миллисекунда (мс) обычно соответствует углу 0 градусов. о Импульс длительностью примерно 1,5 мс - узлу 90з радусов (среднее положение), о Импульс длительностью примерно 2 мс - узлу 180 з радусов о Промежуточные значезпзя длительности импульса дают промежуточные углы. Принцип управления (ШИМ)
Как мы им управляем? Язык ШИМ-сигнала (PWM) Мы посылаем на сервопривод серию импульсов с частотой 50 Гц (каждые 20 мс). Длительность импульса определяет угол. 20ms 20пт$ Импульс 1 5 мс 20ms _ Импульс 2 мс Библиотека ESP32Servo Формировать такие точные импульсы вручную довольно сложно. К счастью, для ESP32 существует специальная библиотека ESP32Servo. h Она берет на себя всю сложную работу по генерации ШИМ-сигнала. Нам достаточно будет указать пин, к которому подключен сер- вопривод, и желаемый угол в градусах (например. myServo.write(90);). 0° 90° 180° М II м V U й • • • I------------------------------------------------ 0ms Частота 50 Гц 20ms «include <ESP32Servo.h> Servo myServo; myServo.attach(servoPin); 11 Просто укажите угол! myServo.write(7(); Библиотека ESP32Servo делает всю сложную работу за нас. Читаем. Часть 2: управление и5 Telegram с параметрами В предыдущих уроках мы уже отправляли команды боту, например. /ied_on. Теперь нам нужно отправлять команду, которая содержит дополнительную информацию - угол по- ворота. Например,/servo 90или/servo 45 Нам нужно будет: 1. 11олучить строку сообщения от пользователя. 2. «Вырезать» из нее саму команду (/se rvo ) - она нам больше не нужна. 3. Оставшуюся часть строки (например. ' 90") преобразовать из текста в число. Для этого в Arduino есть функция atoi() (ASCII to integer) или методы объекта String (например. tolnt()). 4. Проверить, что полученное число находится в допустимом диапазоне углов для на- шего сервопривода (обычно от 0 до 180).
Интересный факт Сервоприводы, особенно когда они активно двигаются или удерживают нагрузку, могут по- треблять значительный ток. Маленький SG90 обычно не создает проблем при питании на- прямую от ESP32 (от пина 5VZVIN). Но если вы захотите подключить несколько сервопри- водов или один более мощный, то питания от ESP32 может не хватить. В таких случаях сервоприводы нужно питать от отдельного, достаточно мощного источника питания, не за- бывая при этом соединить «земли» (GND) источника питания серво и ESP32. Выполняем самостоятельно. Телетрам-конiроллер для сервопривода Цель: создать Telegram-бога, который по команде /servo <угол> (например, /servo 120) будет поворачивать сервопривод SG90 на указанный угол. Что понадобится 1. Плата ESP32. 2. Сервопривод SG90 (или аналогичный, с зремя проводами). 3. Соединительные провода (папа-мама обычно подходят для подключения серво к ма- кетной плате или напрямую к ESP32). 4. Установленная Arduino IDE с поддержкой ESP32. 5. Библиотеки: о W i F i. h (стандартн ая); о FastBot2. h (установить); о ESP32Servo.h (обычно нужно установить отдельно через менеджер библиотек Arduino IDE, ищите «ESP32Servo»). Схема подключения сервопривода SG90 Сервопривод SG90 обычно имеет три провода. Цвет провода Назначение Куда подключать Коричневый (или черный) Земля (GND) Пин GND на ESP32 Красный Питание (VCC, -5V) Пин 5V/VIN на ESP32 Оранжевый (или желтый) Управляющий сигнал СРЮ16на ESP32
Код программы. Пояснения к коду: 1 #incliide <ESP32Servo. h> подключаем библиотеку для работы с серво. 2. Servo myServo; создаем объект my Servo класса Servo Через этот объект мы будем управлять нашим сервоприводом. 3. const int servoPin = 16; указываем пин, к которому подключей оранжевый (сигнальный) провод ссрво.
4. Обработка команды /servo о text.substring(7): «вырезаем» подстроку, которая идет после /servo (7 символов) - это и есть наш угол в виде строки. о angleStr.trim()\ убираем лишние пробелы. о angleStr.toIntQ: преобразуем строку с углом в целое число. о if (angle < 0) angle = 0; if (angle > 180) angle = 180;: 01раничиваем угол, чтобы он не выходил за пределы возможностей сервопривода (0—180 градусов для SG90). о myServo.write(angle): Главная команда! Поворачиваем сервопривод на рассчи- танный угол. 5. setup о myServo.attach(servoPin) «привязываем» наш объект myServo к указан- ному пину. С этого момента библиотека начнет генерировать ШИМ-сигнал на этом пине. Можно также указать минимальную и максимальную длительность импульса в микросекундах, если стандартные значения библиотеки не подходят для вашего серво, например: myServo.attach(servoPin, 500, 2400) ; (50U мкс для 0°, 2400 мкс для J 80°). о myServo. wnte(90) ; устанавливаем сервопривод в начальное положение (например, 90 градусов) при старте программы. Подсказка • Диапазон углов: большинство маленьких сервоприводов типа SG90 имеют рабочий диа- пазон от 0 до 180 традусов. Не пытайтесь задать угол за этими пределами, это может повре- дить сервопривод. • Питание: если сервопривод «дрожит», «жужжит», но не поворачивается, или ESP32 пере- загружается при попытке повернуть серво, возможно, ему не хватает питания. Убедитесь, что красный провод подключен к надежному источнику 5V. • Качество серво: дешевые сервоприводы могут иметь не очень точное позиционирование или небольшой люфт. • myServo.detach()если вам нужно, чтобы сервопривод перестал удерживать пози- цию и его можно было свободно вращать рукой (или для экономии энергии), вы можете использовать команду myServo. detach() ;. после этого для возобновления управления нужно снова вызвать myServo.attach(servoPin);. Выполняем самостоятельно 1 Модифицируйте код так, чтобы помимо команды /servo <угол>, у вас были две инлайн- кнопки, отправляемые по команде /menu_servo - Кнопка «Открыть (0°)» (поворачивает серво на 0 традусов). - Кнопка «Закрыть (90°)» (поворачивает серво на 90 градусов). Вам нужно будет вспомнить, как создавать инлайн-кнопки в FastBot (урок № 6) и как привя- зывать к ним функции-обработчики.
Выполняем самостоятельно 2 Добавьте новую команду /sweep, при получении которой сервопривод будет плавно дви- гаться от 0 до 180 градусов, а затем обратно от 180 до 0 градусов. Используйте цикл for и небольшую задержку delay () внутри цикла для плавности движения. Пример для движения от 0 до 180: for (intpos = 0; pos <= 180; pos += 1) { //Двигаемся с шагом в 1 градус myServo. write (pos); delay(15); // Задержка для плавности (подберите значение) } Задание для любознательных Попробуйте управлять скоростью поворота сервопривода. Вместо того чтобы сразу дават ь команду myServo.writе(конечный .угол), сделайте так, чтобы сервопривод двигался к этому углу постепенно, с определенной скоростью (например. 10 ]радусов в секунду). Для этого вам нужно будет в цикле 1оор() постепенно изменять текущий угол сервопривода, пока он не достигнет целевого. Используйте millis() для управления временем и скоростью. Подведем итог Сегодня мы сделали большой шаг в мир механики и робототехники! Мы научились: • Понимать, что такое сервопривод и как он устроен. • Подключать сервопривод SG90 к ESP32. • Управлять углом его поворота с помощью библиотеки ESP32Se rvo • Создавать Telegram-бота на FastBot2, который может принимать команды с парамет- рами (например, угол поворота) и управлять сервоприводом. Теперь вы можете добавлять движение в свои проекты: открывать и закрывать механизмы, поворачивать датчики, создавать простые роботизированные руки и многое другое. Возмож- ности ограничены только вашей фантазией!
Глава II. УМНЫЕ УСТРОЙСТВА. СОЗДАНИЕ И УПРАВЛЕНИЕ Урок № 11. Датчик температуры и влажносгп DHT11/DHT22: получаем данные в Telegram (FastBot2) Мы планируем • Познакомиться с популярными датчиками для измерения температуры и влажности воздуха - DHT11 и DHT22 (также известный как АМ2302). • Узнать их основные характеристики, различия и принцип работы. • Научиться правильно подключать датчик DHT к нашей плате ESP32. • Использовать специальную библиотеку для легкого считывания показаний с датчика. • Написать программу, которая по команде из Telegram (например, /weather) будет за- прашивать у датчика текущие значения температуры и влажности и отправлять их нам в чат с помощью Fa st Во t2 Осязание Атмосфера оооооооооооооо ♦ оооооооооооооо <£»)) Зрение Движение Автономность Мы не просто изучим датчики Мы дадим нашему устройству чувства и способности, шаг за шагом превращая его в умное, реагирующее на мир создание. Читаем. Часть 1: знакомство с датчиками 1)НТ - ваши домашние метеорологи Хотите знать, какая погода у вас дома или в вашем проекте? Датчики серии DHT - это простые и доступные цифровые датчики, которые могут измерять два важных параметра окружающей среды: температуру и относительную влажность воздуха. DHT11 vs DHT22 (АМ2302) —В чем pa nt и па? Существует несколько версий этих дат- чиков, но самые распространенные - это DHT11 и DHT22.
• DHT11 (обычно синего цвета): о Более дешевый. о Диапазон измерения температуры: 0-50 ЭС (точность ±2 °C). о Диапазон измерения влажности: 20-80 % RH (точность ±5 % RH). о Частота опроса: не чаще 1 раза в секунду. • DHT22 / АМ2302 (обычно белого цвета): о Дороже, чем DHT11. о Более точный и имеет более широкий диапазон измерений. о Диапазон измерения температуры: -40 до +80 °C (точность ±0.5 °C). о Диапазон измерения влажности: 0-100 % RH (точность ±2-5 % RH). о Частота опроса не чаще 1 раза в 2 секунды. Выбор инструмента: DHT11 против DHT22. DHT11 (Синий) ±2°С ±5% 0-50°С Дешевле DHT22 (Белый) ±0.5°С ±2-5% -40 до +80°С Дороже Параметр Точность (t°) Точность (влажн.) Диапазон (t°) Цена Для простых комнатных проектов достаточно DHT11. Для точности и уличных условий — выбирайте DHT22. Как они работают (очень упрощенно)? Внутри корпуса датчика находятся: • Термистор: это резистор, сопротивление которого изменяется в зависимости от тем- пературы. По этому изменению электроника датчика вычисляет температуру. • Емкостной датчик влажности: состоит из двух электродов с гигроскопичным ма- териалом между ними (материал, который впитывает влагу из воздуха). Изменение влажности воздуха приводит к изменению диэлектрической проницаемости этого материала, что, в свою очередь, изменяет емкость конденсатора, образованного электродами. По этому изменению емкости вычисляется влажность. • Микроконтроллер: маленький чип внутри датчика, который обрабатывает сигналы с термистора и датчика влажности, преобразует их в цифровой вид и передает нам по специ- альному однопроводному протоколу. Датчик выдает цифровой сигнал, поэтому он менее подвержен помехам, чем аналого- вые датчики.
Интересный факт Датчики DHT перед продажей калибруются на заводе. Однако со временем их показания могуч немного «уплывать», особенно у более дешевых моделей типа DHT11. Для очень точ- ных измерений в научных или промышленных целях использую! более дорогие и стабиль- ные датчики, которые требуют периодической поверки и калибровки. Но для домашних проектов и знакомства с миром измерений DHT - отличный выбор! Изучаем на примере. Как считать данные с датчика DHT? Подключение: Датчики DHT обычно имеют 3 или 4 вывода: • VCC (или +): питание. Для DHT11 - эго 3-5,5 V, для DHT22 - 3,3-6 V. Мы можем питать их от пина 3.3V на ESP32. • DATA (или OUT): линия данных. Именно по этому проводу датчик общается с ESP32. • GND (или -): Земля. • NC (Not Connected): иногда есть четвертый пин, который никуда не подключается. Важный момент: Подтягивающий резистор! Для стабильной работы датчика DHT на линии DATA необходимо использовать под- тягивающий резистор номиналом от 4.7 кОм до 10 кОм. Этот резистор подключается между линией DATA и VCC (питанием датчика). Некоторые модули с датчиками DHT (которые про- даются уже распаянными на маленькой плате) могут иметь этот резистор встроенным. Если у вас «голый» датчик, резистор нужно добавить самостоятельно. СХЕМА ИНТЕРФЕЙС РЕАЛЬНОСТЬ Температура: 25 5 "С 1'лажность 45.2 % /weather
Библиотеки для работы с DHT Чтобы не разбират ься в сложном протоколе обмена данными с датчиком, мы восполь- зуемся готовыми библиотеками. Одна из самых популярных и удобных - это DHT sensor library от компании Adafruit. Часто для се работы также требуется библиотека Adaf ruit Unified Sensor 1. Откройте в Arduino IDE Скетч -> Подключить библиотеку -> Управлять библио- теками . . . 2. В поиске введите "DHT sensor library" и установите библиотеку от Adafruit. УПРАВЛЕНИЕ БИБЛИОТЕКАМИ DHT sensor library Type. Topic: All All DHT sensor library от Adafruit Arduino library for DHT11, DHT22, etc Temp & Humidity Sensors Arduino library for DHT11, DHT22,... Дополнительная информация УСТАНОВКА 3. Также найдите и установите «Adafruit Unified Sensor». УПРАВЛЕНИЕ БИБЛИОТЕКАМИ Adafruit Unified Sensor Type. Ail Topic: All № Adafruit Unified Sensor от Adafruit... 1.1.15 installed Required for all Adafruit Unified Sensor based libraries. A unified sensor abstraction layer used by... Дополнительная информация 1.1.15 УДАЛИТЬ Эти библиотеки предоставят нам простые функции для инициализации датчика и чте- ния температуры и влажности.
Читаем. Часть 2: отправляем «сводку погоды» в Telegram После того как мы научимся получать данные с датчика, отправить их в Telegram с помощью FastBot2 будет несложно: 1. Создадим функцию-обработчик для команды, например, /weather 2. В этой функции будем считывать показания температуры и влажности с датчика. 3. Проверим, что данные считались корректно (датчики DHT иногда могут выдавать ошибку, особенно при слишком частом опросе или плохом контакте). 4. Сформируем красивое сообщение, например: «Температура: 25,5 °C, Влажность: 45,2 %». 5. Отправим это сообщение пользователю, который запросил данные. Интересный факт Высокая влажность воздуха заставляет нас ощущать жару сильнее, чем она есть на самом деле, а низкая влажность в мороз усиливает ощущение холода. Существует такое понятие, как «индекс тепла» {heat index) или «ощущаемая температура», который учитывает и темпе- ратуру. и влажность. Для его расчета существуют специальные формулы. Зная температуру и влажность с датчика DHT22 (он точнее), можно попробовать рассчитать и этот параметр! Выполняем по образцу. Гелеграм-метеостанция по запросу Цель: создать Telegram-бота. который по команде /weather будет считывать данные с дат- чика DHT (например. DHT22) и отправлять текущую температуру и влажность в чат. Что понадобится 1. Плата ESP32. 2. Датчик DHT11 или DHT22 (АМ2302). 3. Резистор 4,7 кОм или 10 кОм (если он не встроен в ваш модуль DHT). 4. Макетная плата и соединительные провода. 5. Установленная Arduino IDE с поддержкой ESP32. 6. Библиотеки: FastBot,DHT sensor library by Adaf rtilt, Adaf rult Unified Sensor 7. Токен вашего Telegram-бота. Схема подключения (для примера используем DH122) Инн датчика Назначение Подключение к ESP32 Пин 1 (VCC) Питание 3V3 Пин 2 (DATA) Линия данных GPIO15 ПинЗ (NC) Не подключен — IIhh4(GND) Земля GND Подтяшвающий резистор (4,7-10 кОм): между пином DATA датчика и пином VCC датчика (т. е. между GPI015 и 3V3 в нашей схеме, если резистор внешний).
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ Код программы.
Пояснения к коду: • ^include <DHT.h>: подключаем библиотеку Adafruit DHT. • #definc DHTP1N 15: указываем пин для DATA-линии датчика. • ^define DHTTYPE DHT22: важно! Укажите правильный тип вашего датчика (DHT11, DHT22 или DHT21). • DH1 dhttDHIPIN, DHTTYPE): создаем объект dhi для взаимодействия с датчиком. • Чтение данных: о float humidity = dht.readHumidity(); - считываем влажность; о float temperature = dht.readTemperature(); - считываем температуру в Цельсиях; эти функции могут вернуть специальные значения NaN (Not a Number), если чте- ние не удалось. • isnanfhumidity) || isnan(temperature): проверяем, были ли ошибки при чтении. • String(tcmperature, 1): форматируем число с плавающей точкой так, чтобы остался только один знак после запятой. • dht.begint): инициализируем датчик в setup(). Подсказка • Тип датчика: убедитесь, что в строке #define DHTTYPE . . . выбран правильный тип вашего датчика. Иначе показания будут неверными или вы получите ошибку. • Подтягивающий резистор: если датчик не отдает показания или выдает ошибки, в пер- вую очередь проверьте наличие и правильность подключения подтягивающего резистора (4,7-10 кОм между DATA и VCC), если он не встроен в модуль. • Частота опроса: не опрашивайте датчики DHT слишком часто DHTJ1 - не чаще раза в секунду, DHT22 - не чаще раза в две секунды. Слишком частый опрос может приводить к ошибкам чтения или самойагреву датчика, что исказит показания температуры. • Контакты: плохой контакт в проводах - частая причина проблем. Убедитесь, что все со- единения надежны. Обсуждаем 1. Почему DHT22 точнее, чем DHT1 Г? 2. Как влажность влияет на ощущение температуры человеком? 3. Какие практические применения метеостанции вы можете придумать? Выполняем самостоятельно. Задание 1 Измените команду для запроса погоды с /weather на /meteo. Добавьте в сообщение, отправ- ляемое ботом, также температуру в градусах Фаренгейта. Формула для перевода из Цельсия в Фаренгейты: F = С * 9/5 + 32 Библиогека DHT умеет сразу считывать в Фаренгейтах: float temp.f = dht.readTemperature(true);
Выполняем самостоятельно. Задание 2 Сделайте так, чтобы бот присылал разные смайлики (emoji) в сообщении в зависимости оз температуры: Если температура ниже +10 °C: (снежинка) Если температура от +10 °C до +25 °C: © (улыбка) Если температура выше +25 °C: О (огонь) Вы можете добавить смайлик прямо в строку ответа: response += Задание для любознательных Если вы используете датчик DHT22 (он более точный), попробуйте найти в интернете фор- мулу для расчета «индекса тепла» (Heat Index), который учитывает и температуру, и влаж- ность, показывая, как жара ощущается человеком. Добавьте расчет этого индекса в вашу программу и выводите его в Telegram вместе с темпе- ратурой и влажностью. Это потребует более сложных вычислений. Задание для любо знательных Сделайте ответ вашей метеостанции более наглядным! Модифицируйте код так. чтобы по- мимо числовых значений бот присылал простую текстовую шкалу (progress bar) для темпе- ратуры и влажности. Пример, как это может выглядеть в Telegram: Погода на сейчас: Q Температура: 23,5 °C 111111] (5 Влажность: 55,2% ! I Подсказка Вам нужно преобразовать диапазон значений датчика (например, для температуры от 0 до 50 °C, для влажности от 0 до 100 %) в диапазон длины вашей шкалы (например, от 0 до 20 символов). Для этою идеально подходит функция тар(). • long mappedValue = map(value, fromLow, fromHigh, toLow, toHigh); • Например, для температуры: Int tempBlocks = map( temperature_c, 0, 50, 0, 20); После того как вы получили количество «закрашенных» блоков (например. tempBlocks), вы можете в цикле for сформировать строку со шкалой, добавляя нужное количество сим- волов 'I' (или любого другого) и затем нужное количество символов Не забудьте добавить в начало сообщения подходящие смайлики (^. Д). чтобы сделать его еще симпатичнее! Подведем итог Отлично! Сегодня мы научились: • Различать датчики DHT11 и DHT22 и понимать их основные характеристики. • Правильно подключать датчики DHT к ESP32, не забывая о подтягивающем резисторе.
• Использовать библиотеку DHT sensor library для считывания показаний температуры и влажности. • Создавать Telegram-бота, который по команде пользователя предоставляет актуальные данные о «погоде» в месте установки датчика. Теперь ваши проекты могут «чувствовать» окружающую среду! Это открывает двери для создания систем климат-контроля, метеостанций, систем оповещения об изменении условий и многого другого.
Урок № 12. Автоматическая отправка данных с DHT по расписанию (FastBot2) Мы планируем • Научиться делать так. чтобы наш ESP32 сам, без команды от нас, периодически отправ- лял данные с датчика DHT (температуру и влажность) в Telegram. • Понять, почему для таких задач обычная функция delay () не очень подходит и как использовать функцию mi Ills () для создания неблокирующих задержек и выполнения за- дач по расписанию. • Настроить ESP32 на отправку данных в конкретный чат Telegram (ваш личный чат с бо- том) через заданные интервалы времени. Читаем. Автоматизация задач и почему delay () - не всегда хорошо В предыдущем урокс мы сделали метеостанцию, которая присылала данные по нашей команде. А что. если мы хотим получать сводку погоды автоматически, например, каждые 10 минут, без необходимости каждый раз писать богу? Проблема с delay() Первая мысль, которая может прийти в голову, - использовать delay () в основном цикле 1оор(): Очевидное, но неверное решение: Использовать 'delayO'. void loop() { sendDataO; delay(600000); // 10 минут } Почему 'delayO' —это катастрофа? 'delayO' — это полная остановка микроконтроллера Он буквально 'замораживает' выполнение программы. Выполнение программы н--------ь sendOatal) aelay(600000j //Плохой пример! void 1оор() { //... какой-то код ... read And SendData(); delay(600000); И Ждем 10 минут (600 000 миллисекунд)
Но у такого подхода есть большой недостаток Функция delay () полностью «замо- раживает» работу микроконтроллера на указанное время. Пока ESP32 «спит» в delay (), он не может делать ничего другого: • Он не сможет обрабатывать входящие команды от Telegram (потому что bot. tick () не будет вызываться). • Он не сможет реагировать на нажатия кнопок или другие события. • Вся программа просто останавливается. Для простых задач это может быть приемлемо, но для более сложных проектов, где нужно одновременно выполнять несколько дел. delay () - плохой выбор. Магия millis( ) - неблокирующие задержки Функция millis() - это наш спаситель! Она возвращает количество миллисекунд, прошедших с момента запуска программы па ESP32 (с момента включения или перезагрузки). Это просто счетчик времени. Как это использовать для создания задержки без блокировки9 1. Мы заводим переменную, в которой будем хранить время последнего выполнения нашего действия (например. lastSendTime). 2. В основном цикле loop() мы постоянно проверяем: текущее время (millis()) - время последнего действия (lastSendTime) > нужный интервал? 3. Если это условие истинно (прошло достаточно времени), мы выполняем наше дей- ствие (например, считываем данные с DHT и отправляем их) и сразу же обновляем lastSendTime на текущее время mi Ills () delay!) millisf) Программа "заморожена" Программа всегда активна Таким образом, 1оор() продолжает быстро выполняться. ESP32 успевает проверять команды от Telegram (bot. tick()) и делать другие полезные вещи, а наше периодическое действие срабатывает только тогда, когда приходит ею время.
Выполнение программы (с 'millisO') г Проверка времени 1оор() sendDataQ 'З? sendDataQ Команды обрабатываются в любой момент Пример логики: unsigned long previousMillis = 0; // Будет хранить время последнего действия const long interval = 1000; // Интервал между действиями (1 секунда) void 1иор() { unsigned long currentMillis = millis(); // Получаем текущее -;ремя if (currentMillis - previousMillis >= interval) { // Прошло достаточно времени, пора действовать! previousMillis = currentMillis; // Запоминаем время этого действия // ... здесь ваш код, который должен выполняться периодически ... // sendTemperatureToTelegram(); } // ... здесь другой код, который должен выполняться постоянно ... // bot.tickO; // checkButtons(); }
unsigned long lastSendTime = 0; const long interval = 300000; // 5 минут void loopO { Обработка команд не блокируется. bot.tickO; // Всегда на связи! // Прошло ли 5 минут? Простая проверка, которая не останавливает цикл if (millis() - lastSendTime >= interval) { lastSendTime = millisO; // Обновляем время sendClimateDataO; // Выполняем задачу 1 Изучаем на примере. Код для периодической отправки данных с DHT Интересный факт Счетчик millis() не бесконечен. Он хранится в переменной тина unsigned long, которая может вместить максимальное значение примерно 4,294,967,295 миллисекунд. Это чуть больше 49,7 дней. 11осле этого времени счетчик «переполнится» и сбросится в 0, и снова начнет считать. Для большинства DIY-проектов, которые периодически перезагружаются или не тре- буют такой долгой непрерывной работы, это не является проблемой. Но если вы создаете устройство, которое должно работать без перезагрузки месяцами, этот момент 1гужно учиты- вать и использовать специальные техники для корректной работы с переполнением mi Ills (). Давайте посмотрим, как будет выглядеть часть кода, отвечающая за периодическую от- правку данных: unsigned long previousMillis = 0; // Будет хранить время последнего действия const long interval = 1000; // Интервал между действиями (1 секунда) void loopO { unsigned long currentMillis = millis(); // Получаем текущее -ремя if (currentMillis - previousMillis >= interval) { // Прошло достаточно времени, пора действовать! previousMillis = currentMillis; // Запоминаем время этого действия // ... здесь ваш код, который должен выполняться периодически ... // sendTemperatureToTelegramf); } // ... здесь другой код, который должен выполняться постоянно ... // bot.tick(); // checkButtons();
Читаем. Отправка сообщения по инициативе ESP32 в конкретный чат Когда мы обрабатывали команду /weather, бот автоматически знал, кому отвечать - тому пользователю, который прислал команду. Но когда ESP.32 сам решает отправить сооб- щение (например, по расписанию), боту нужно явно указать, в какой чат это сообщение от- править. Важно: CHAT_ID - это строка, поэтому в коде его нужно будет определить так: #def ine MY_CHAT_ID 123456789 (замените 123456789 на ваш реальный 1D). Интересный факт Если ваш ESP32 работает от батарейки и должен отправлять данные очень редко (например, раз в час или раз в день), то постоянно держать его включенным и работающим в цикле 1оор() - неэффективно с точки зрения энергопотребления. У ESP32 есть специальные «спящие» режимы (например. Deep Sleep - глубокий сон). В этом режиме он потребляет очень мато энергии. Его можно настроить так, чтобы он «просыпался» через заданный интервал, выполнял нужные дей- ствия (например, считывал данные с датчика и отправлял их no Wi-Fi), а затем снова «засыпал». Это более сложная тема, но очень полезная для автономных устройств. Выполняем по образцу. Автоматическая Телеграм-метсостаниия Цель: сделать так, чтобы ESP32 каждые, скажем, 5 минут (для теста, потом можно увеличить) автоматически считывал данные с датчика DHT и отправлял их в ваш личный чат с Telegram- ботом. Что понадобится 1 Все то же, что и в уроке № 11 (ESP32, датчик DHT. резистор (если нужен), провода. Arduino IDE, библиотеки). 2. Ваш СНАТ_1!1 из Telegram. Схема подключения: такая же, как в уроке № 11. Код программы.
Пояснения к коду: • ^define MY CHAT ID "ВАШ ЛИЧНЫЙ СНАТ ID" обязательно замените на ваш реальный CHAT ID, полученный от @userinfobot. • lastAutoSendTime, autoSendlnterval: переменные для управления периодичностью автоматической отправки, an to Send Interval задан в миллисекундах (в примере - 5 минут). • autoSendEnabled булевый флаг для включения/выключения автоотправки через команды. • send\Vea1herData(String chatlD): мы вынесли логику чтения данных с DHT и фор- мирования сообщения в отдельную функцию. Она принимает chatlD - идентификатор чата, куда нужно отправить сообщение. • setup(): о fb::Message startMsg(..., MY CHAT ID) - при запуске отправляем приветствен- ное сообщение в ваш личный чат. о lastAutoSendTime = millis(); - инициализируем время для корректной работы первого интервала. . 1оор(): о bot.tick(); - как всегда, для обработки входящих сообщений. Бот всегда отзыв- чив! о if (currentTime - lastAutoSendTime >= autoSendlnterval) - основная логика про- верки времени для автоотнравки. о Если время пришло, обновляем lastAuloSendTime и вызываем sendWcatherData(MY CHAT ID), явно указывая ваш CHA I ID. Подсказка Правильный CHAT_ID: дважды проверьте, что указали верный CHAT_ID в кавычках. Иначе автоматические сообщения будут уходить «в никуда» или вызывать ошибку. Выбор интервала: для реального использования интервал в 1 минуту может быть слишком частым (это будет спам). Установите более разумное значение, например. 10 минут (10 * * 60 * * 1000), 30 минут или 1 час (60 * 60 * 1000). Тестирование: во время тестирования удобно использовать короткие интервалы (10-30 се- кунд), чтобы быстрее видеть результат. Не забудьте потом увеличить интервал. Как остановить/изменить авгоотправку? В текущем коде, чтобы изменить интервал или остановить отправку, нужно перепрошивать ESP32. В «Заданиях для любознательных» мы подумаем, как сделать это более гибко. Выполняем самоедоят ельно Сделайте так, чтобы интервал автоматической отправки можно было настроить через команду Telegram. Например, команда /set inte rval 5 должна устанавливать интервал отправки в 5 минут. Подсказка: • Вам понадобится глобальная переменная для хранения интервала • Создайте обработчик для команды /setinterval. • Извлеките число из сообщения (как мы делали для угла сервопривода). • Переведите минуты в миллисекунды.
Пока не будем беспокоиться о сохранении этого значения между перезагрузками ESP32 (это тема для EEPROM/Preferences, урок № 14). Выполняем самостоятельно Добавьте две команды (или инлайн-кнопки, если хотите услож- нить): - / st a rt aut о: включает автоматическую отправку данных. - /stopauto: выключает автоматическую отправку данных. Для этого вам понадобится бул свая переменная-флаг, напри- мер, bool autoReportEnabled = true;. В 1оор(), перед тем как проверять время для автоогправки, добавьте проверку этого флага: if (autoReportEnabled && (currentTime - lastAuto- ReportTime >= customAutoReportlnterval)). Функции-обработчики для /startauto и /stopauto будут просто устанавливать этот флаг в true или false, соответ- ственно, и отправлять подтверждение. Задание для любознательных Попробуйте сделать так. чтобы ESP32 отправлял автоматический отчет о погоде, только если температура или влажность изменились более чем на определенное значение (например, температура изменилась на 1 градус ИЛИ влажность на 5 %) с момента последней успешной автоматической отправки. Это поможет избежать отправки одинаковых данных и сэкономит трафик/впимание. Вам понадобятся переменные для хранения предыдущих успешно отправ- ленных значений температуры и влажности. Подведем итог Сегодня вы научились очень важной вещи - делать ваши Е8Р32-проекты автономными и проактивными! Теперь вы умеете: • Использовать mill is () для выполнения задач по расписанию без блокировки основного кода. • Настраивать ESP32 на автоматическую отправку данных в Telegram в указанный чат через заданные интервалы. • Понимать разницу между ответом на команду и инициативной отправкой сообщения ботом. Эти знания позволят вам создавать проекты, которые не просто ждут команд, а сами следят за обстановкой и информируют вас о важных событиях. Это может быть система безопас- ности, которая шлет фото при обнаружении движения, или умная теплица, которая сооб- щает об изменении микроклимата. Продолжайте экспериментировать!
Урок № 13. Датчик освещенности (фоторезистор). Измеряем свет и отправляем данные в Telegram Мы планируем • Познакомиться с одним из самых простых, но очень полезных датчиков - фоторезисто- ром (LDR). • Подключить фоторезистор к ESP32 и научиться считывать его показания. • Отправлять полученные значения уровня освещенности в Telegram через бота с помо- щью библиогеки FastBot. Читаем Фоторезистор, также известный как LDR (Light-Dependent Resistor - светозависимый резистор), - это пассивный электронный компонент, электрическое сопротивление которого изменяется в зависимости от интенсивности падающего на него света. Принцип его работы прост и элегантен: чем ярче свет, падающий на чувствительную поверхность фоторезистора, тем ниже его электрическое сопротивление. И наоборот, в темноте его сопротивление значи- тельно возрастает. Благодаря этому свойству фоторезистор является простым, но очень эффективным ана- логовым датчиком для определения общего уровня освещенности в окружающей среде. Интересный факт Фоторезисторы были изобретены еще в начале XX века и на протяжении десятилетий ши- роко применялись в таких устройствах, как экспонометры в фотоаппаратах и системы авто- матического включения уличного освещения. Хотя сегодня в высокоточных приборах их часто заменяют более совершенными цифровыми датчиками, фоторезисторы остаются чрез- вычайно популярными в образовательных и D1 Y-проектах благодаря своей простоте, надеж- ности и низкой стоимости. Изучаем па примере Допустим, фоторезистор подключен к аналоговому7 входу ESP32, например, к пину 34. Мы будем периодически считывать его показания и отправлять в Telegram по команде поль- зователя.
Важный момент - показания АЦП не всегда линейны и зависят от конкретной схемы и питания, но для простого контроля такой способ вполне подходит. Читаем FastBot позволяет легко обрабатывать команды и отправлять ответы. Для работы с АЦ] 1 достаточно вызвать функцию analogRead(pin), которая вернет число от 0 до 4095. Мы сде- лаем так, что при получении команды /light бот измерит уровень света и отправит его значение пользователю. Выполняем по образцу Подключаем необходимые библиозеки и задаем параметры Wi-Fi и боза. Насзраиваем пин для чтения аналогового сигнала с фоторезисзора. В setup () подключаемся к Wi-Fi и регистрируем обработчик новых сообщений. В обработчике onNewMessage проверяем, что пришло сообщение /light Если да, то считываем уровень освещенности с помощью analogRead( light Pin) и отправляем пользователю. Если приходит любая другая команда, отправляем подсказку. Выполняем самостоязельно Измените код так, чтобы бот отправлял не только значение АЦП, но и просзой комментарий: - если значение меньше 1000 - «Темно»; - от 1000 до 3000 - «Среднее освещение»; - выше 3000 - <<Ярко». Добавьте команду /light.raw, которая будет отправлять только сырое число с датчика.
Чувство Света: Измеряем Освещенность Фоторезистором Принцип работы Результат Темнота Схема подключения Ceei Подсказка При работе с аналоговыми входами могут возникнуть непредвиденные сложности. Вот не- сколько советов для их решения: 1. Правильный пин: для считывания аналоговых сигналов на ESP32 необходимо исполь- зовать специальные пины АЦП. Падежными вариантами являются пины с GPIO34 по GP1O39. Убедитесь, то ваш датчик подключен именно к одному из них. 2. Проверка схемы: дважды проверьте правильность сборки делителя напряжения. Убеди- тесь, что фоторезист ор и постоянный резистор подключены верно, а точка их соединения идет на аналоговый пин ESP32. 3. Диатостика: если данные не приходят в Telegram, используйте Serial. println() в вашем коде, чтобы выводить сырые значения с датчика в Монитор порта Arduino IDE. Это поможет определить, связана ли проблема с аппаратной частью (неверные или отсутствующие данные) или с программной (проблемы с Wi-Fi или Telegram). Выполняем самостоятельно С оздайте команду /monitor_light. которая запускает автоматическую отправку показаний осве- щенности в Telegram каждые 30 секунд (например, с помощью millis()), пока пользователь не отправит команду /stop_monitor Это позволит отслеживать освещенность в реальном времени. Задание для любо «нательных Модифицируйте проект для реализации системы уведомлений, управляемой событ иями. ESP32 должен постоянно отслеживать уровень освещенности, но отправлять уведомление в Telegram только в том случае, если значение изменилось существенно (например, разница между теку- щим и последним отправленным значением превышает 500). Такой подход позволяет избе- жать «спама» в чате при незначительных колебаниях света и информировать пользователя только о важных событиях, таких как включение или выключение света в комнате.
Подведем итог Этот урок стал вашим введением в мир аналоговых датчиков и их интеграции с ESP32 и облачными сервисами. Мы достигли нескольких важных целей и освоили ключевые навыки: • Мы познакомились с фоюрезистором и научились считывать его аналоговые данные с помощью АЦП на ESP32. • Мы успешно интегрировали показания датчика с Telegram, создав бота, который сооб- щает об уровне освещенности по команде. • Мы рассмотрели способы расширения базового функционала, включая качественную оценку света и создание режима автоматического мониторинга. Полученные навыки являются фундаментальными для создания интеллектуальных систем, способных анализировать окружающую обстановку и реагировать на нее. Принципы, кото- рые мы изучили на примере фоторезистора, легко применимы ко множеству других анало- говых датчиков, таких как датчики влажности почвы, температуры, звука и многие другие.
Урок № 14. Сохраняем данные? Введение в энер1 онезависнмую память ESP32 (Preferences) Мы планируем • Проанализировать проблему потери данных в переменных при перезагрузке ESP32. • Изучить концепцию энергонезависимой Hash-памяти • Освоить библиотеку Preferences для сохранения и чтения данных. • Реализовать практический пример для сохранения и чтения насгроск между сеансами работы устройства. Читаем. Проблема «забывчивости» Предположим, в вашем коде есть переметшая String userName = ' Alex ;, в которой хранится имя пользователя Пока устройство включено, все работает безупречно. Но стоит выключить ESP32 из розетки и снова включить, как плата «забудет» все, что знала. Пере- менная userName вернется к своему исходному значению, заданному в коде, или, если она не была инициализирована, окажется пустой. Любая протрамма, работающая на ESP32. хра- нит свои переменные и временные данные в оперативной памяти (SRAM). Главное свойство этой памяти - энерго зависимость Это неудобно. Мы ведь хотим, чтобы наше устройство помнило важные вещи: на- стройки Wi-Fi, пороговые значения для датчиков, установленные пользователем, или даже рекорды в шре. Решение. Память, которая не забывает (энер| онезависимая память) Решение проблемы «забывчивости» встроено непосредственно в микроконтроллер ESP32 - это flash-память. В отличие от оперативной памяти, flash-память является энерго- независимой данные, записанные в нее, сохраняются даже после полного отключения пита- ния. Это тот же тип памяти, который используется в SSD-дисках и USB-накопителях. Но работать с flash-памятью напрямую сложно. Чтобы упростить нам жизнь, разработ- чики ESP32 создали библиотеку Preferences (в переводе «предпочтения» или «настройки»). Она позволяет использовать часть flash-памяти как удобную записную книжку, где данные хранятся по принципу «ключ-значение». Эту модель можно представить как гардероб с про- нумерованными ящиками: у каждого ящика есть уникальная бирка (ключ), а внутри него лежат какие-то вещи (значение): 1. Ключ (key) - это уникальное имя для ваших данных, всегда в виде строки. Напри- мер: «reboot_count», «user_name». 2. Значение (value) - это сами данные, которые вы хотите сохранить. Они могут быть разных типов: число (5), строка («А1ех»), булево значение и другие. Библиотека Preferences позволяет легко «открывать» эту записную книжку, класть в нее новые значения по ключам, забирать их и «закрывать».
Обретение Памяти: Сохраняем Данные с Preferences Проблема vs Решение Переменные "забываются" при перезагрузке Энергонезависимая память хранит данные навсегда Метафора "Записная книжка" preferences.b«gin(*«iy <ipp'. ...) preferences.putulntfieboots', 41) preferences.getulnt('retx>ots', ej Открываем записную книжку Делаем запись: "reboots" = 42 preferences end() Читаем запись Закрываем книжку "reboots" (сохраняем!) s [Reboots. 1| [Reboots. 2 j Интересный факт Flabh-память, хоть и кажется волшебной, имеет 01раничение: количество циклов перезаписи для каждой ячейки. Обычно это число очень большое (десятки или сотни тысяч раз), но не бес- конечное. Именно поэтому не стоит записывать даш1ые в Preferences постоянно, например, в каждом цикле 1оор(). Лучшая практика - записывать данные только тогда, когда oim дей- ствительно изменились (например, пользователь изменил настройку через Telegram). Изучаем на примере Давайте рассмотрим основной «рецепт» работы с библиотекой Preferences 1. Подключаем библиотеку: ^include <Preferences.h>. 2. Создаем объект: Preferences preferences. 3. Работа с памятью (сохранение). void saveDataQ { //Открываем "записную книжку" с именем ”ту-арр" в режиме чтения/записи (false), preferences. begin("my-app ", false); // Очищаем все старые записи в этой "книжке" (необязательно) //preferences. clear(); //Кладем данные: ключ "reboots", значение - число 42 preferences.putUlnt("reboots", 42); //Кюдем данные: ключ "user", значение - строка "Maria" preferences.put Str ing( "user ", "Maria ");
//Важно! "Закрываем книжку", чтобы все изменения сохранились, preferences. end(); } 4. Работа с памятью (чтение). void load Dat а () { //Открываем ту же "книжку" "ту-арр", но в режиме "только для чтения" (true). // Это безопаснее и немного быстрее. preferences. begin("my-app ", true); //Пытаемся получить значение по ключу "reboots". //Если такого ключа нет, вернется значение по умолчанию: 0. unsigned int rebootCounter = preferences.getUInt("reboots", 0); //Пытаемся получить строку по ключу "user". //Если ключа нет, вернется пустая строка String userName = preferences.getStringf"user", ""); // "Закрываем книжку". preferences. end(); // Теперь можно использовать переменные rebootCounter и userName Serial.printf'User name: "); Serial.println(userName); Serial.print("Reboot count: "); Serial, printin (rebootCо unter); } Выполняем по обращу Цель: создать про]рамму, которая считает количество перезагрузок ESP32. Этот простой при- мер наглядно продемонстрирует, как данные сохраняются в энергонезависимой памяти между выключениями устройства. Что понадобится 1. Плата ESP32. 2. Установленная Arduino IDE с поддержкой ESP32. Код программы: скопируйте, вставьте и загрузите этот код в ваш ESP32. Затем откройте Монитор порта (установите скорость 115200).
Как это работает? За1рузите код. Вы увидите в мониторе порта сообщение «Количество переза!рузок: 1». Теперь нажмите физическую кнопку RS-1" (Reset) на вашей плате ESP32. Протрамма запустится заново, но так как мы сохранили значение, на этот раз она считает из памяти 1, увеличит до 2 и выведет «Количество перезагрузок: 2». Каждое нажатие на RST будет увеличивать счетчик! Подсказка • Всегда вызывайте preferences.end(): это одна из самых частых ошибок. Если вы вы- звали р ref е fences. begin(), но забыли вызвать р references, end () после записи данных, ваши изменения не сохранятся во flash-памяти. • Имена ключей. Ключи чувствительны к регистру («Count» и «count» - это разные ключи) и их длина не должна превышать 15 символов. • «Пространства имен». Первый аргумент в preferences.begin() (например, «reboot- counter») действует как имя для вашей «записной книжки». Это позволяет изолировать данные разных проектов друг от друга. Если вы работаете над несколькими устройствами, используйте уникальные пространства имен, чтобы избежать конфликтов Выполняем самостоятельно. Задание 1 Модифицируйте код счетчика переза! рузок так. чтобы он дополнительно сохранял время (в миллисекундах) последней перезагрузки устройства. 1. Используйте функцию millis() для получения времени с момента запуска. 2. Так как millis() возвращает большое число, для его сохранения используйте preferences.putULong()и preferences.getULong() Выполняем самостоятельно. Задание 2 Создайте Telegram-бота, который будет запоминать ваше имя. 1. Добавьте обработчик для команды /setname <ваше_имя>, например: /setname Ivan 2. Внутри обработчика извлеките имя из сообщения и сохраните его в Preferences по ключу, например, «user-name».
3. Добавьте команду/getname 4. В обработчике этой команды считайте имя из Preferences и отправьте его в чат. Если имя еще нс было установлено, бот должен ответить что-то вроде «Я еще не знаю вашего имени. Используйте / setпате». Задание для любознательных Библиотека Preferences умеет хранить не только числа и строки Изучите другие функ- ции: putBool(), putFloat(), putBytes(). Создайте Telegram-бота. который позволяет включать и выключать «режим уведомлений». • Команда /notify_on должна сохранять true по ключу «notifications». • Команда /notlfy_off должна сохранять false по тому же ключу. • Команда /status должна считывать этот флаг и сообщать, включены уведомления или выключены. Подведем итог На этом уроке мы освоили один из самых важных навыков в разработке умных устройств - сохранение данных. Теперь ваши проекты обрели «память» и стали значительно функцио- нальнее. Ключевые навыки, которые вы освоили: • Различие между оперативной (энергозависимой) и flash (энергонезависимой) памятью. • Использование библиотеки Preferences для надежного сохранения настроек, состоя- ний и пользовательских данных. • Применение простого и мощного механизма «ключ-значение» для сохранения и чтения информации различных типов. • Понимание важности сохранения данных только по необходимости для продления срока службы flash-памяти. Освоенный навык является фундаментальным для создания по-настоящему умных и на- страиваемых lol-проектов, которые помнят предпочтения пользователя и могут автономно работать после перезагрузок.
Урок № 15. Уведомления по условию: создание проактивного 1оТ-монитора Мы планируем • Объединить наши знания из предыдущих уроков (датчики, millis(), Preferences и FastBot). • Создать настоящий «умный монитор», который не просто пассивно отдает данные, а активно следит за обстановкой. • Научиться устанавливать пороговое значение для датчика (например, максимальную температуру) через команду в Telegram. • Сохранять это пороговое значение в энергонезависимую память с помощью Preferences. • Написать программу, которая будет автоматически отправлять тревожное уведомление в Telegram, если показания датчика выйдут за установленные пределы. Читаем. От пассивного отчета к активному мониторингу До этого наша метеостанция работала как справочное бюро: мы спрашивали «какая температура?», она отвечала. Это полезно, но не очень «умно». Вместо тою чтобы постоянно запрашивать данные вручную, мы делегируем эту задачу самому устройству, которое пре- вращается в неусыпного стража, готового немедленно сообщить о выходе параметров за до- пустимые пределы, будь то критическое повышение температуры в серверной или падение температуры в теплице с ценными растениями. Наша сегодняшняя задача - создать именно такую систему. Она будет состоять из двух ло! ических частей: До этого наша метеостанция работала как справ' ;чное бюро: мы спрашивали, она отвечала Это полезно, но не очень "умно". Мы постоянно запрашиваем данные вручную, вместо того чтобы делегировать задачу самому устройству. Пользователь РЕАКТИВНЫЙ 1. Конфигурация (настройка). Пользователь должен иметь возможность сказать устройству, какое значение он считает критическим. Мы реализуем это через команду в Telegram, например: /settemp 30. Когда ESP32 получит эту команду, он должен «понял*». что 30 - это новая пороговая температура, и сохранить это значение в Preferences, чтобы не забыть его по- сле I тереза 1рузки. Команда /settemp 28 ESP52 сохраняет порог в Preferences Датчик DHT22 считывает- 29ОС ESP52 сравнивает 29°>28° Автоматическое уведомление- «ТРЕВОГА! Высокая температура!»
2. Мониторинг (наблюдение). В основном цикле 1оор() наш ESP32 будет постоянно, с определенным интервалом (используя )), делать три вещи: о Считывать актуальные данные с датчикаПНТ. о За^ужать из Preferences сохраненный пользователем порог. о Сравниватьих: if (текущая_температура > пороговое_значение). Если у сло- вно выполняется, он отправит тревожное сообщение в наш чат Telegram. 4. Уведомление Если 'currentTemp > tempThresnold', ESP32 шлет ТРЕВОГУ 2. Сохранение ESP32 сохраняет порог в Preferences 3. Мониторинг ESP32 постоянно сравнивает currentTemp* vs 'tempThresnold И Основная логика bot.sendMessage(-ТРЕВОГА I", My.CHAT JD); Интересный факт Проблема «дребезга» и спама. Что такое гистерезис? Представьте, чю вы установили порог н-28,0 °C. А реальная температура колеблется прямо на этой границе: 27,9 °C, 28,1 °C, 28,0 °C, 28,2 °C, 27,9 °C... Если просто проверять if (temp > threshold), ваш бот засыплет вас уведомлениями: «Тревога!», «Все ок», «Тревота!», «Тревога!», «Все ок». Это явление, известное как «дребезг» на границе порога, превращает полезную систему оповещения в источник спама и раздражения Чтобы этого избежать, инженеры используют прием под названием «гистерезис» или «мертвая зона». Логика немного усложняется: 1 Мы заводим флаг, например, bool highTempAlertSent = false; 2. Когда температура впервые превышает порог (temp > threshold), мы отправляем одно уведомление и сразу же устанавливаем флаг highTempAlertSent = t rue;. 3. Пока флаг равен t rue. мы больше не шлем уведомлений, даже если температура продол- жает расти. 4. Мы сбросим флаг обратно в false только тогда, когда температура опустится значи- тельно ниже порога, например, на 1-2 ]'радуса (temp < threshold - 2). Это и есть «мерт- вая зона», которая защищает от ложных срабатываний на границе.
Искусство Не Кричать: Как Гистерезис Побеждает Спам Представьте, что температура колеблется прямо на границе порога: 27.9°С, 28.ГС, 28.0°С... Ваш бот засыплет вас уведомлениями 4 А 4 4 А ТРЕВОГА’ ТРЕВОГА’ ТРЕВОГА' TPEBOTAJ ТРЕВОГА! Key Logic 1. 'temp > threshold && IhighTempAlertSent' -> Отправить тревогу highTempAlertSent = t ue; 2. 'temp < threshold - 2' -> Сбросить флаг, highTempAlertSent = false; Изучаем на примере Давайте набросаем структуру нашего будущего кода. // — Глобальные переменные — //... объекты для WiFi, FastBot, DHT, Preferences ... float tempThreshold; //Переменная для хранения порога температуры bool highTempAlertSent = false; //Флаг для защиты от спама // — Функция для настройки порога — void handleSetTempCommand(const char* message) { //1. Извлекаем число из сообщения (например, из "/settemp 30" получаем 30) //2. Сохраняем это число в Preferences по ключу "temp thresh" // 3. Обновляем нашу глобальную переменную tempThreshold //4. Отправляем пользователю подтверждение } // — set up () — void set up () { //... инициализация всего (Serial, WiFi, Bot. DHT)... // Инициализируем Preferences preferences, beginf'meteo-settings ”, false); // Загружаем сохраненный порог. Если его нет, ставим по умолчанию, например 50.0 tempThreshold = preferences.getFloatf'temp thresh”, 50.0); preferences. end();
// Привязываем команду hot.attachCommandf "/settemp", handleSetTempCommand); } // — loop() — void loop() { bot.tick(); //Всегда проверяем сообщения от Telegram //Проверяем, не пора ли измерить температуру (логика с millis()) if (/* пора проверять */) { float currentTemp = dht.readTemperature(); // Читаем температуру // Основная логика с гистерезисом if (currentTemp > tempThreshold&& (highTempAlertSent) { //Температура ВПЕРВЫЕ превысила порог hot.sendMessage("TPEBOTA! Температура слишком высокая!", МУ CHAT ID); highTempAlertSent - true; //Поднимаем флаг, чтобы больше не спамить } else if (currentTemp < tempThreshold - 1) { //-1 градус для гистерезиса // Температура вернулась в норму highTempAlertSent = false; // Сбрасываем флаг, система снова готова к тревоге } } } Выполняем по образцу Цель: создать умную метеостанцию, которая будет активно мониторить температуру и авто- матически отправлять тревожное уведомление, если она превысит пороговое значение, уста- новленное через Telegram. Что понадобится • Все, что было в уроках № 11 и 14: ESP32, датчик DHT, провода, Arduino IDE. • Токен вашего бота и ваш личный CHAT_ID из Telegram. • Библиотеки: FastBot, DHT sensor library. Adafruit Unified Sensor, Pref- erences. Схема подключения: такая же, как в уроке № 11.
Код программы. Подсказка CHAT ID для уведомлений. Убедитесь, что вы указали свой правильный CHAT_ID в кон- станте MY_CHAT_ID Это важно, так как автоматические уведомления инициируются самим устройством, а не в ответ на команду', поэтому боту нужно точно знать, куда отправлять сооб- щение. Типы данных. Порог температуры может быть дробным, поэтому мы используем тип float и функции atof (), putFloat() и getFloat(). Защита от спама. Не пренебрегайте флагом highTempAlertSent Без него вы рискуете полу- чить десятки одинаковых сообщений, если температура будет колебаться на границе порога. Обсуждаем Предложите способ масштабирования этой системы. Как бы вы изменили код и команды, чтобы управлять порогами для нескольких датчиков (например, температуры и влаж- ности) в рамках одного устройства? Как бы вы изменили команды, чтобы интерфейс оставался интуитивно понятным для пользователя? Например, /set temp_high 30. /set humidity low 40 Какие преимущества и недостатки у такого подхода? Выполняем самостоятельно. Задание 1 Добавьте в систему нижний порог тревоги. 1. Создайте команду /setlowtemp <температура>. например./setlowtemp 15 2. Сохраняйте это значение в Preferences по новому ключу (например, «low temp thresh»). 3. Добавьте в 1оор() логику, которая будет слать тревожное сообщение, если температура опустится ниже этого порога. Не забудьте про отдельный флаг для защиты от спама для этого случая (например, lowTempAlertSent).
Выполняем самостоятельно. Задание 2 Создайте команду /status. При получении этой команды бот должен отправлять в чат сводку: - текущую температуру и влажность; - установленный верхний порог температуры; - установленный нижний порог температуры (из предыдущего задания). Задание для любознательных Для более глубокого понимания масштабируемости предложенной архитектуры объедините этот проект с датчиком освещенности из урока № 13. Добавьте возможность устанавливать пороговое значение освещенности (например, /setlight <значение>) и получать уведомле- ние, если в помещении стало слишком темно. Вам потребуется добавить еще один обработчик команды, сохранить новый порог в Preferencesпод уникальным ключом и реализовать логику мониторинга с отдельным флагом тревоги. Это задание наглядно демонстрирует, как изученный архитекгурный паттерн является универсальным и легко расширяемым для кон- троля множества различных параметров. Подведем итог Вы проделали путь от простого сборщика данных до архитектора настоящей интеллекту- альной системы. Ваш проект теперь не просто пассивно отвечает на команды, а самостоя- тельно и проактивно следит за обстановкой, предупреждая о потенциальных проблемах. Этот навык является ключевым для разработки серьезных 1оТ-решений. В ходе урока вы научились: • Проектировать логику для систем проактивного мониторинга. • Эффективно комбинировать показания датчиков, сохраненные в энергонезависимой па- мяти настройки и отправку уведомлений. • Реализовывать на практике механизм гистерезиса для защиты от ложных срабатываний и спама. Освоенный вами паттерн - Настройка -> Сохранение -> Мониторинг -> Уведомление - является фундаментальной основой для огромного количества более сложных 1оТ-проск- тов, от домашних систем безопасности до промышленного контроля.
Урок№ 16, DHT22 с Universal Telegram Bot Мы планируем • Подключить датчик температуры и влажности DHT22 (или DHT11) к ESP.32. • Научиться считывать данные с датчика DHT с помощью соответствующей библиотеки. • Реализовать отправку показаний температуры и влажности в Telegram по команде поль- зователя, используя библиотеку Universal Telegram Bot. • Сравнить подход к сбору и отправке данных с датчика при использовании Universal Telegram Bot с аналогичным решением на FastBot (из предыдущих уроков или гипотетиче- ским). Читаем Интересный факт Датчики DHT - это простые и доступные компоненты, которые позволяют измерять темпе- ратуру окружающей среды и относительную влажность воздуха. Они широко используются в DIY-проектах домашних метеостанций, систем контроля климата и т. д. Сегодня мы вспомним подключение к ESP32 датчика температуры и влажности DHT22 (или его более простой аналог D11T11) и научим нашего Telegram-бота сообщать нам актуаль- ные показания при помощи Universal Telegram Bot. Изучаем на примере 1. Вспомним подключение датчика из урока №11:
2. Библиотека для датчика уже должна быть установлена (из урока №11). Обратитесь к нему, если удалили ее. 3. Теперь объединим наши знания о Universal Telegram Bol с умением читать данные с DHT. Основная идея: - Бот ждет команду от пользователя (например, /get_dht_utb). - При получении команды ESP32 считывает данные с датчика DHT. - Формирует сообщение с показаниями температуры и влажности. - OTnpaBjiaeT это сообщение пользователю с помощью Universal Telegram Bot. Читаем Если бы мы делали то же самое с FastBot, общая логика была бы очень похожей: 1. В loop() вызываем bot.tick(). 2. При bot. newllpdates() проверяем msg. text па команду (например, /get_dht_fb). 3. Считываем данные с DHT. 4. Формируем строку ответа. 5. Отправляем с помощью bot.sendMessage( responseText, msg.chatID). Ключевые отличия будут лежать в синтаксисе инициализации бота, методах получения обновлений и отправки сообщений, как мы уже обсуждали в предыдущем уроке. Сам код для работы с датчиком DHT останется практически идентичным, так как он не зависит от библио- теки Telegram-бота. Интересный факт Некоторые датчики DHT, особенно при частом опросе или в условиях нестабильного пита- ния, могут иногда возвращать некорректные данные или ошибки чтения. Поэтому в коде всегда рекомендуется проверять полученные значения (например, с помощью isnan ()) пе- ред их использованием пли отправкой. Выполняем по образцу Отправка данных с DHT22 по команде /get_dht_utb (Universal Telegram Bot). Создадим полный скетч.
Подсказка - St г i ng (value, 1) форматирует число с плавающей точкой, оставляя один знак после запятой. -11осле загрузки скетча отправьте боту команду /get dht ut b. Обсуждаем 1. Какая часть кода отвечает за чтение данных непосредственно с датчика DHT? Является ли эта часть кода зависимой от библиотеки Universal Telegram Bot и почему? 2. Представьте, что вы хотите, чтобы бот автоматически отправлял данные с DHT каждые 30 минут, а не только по команде. Как бы вы модифицировали 1оор() для реализации такой функциональности, используя Universal Telegram Bot? (Не нужно писать код, просто опи- шите логику). Выполняем по образцу Теперь мы можем сравнить скетч на FastBot из урока № 11 со скетчем на Universal Telegram Bot, который мы написали в разделе «Выполняем по образцу» этого урока. Их срав- нение представлено в таблице. Таблица Аспект сравнения Решение на FasiBot Решение на Universal Telegram Bot 1. Инициал и запия объекта бота FastBot bot (BOT.TOKEN) WiFiClientSecure client; UniversalTelegramBot bot(B0T_T0KEN, client); client.setCACert(TELEGRAM_CERTIF ICATE_R00T); 2. Проверка новых сообщений в loop!) bot.tick(); if (bot.newlipdates()) { ... } if (millist) > lastTimeBotRan + botRequestDelay) { /* часть обновления*/ } 3. Получение текста команды от пользователя FB_Message msg = bot.newMes[i]; String command = msg.text; telegramMessage &msg = bot.messages[i]; String command = msg.text; 4. Код чтения данных с датчика DHT float h = dht.readHumidity(); float t = dht.readTemperature(); 5 Формирование строки ответа с данными датчика String response = "Температура: " + Stringlt, 1) + " C\n"; response += "Влажность: " + Stringfh, 1) + " %"; responseText = "Температура: " + St nngftemperature, 1) + " °C\n"; responseText += "Влажность: " + String(humidity, 1) + " %"; 6. Отправка ответного сообщения пользователю bot.sendMessage(response, msg.chat); bot.sendMessage(msg.chat_id, responseText, "");
Интересный факт Точность датчиков DHT может немного «плавать» в зависимости от конкретного экзем- пляра, условий окружающей среды и даже длины проводов до микроконтроллера. Для более точных измерений в профессиональных или научных целях часто используют более доро- гие и прецизионные датчики. Задание для любознательных Проведите небольшое исследование: найдите в интернете информацию о датчике ВМЕ280 Это популярный компонент, который способен измерять не только температуру и влажность, но и атмосферное давление. Изучите, какой интерфейс (SPI или I2C) он использует для связи с микроконтроллером. Оцените, насколько сложно было бы адаптировать сегодняшний скетч для работы с ВМЕ280 вместо DHT22, с точки зрения логики самою Telegram-бота, не углуб- ляясь в детали библиотеки для ВМЕ280. Подведем итог • Успешно интегрирован сбор данных с физического датчика с Telegram-ботом на базе биб- лиотеки Universal Telegram Bot, реализовав отправку показаний по команде пользователя. • Проведен детальный сравнительный анализ подходов с использованием Universal Telegram Bot и FastBot, который показал, что логика работы с датчиком остается неизменной, а раз- личия лежат в специфике библиотек для Telegram. • Убедились, что ESP32 в связке с Telegram и датчиками позволяет создавать полезные loT-усзройства для мониторинга окружающей среды.
Урок № 17. Оi правка фото с ESP32-CAM через Telegram Мы планируем • Познакомиться с возможностями модуля ESP32-CAM для захвата изображений. • Научиться получать фото с камеры ESP32-CAM. • Реализовать отправку сделанного снимка в Telegram по команде пользователя, используя библиотеку Universal Telegram Bot. Читаем Мы уже научились передавать текстовые сообщения и данные с различных датчиков между ESP32 и Telegram. Сегодня мы сделаем следующий шаг и научим нашу ESP32 не про- сто «говорить», но и «видеть»! Если у вас есть модуль ESP32-CAM, этот урок откроет вам новые возможности в области видеонаблюдения и визуальных уведомлений. Модуль ESP32-CAM - это компактное и мощное решение, которое объединяет в себе все возможности микроконтроллера ESP32 со встроенной камерой. Такая интеграция делает его идеальным выбором для создания проектов, требующих визуального компонента. На его основе можно реализовывать разнообразные устройства: от простых систем видеонаблюдения и умных дверных звонков до роботов с «глазами», которыми можно управлять удаленно. Видеть Мир: Отправка Фото с ESP32-CAM Процесс 0 /get_photo I I Инициализация камеры I esp_camera_fb_get() Dot.sendPhoto(...) Результат Требуется специальная настройка платы 'AI Thinker ESP32-CAM’ п Arduino IDE Интересный факт Модуль ESP32-CAM широко используется в проектах «умного дома» для удаленного мони- торинга помещений, наблюдения за домашними животными или создания простых систем безопасности. Его компактный размер и встроенный Wi-Fi делают его очень удобным для таких задач.
Изучаем на примере Общая логика работы нашей системы проста и эффективна: устройство ожидает ко- манду от пользователя в чате Telegram, после получения команды захватывает изображение с камеры и отправляет его обратно в тот же чат. Этот процесс можно разбить на несколько ключевых шагов Основная идея 1. При получении команды, например, /get_photo, микроконтроллер акшвпрует мо- дуль камеры. 2. Устройство делает один кадр. 3. Программа получает данные снимка в формате JPEG, который является оптималь- ным для передачи через интернет. 4. С помощью библиотеки Universal Telegram Bot полученный снимок отправляется пользователю в Telegram. /get_photo Читаем Наш подход будет заключаться в следующем: в функции 1оор() мы будем проверять наличие новых сообщений, как мы это делали в уроке № 16. При обнаружении специальной команды, например. /get_photo. мы вызовем функцию, которая захватит изображение с ка- меры и отправит его в Telegram. Код для захвата изображения с камеры ESP32 -САМ не зависиг от библиотеки Telegram-бот а. Он использует специальные функции из библиотеки esp_camera А вот отправка этого изоб- ражения в Telegram будет осуществляться через метод sendPhoto библиотеки Universal Telegram Bot. Интересный факт Отправка изображений в Telegram через API бота обычно подразумевает передачу файла. Для ESP32-CAM это означает, что изображение, захваченное камерой, должно быть вре- менно сохранено в памяти (или на SD-карте, если она используется), а затем отправлено как байтовый массив. Telegram Bot API поддерживает отправку фотографий как байтовых данных.
Выполняем по обращу Теперь давайте создадим полный скетч. Очень важно: перед загрузкой этого кода в вашу ESP32-CAM. убедитесь, что вы правильно настроили плату в Arduino IDE и устано- вили необходимую библиотеку для работы с камерой (обычно esp_camera доступна через Boards Manager). Также проверьте, что у вас установлена библиотека UniversalTelegramBot (урок № 1.2). Создадим полный скетч. Подсказка Прошивка модуля ESP32-CAM имеет свои особенности. Чтобы избежать распространенных ошибок, обратите внимание на следующие моменты: • Правильная плата: В Arduino IDE (Инструменты -> Плата) выберите правильную плату для вашей ESP32-CAM, например, «А1 Thinker ESP32-CAM». • Перед загрузкой скетча в ESP32-CAM, возможно, по требуется перевести модуль в режим прошивки (обычно это делается удержанием кнопки GPI06 при подключении к USB и нажа- тием кнопки RST). Обсуждаем 1. Какая основная функция или набор функций отвечает за захват изображения с камеры ESP32-CAM? Является ли эта часть кода зависимой от библиотеки Telegram-бота и почему? 2. Представьте, что вы хотите отправлять не просто фотографии, а видеопоток. Какие до- полнительные сложности могут возникнуть при реализации такой функциональности с ис- пользованием Telegram-бота на ESP32-CAM Выполняем самостоятельно Для закрепления полученных навыков выполните следующее практическое задание. Моди- фицируйте код таким образом, чтобы вместе с фото!рафией бот отправлял подпись (caption), содержащую информацию о времени, когда был сделан снимок.
Задание для любо {нательных Исследуйте возможность добавления кнопок управления для ESP32-CAM в Telegram. Напри- мер. можно добавить кнопки для: • Изменения разрешения снимка (QVGA, VGA, SXGA и т. д.). • Включения/выключения вспышки (LED на ESP32-CAM). • Переключения между режимами фото и, если возможно, записи короткого видео (хотя отправка видеопотока сложнее). Как бы вы реализовали это, используя FastBot или Universal Telegram Bot. применяя знания из предыдущих уроков об инлайн-кнопках? Подведем итог • Изучили возможности модуля ESP32-CAM и его ключевую роль в проектах с визуаль- ным компонентом. • Научились программно получать фото с камеры модуля, используя библиотеку esp camera. • Реализовали отправку этих изображений в Telegram по команде пользователя, используя библиотеку Universal Telegram Bot.
Урок № 18> Парсинг сложных команд в Telegram: создание гибкою интерфейса Мы планируем • Научиться обрабатывать более сложные и составные команды от пользователя в Telegram. • Понять, как извлекать нужную информацию (параметры, значения) из полученных со- общений. • Неволь зов ат ь эти навыки для создания более гибко! о и функционального бота на ESP32 с библиогекой FastBot. Читаем До сих пор наш бот в основном реагировал на простые, предопределенные команды, вроде /st art или /ledon. Это хорошо для базового управления, но что, если мы хотим ска- зать боту «установи таймер на 10 минут» или «включи свет в гостиной»? Для таких задач нам нужен парсер сообщений. Парсинг сообщения - это процесс «разбора» входящего текста, при котором мы ана- лизируем его структуру, ищем ключевые слова, цифры или другие элемент ы, которые несу г в себе команды или параметры для нашего устройства. Это позволяет нашему ESP32 «пони- мать» более сложные запросы, превращая бота из простого исполнителя в интеллектуаль- ного помощника. "ф Понимание Языка: Парсинг Команд с Параметрами Как из команды '/set_level 200' получить число '200'? level 200 Инструментарий indexOfC 1) —► substring() IBM Pie* Mono IBM Pie* Mono Где находится параметр? Вырезаем значение startsWith() IBM Pie* Nono Это нужная команда? ► tolnt() / toFloatO IBM Pie* Mono Превращаем текст в число Пример г действии /set_level 200 IBM Plex Mono /set.level " 200" 200" —► ‘staitsWith()’ подтверждает команду Часть ’ /set_level * "отрезается", остается" 200" tolnt() превращает строку" 200" в число 200 analogWritetpin, 200) IBM Pie* Morn Интересный факт Многие современные системы, от поисковых машин до i олосовых ассистентов, используют сложные алгоритмы парсинга естественного языка (Natural Language Processing, NLP). Они позволяют компьютерам понимать не только отдельные слова, но и их смысл, контекст и даже интонацию. Мы же будем использовать более простые, но эффективные методы стро- кового парсинга, которые идеально подходят для устройств вроде ESP32.
Изучаем на примере Прежде чем бросаться в код, давайте наденем «очки» нашего микроконтроллера и по- смотрим, как он видит входящее сообщение. Понимание этой пошаговой логики - ключ к написанию чистого и безошибочного кода для парсинга. Разберем процесс на примере ко- манды/set.time г 10 1. Бог получает полное сообщение от пользователя в виде строки: /set_timer 10 2. Программа проверяет, начинается ли полученная строка с ключевой фразы, которая нас интересует (в данном случае, /set_t inter). 3. Если проверка прошла успешно, программа «отсекает» командную часть, оставляя только сгроку с параметром. В нашем примере это будет строка «10». 4. Программа преобразует строку с параметром в необходимый для работы формат (например, текст «10» в число 10) и использует полученное значение для выполнения соот- ветствующего действия, например, запуска таймера. startsWithf'/seUevel") -> true substring!) tolnt() Входящая строка Проверка Извлечение Очистка Преобразование Toolkit Section slartsWith() X substring!) tolnt() Читаем FastBot предоставляет удобные функции для работы с входящими сообщениями. Мы уже знаем bot. get Mes sage (), которая возвращает всю строку сообщения Для парсинга нам пригодятся строковые методы Arduino String-класса, такие как: • String:: sta rtsWith (): проверяет, начинается ли строка с указанной подстроки. Ваш первый «фильтр» на входе, позволяющий мгновенно определить, адресовано ли сообще- ние данному блоку кода. • String:: substring (): извлекает часть строки. Наш основной «скальпель?? для вы- резания параметров из команды. • String: :index0f(): находит позицию (индекс) первого вхождения символа или подстроки. Часто используется в связке с substring(). чтобы найти динамическую точку «разреза» строки, например, разделитель. • String:: tolnt (): пытается преобразовать строку в целое число. Если строка начи- нается с цифр, метод вернет числовое значение. Например, строка «255» будет преобразована в число 255. • St г ing : : t rim () удаляет пробелы в начале и в конце строки. Важнейший инстру- мент для «санитарной обработки» пользовательского ввода, который спасает от трудноулови- мых ошибок, вызванных случайными пробелами. Используя комбинацию этих методов, мы сможем извлекать параметры из команд.
Интересный факт Помимо простых текстовых команд многие боты используют «callback-данные» оз инлайн- кнопок. Эти данные - это, по сути, предопределенные строки, которые мы сами задаем. Обрабатывать их намно]о проще, чем парсить произвольный текст, так как мы точно знаем их формат. Однако для команд, где пользователь может ввести произвольные значения (например, число или текст), текстовый парсинг незаменим. Выполняем по образцу Давайте создадим скетч, который будет обрабатывать команду /set_level <число>, например. /set_level 255 для установки яркости светодиода. Создадим полный скетч.
Подсказка Будьте внимательны с индексами при использовании subst ring(). Подсчитайте количе- ство символов, которые нужно пропустить в начале команды. Функция trim() очень по- лезна для удаления лишних пробелов, которые пользователь мог случайно ввести в начале или конце параметра. Обсуждаем 1. Проанализируйте компромисс между удобством для пользователя (одна команда / set_level <число>) и простотой реализации для разработчика (множество команд типа /led_on. /led.half, /led_of f). В каком случае один подход предпочтительнее другого? 2. Какие потенциальные сложности или ошибки могут возникнуть при парсинге текстовых сообщений от пользователя? Как можно сделать наш код более «устойчивым» к неправиль- ному вводу? Выполняем самостоятельно Разработайте код для бота, который будет принимать команду вида «установить таймер X минул» (например, «установить таймер 5 минут»). Бот должен отвечать «Таймер установлен па X минут!» и запускать внутренний таймер (например, с помощью mill is () или esp timer c reate ()). Выполняем самостоятельно Добавьте в свой проект обработку команды «включить [имя устройства]» и «выключить [имя устройства]», где «[имя устройства]» может быть «свет», «насос» или «вентилятор». Бот дол- жен подтверждать действие, например: «Свет включен!». Для этого вам потребуется исполь- зовать String:: indexOf () или серию if-else if для проверки различных имен устройств. Задание для любознательных Исследуйте возможность создания более сложной команды, например, «/set_timer 10.4». Вам нужно будет научиться парсить не только целые числа, по и числа с плавающей точ- кой (float). Для этого может пригодиться функция St ring :: toFloat (). Как бы вы реа- лизовали такую команду? Подведем итог В рамках этого урока мы сделали большой шаг вперед, освоив навыки обработки сложных команд с параметрами. Умение разбирать текстовые сообщения и извлекать из них дан- ные - это ключевой этап на пути к созданию по-настоящему гибких, функциональных и ин- терактивных умных устройств. Этот навык позволяет перейти от простых переключателей к системам с динамической настройкой, открывая возможности для реализации значи- тельно более сложных проектов.
Урок№ 19. Защита Telegram-бота: авторизация доступа ио «белому списку» Мы планируем • Осознать критическую важность обеспечения безопасности для Telegram-бота, управля- ющего физическими уст ройствами. • Изучить метод получения уникального идентификатора (1D) пользователя в Telegram • Реализовать на практике механизм авторизации доступа на основе «белого списка» (whitelist) разрешенных пользователей с использованием библиотеки FastBot. Читаем Когда ваш Telegram-бот подключен к устройству ESP32 и управ.гяет им, возникает вопрос безопасности. Когда бот получает возможность управлять физическими объектами, любая уязвимость в системе контроля доступа может привести к серьезным последствиям. Основная уязвимость публичного бота заключается в том, что любой пользователь может от- правлять ему команды. Это совершенно недопустимо, если бот управляет такими критически важными системами, как дверные замки, отопление или охранная сигнализация. Основным решением этой проблемы является верификация личности отправителя ко- манды. Платформа Telegram предоставляет для этого надежный инструмент - уникальный идентификатор пользователя (User ID). Это числовой идентификатор, который присваива- ется каждому аккаунту Telegram при сю создании. Ключевыми свойствами User ID являются его уникальность и неизменность: он не меняется на протяжении всего времени существо- вания аккаунта. Используя этот идентификатор, мы можем реализовать механизм авторизации, извест- ный как «белый список» (whitelist). Формально, «белый список» - это заранее определен- ный перечень доверенных User ID, которым предоставлено право на взаимодействие с ботом и управление подключенным устройством. Любые команды от пользователей, чьи ID отсут- ствуют в этом списке, будут иг норироваться.
Интересный факт Многие популярные онлайн-сервисы и приложения используют различные методы аутен- тификации и авторизации для защиты данных пользователей. Telegram-боты, хотя и кажутся простыми, тоже требуют внимания к безопасности, особенно когда они сопряжены с реаль- ными устройствами. Использование User ID - это простейший, по эффективный уровень защиты. Защита Периметра: Безопасность с Whitelist Проблема Решение • Каждый пользователь в Telegram имеет уникальный ID. • Мы проверяем ID каждого, кто пишет боту. • Реагируем только на команды от "своих". / 'j Практический совет Узнайте свой ID с помощью ©usenntobot Как это работает разрешенмые.Ю = { 12345, о789С }; прц_получении_сооЬщения(т&8) { if (msg. sender, id входит в разре1иенные_Ю) { // Выптнить команду } else { // Игнорировать или ответить "Доступ запрещен" } ] Изучаем па примере 11редставим ситуацию: у вас есть бот. который управляет освещением в доме. Вы не хо- тите, чтобы любой желающий мог включать и выключать свет. Основная идея: 1. Получение сообщения: сервер Telegram пересылает новое сообщение на микро- контроллер ESP32. Библиотека FastBot получает не только текст сообщения, по и метаданные, включая ID отправителя. 2. Сравнение идентификатора: прщраммный код на ESP32 извлекает ID отправи- теля и сравнивает его со списком разрешенных ID, который заранее определен в коде («белый список»). 3. Принятие решения: 3.1. Доступ разрешен: если 1D отправителя найден в «белом списке», бот присту- пает к обработке команды. 3.2. Доступ запрещен: если 1D отправителя в списке отсутствует, бот игнорирует команду. Опционально, он может отправить отправителю сообщение об отказе в до- ступе. Эта простая, но надежная логика ложится в основу программного кода, который мы рассмотрим далее.
Incoming Is ’ msg.sender.id . in Whitelist? . **ДА** Process Command ”HET** ignore / Send Access Denied Чит аем FastBot автоматически предоставляет ID отправителя в объекте FB_msg Мы уже ис- пользовали msg. userID в предыдущих уроках для вывода в Serial Port. Теперь мы будем ис- пользовать его для проверки. Для реализации «белого списка» мы можем использовать: • Один 1D: этот подход является самым простым и подходит для случаев, когда устройством управляет только один человек. В коде определяется константа, содержащая раз- решенный User ID. При получении сообщения 1D отправителя imsg .userID) напрямую срав- нивается с этой константой. • Несколько 1D: если доступ к устройству необходим нескольким доверенным ли- цам (например, членам семьи), используется более гибкий подход. В коде создается структура данных, как правило, массив, в котором хранятся все разрешенные User ID. Логика проверки в этом случае заключается в поиске 1D отправителя внутри этого массива. Интересный факт Хотя User ID является хорошим базовым уровнем защиты, это не панацея. Более сложные системы безопасности могут включать: • Пароли: бот может требовать ввода определенного пароля в дополнение к проверке ID. • Временные токены: сгенерированные одноразовые или ограниченные ио времени то- кены для доступа. • Двухфакторная аутентификация: комбинация нескольких методов для подтверждения личности пользователя. Выполняем по образцу Для того чтобы добавить себя в «белый список», первым шагом необходимо узнать свой уникальный User ID в Telegram. Процесс его получения прост и выполняется с помощью специализированных ботов. 1. В строке поиска найдите бота по имени ©userinfebot или ©getidsbot. 2. Начните диалог с ботом, отправив ему команду /start 3. В ответном сообщении бот пришлет ваш уникальный числовой 1D. Сохраните его, он понадобится для кода.
Создадим полный скетч. • •• *•« •••••• ••• ••••• • « «• Подсказка 1. Приоритет проверки: всегда выполняйте проверку ID пользователя в самом начале обработки сообщения, до анализа текста команды. Это гарантирует, что никакие действия не будут выполнены до успешной авторизации. 2. Корректность ID: убедитесь, что вы точно скопировали и вставили ваш реальный User ID в константу YOUR USER ID Обсуждаем 1 Почему проверка msg . userID является важным первым шагом в обработке любого вхо- дящего сообщения? 2 . Представьте, что вы хотите дать доступ к боту не только себе, но и нескольким членам семьи. Как бы вы модифицировали код, чтобы разрешить доступ по нескольким User ID? Какие структуры данных (например, массивы) могли бы пригодиться? Выполняем самостоятельно Модифицируйте предоставленный код. Вместо одной константы YOUR_USER_ID используйте массив для хранения нескольких разрешенных User ID. Программа должна обрабатывать ко- манды только в том случае, если 1D отправителя совпадает с одним из идентификаторов, пе- речисленных в массиве. Выполняем самостоятельно Добавьте функцию, которая будет отправлять вам уведомление (например, в Telegram), если произошла попытка несанкционированного доступа (кто-то с неизвестным ID попытался от- править команду). Укажите в сообщении ID злоумышленника.
Задание для любо {нательных Исследуйте возможность создания простой системы регистрации пользователей Напри- мер, когда новый пользователь отправляет команду / registe г <пароль>. бот проверяет па- роль. Если он верен, бот добавляет ID этого пользователя в постоянное хранилище (напри- мер. ЕЕ PROM или Preferences на ESP32) и разрешает ему доступ. Как бы вы реализовали это. учитывая, что ID нужно сохранять между перезагрузками ESP32? Подведем итог В ходе этого урока мы реализовали фундаментальный уровень безопасности для нашего IoT-проекта. Мы освоили методику проверки уникального идентификатора пользователя Telegram, что является критически важным навыком при создании систем, управляющих физическими объектами. Создание «белого списка» доверенных пользователей - это про- стой, но чрезвычайно эффективный способ гарантировать, что только авторизованные лица смогут взаимодействовать с вашим устройством на базе ESP32. Эти знания являются клю- чевым элементом для построения по-настоящему падежных и защищенных проектов в мире интернета вещей.
Урок № 20* Централизованное управление несколькими ESP32 через однот о Telegram-бота Мы планируем • Изучить концепцию централизованного управления несколькими устройствами ESP32 с помощью одного Telegram-oora. • Обсудить различные подходы и стратегии для масштабирования ваших 1оТ-проектов. • Проанализировать потенциальные сложности, которые могут возникнуть при реализа- ции таких систем, и рассмотреть способы их решения. Читаем По мере роста ваших амбиций в мире 1оТ вы неизбежно столкнетесь с проблемой мас- штабирования. Использование отдельного Telegram-бота для каждого нового устройства быстро становится непрактичным и неудобным, превращая управление умным домом в хаос из множества чатов. Централизованный подход, при котором один бот выступает в роли еди- ною командного центра, является отраслевым стандартом для создания элегантных и удоб- ных систем. Рассмотрим архитектуру простого, но эффективно! о решения, которое позволит реали- зовать этот мощный подход на практике. Интересный факт Концепция управления множеством «вещей» через централизованную систему лежит в ос- нове Интернета вещей (1оТ). Такие платформы, как Google Home, Amazon Alexa или Apple HomcKit, позволяют управлять множеством умных устройств через единый голосовой или мобильный интерфейс, используя схожие принципы, которые мы сейчас будем обсуждать. Изучаем на примере Представьте, что у нас есть два ESP32: один па кухне (ЕБР32-Кухня) и один в спальне (Е8Р32-Спальня). ЕБР32-Спальня
Основная идея: 1. Единый Telcgrain-бот: в основе системы лежит один бот с одним уникальным то- кеном. Он служит единой точкой входа для всех пользовательских команд. Нс ну'жно созда- вать отдельного бота для каждого ESP32; все взаимодействие происходит в одном чате. 2. Идентификация устройства: каждое устройство ESP32 должно «знать», кто оно. Для этого в код каждого микроконтроллера «зашивается» уникальный идентификатор, на- пример. в виде константы. Одно устройство будет знать, что его зовут «kitchen», другое - «bedroom», и так далее. 3. Формат команд: команды от пользователя должны быть структурированы таким образом, чтобы включать идентификатор целевого устройства. Например, вместо общей команды /light.on, пользователь будет отправлять более конкретную: /kitchen_light_on или /bedroom_temp_request 4. Распределение команд: все устройства ESP32, подключенные к одному боту, полу- чают абсолютно все сообщения, отправленные этому боту. Однако благодаря уникальному идентификатору каждое устройство реализует логику фильтрации: оно анализирует входя- щую команду и реагирует только в том случае, если команда адресована именно ему. Проблема: Использование отдельного бота для каждого устройства превращает управление в хаос из множества чатов Архитектура: Один бот — единый командный центр для управления всеми устройствами. ESP-Спальня 1 Уникальный ID устройства: Каждому ESP32 "зашивается" свое имя ( ). 2 Адресная команда. Пользователь отправляет команду с указанием цели 3 Фильтрация на устройстве: Все устройства получают команду, но реагирует только то, чье имя совпадает. I выполняет деист вие, остальные игнорируют. Мигаем В мире 1оТ существует несколько стандартных подходов к решению задачи управления множеством устройств: Таблица Подход Принцип работы Преимущества и недостатки Прямая идентификация в команде Каждое устройство ESP32 по- лучает все сообщения oi бога и программно фильтрует их. реа- гируя только на те. что содер- жат его уникальный идентифи- катор (например, /kitchen. + Простота: легко реализуется, не требует допол- нительной инфраструктуры. - Масштабируемость при большом количестве устройств ( десятки) сггисок команд становится гро- моздким. - Нагрузка: каждое устройство обрабатывает все сообщения, даже не предназначенные ему
Окончание таблицы Подход Принцип работы Преимущества и недостатки Использование MQTT Бог отравляет сообщения в оп- ределенные «темы» (topics) на центральный сервер - MQTT- брокер. Каждое ESP32 подпи- сывается только на свою тему и получает команды, предназна- ченные исключительно ему + Масштабируемость отраслевой стандарт для 1оТ. Идеально подходит для систем с большим количеством устройств. 4- I ибкость и надежность: снижает нагрузку на устройства, обеспечивает гарантированную до- ставку сообщений. - Сложность требует настройки и поддержки MQTT-брокера (сервера) Web-сервер на ESP32 Каждое усзройство ESP32 под- нимает собственный мини-веб- сервер. Бот, получив команду, отправляет HTTP-запрос на- прямую на IP-адрес нужного ус1ройства + Прямое управление: нет промежуточных сер- веров. - Сложность сети: требует статических IP-адре- сов д.1я каждого устройства пли сложной системы их обнаружения (например. inDNS). - Безопасность: открытие портов во внешнюю сеть несет риски безопасности В этом уроке мы сосредоточимся на первом, самом простом, подходе, так как он не требует дополнительных серверов и протоколов. Слева (Прямая идентификация) Kitchen Bedroom Просто, но ограничено Справа (MQTT) Kitchen Bedroom Надёжно и масштабируемо Интересный факт При использовании MQTT (Message Queuing Telemetry Transport) сообщения отправляются не напрямую между устройствами, а через центральный сервер, называемый брокером. Это делает систему более гибкой и устойчивой, так как устройствам не нужно знать IP-адреса друг друга - достаточно подключиться к брокеру. Концептуальный пример Представим, что у нас есть два ESP32. На каждом из них будет загружен похожий код, но с одним важным отличием - уникальным идентификатором устройства.
Код для ESP32-1 (Назовем сто «RoomA»). Код для ESP32-2 (Назовем его «RoomB»): этот код будет практически идентичен, но с одним изменением: #def ine DEV1CE_NAME ' roomB Теперь, когда вы отправляете /roomA_light_on боту, только ESP32 с DEVICE_NAME ’ гоотА’ обработает эту команду, a ESP32 «гоотВ» ее проигнорирует. II наоборот. Каждое устройство ESP32, подключенное к одному и тому же боту, будет получать все сообщения, отправленные этому боту. Ваша задача - написать код так. чтобы каждое устройство фильтровало эти сообщения и реагировало только на те, которые предназначены для пего, используя уникальный идентификатор. Обсуждаем 1. Какие преимущества и недостатки есть у подхода с прямой идентификацией устройства в команде (например, /kitchen_light_on)? 2. Если бы у вас было 20 ESP32, стало бы удобно управлять ими таким образом? Какие про- блемы могли бы возникнуть и как их можно было бы решить?
Задание для любознательных Исследуйте протокол ESP-NOW. Это беспроводной протокол от Espressif, который позво- ляет Е5Р32-устройствам обмениваться короткими сообщениями напрямую, без необходимо- сти подключения к Wi-Fi роутеру. Подумайте над задачей: как можно использовать ESP-NOW для создания системы, где один ESP32 выступает в роли «координатора» (подключен к Wi-Fi и Telegram-боту), а другие ESP32 - «исполнителями», которые получают команды от коор- динатора по ESP-NOW? Подведем итог В этом уроке мы обсудили концепцию управления несколькими устройствами ESP32 через одного Telegram-бота. Мы рассмотрели простой подход с использованием уникаль- ных идентификаторов в командах и затронули более продвинутые концепции, такие как MQTT. Полученные знания являются прочным фундаментом для создания сложных, распре- деленных и по-настоящему умных JoT-просктов. Теперь вы готовы проектировать не просто гаджеты, а целые экосистемы. Путь Героя: Эволюция Вашего Устройства Командный Центр Масштабирование, Фильтрация. Пассивный Ответчик Реакция по запросу. -UUUBUUlUlir IQ0D000S 3 l]o -o-O Защищенный Проактивный Монитор Порог, Preferences, Гистерезис. Хранитель User ID, Whitelist. Видящий и Понимающий ESP32-CAM, Парсинг.
Глава III. УМНЫЕ УСТРОЙСТВА. ИДЕИ ДДЯ ПРОЕКТОВ Тема № 1. Интеграция ESP32 с облачными сервисами и API Придумай как микроконтроллер может общаться с облачными сервисами или исполь- зовать API какого-либо сервиса. Гема № 2. Создание модулей для умного дома Какие устройства можно было бы объединить в единую систему умного дома? Какие функции могли бы выполнять такие модули - управление светом, климатом, безопасностью, техникой? Какие из них ты мог бы разработать самостоятельно? Как будет устроен каждый модуль внутри? Какие технологии передачи данных использовать - Wi-Fi, Bluetooth, ESP- NOW, Zigbee? Можно ли сделать модуль универсальным и легко настраиваемым? Тема № 3. Рабо1а IoT-устройств без интернета Представьте, что в вашем доме на день отключили интернет, а 1оТ-устройство. к при- меру, датчик температуры, отправляет данные в бота каждые 10 минут. Как спустя день отправить все измерения пользователю? Увлекательная работа с кэширование или базами данных. Идея № 1. ESP-iiapcep Парсинг сайтов - увлекательная задача, решаемая зачастую на языке python, но можно выполнять то же самое на микроконтроллере. Плюс в том, что ему не требуется много места, а лишь питание и подключение к сети Wi-Fi. Напишите парсер сайтов с удобной настройкой через telegram: выбор определенных сайтов, определенной информации в определенные ин- тервалы времени. Идея № 2. Умное оповещение о событиях в доме через API ESP32 подключается к датчикам (движения, открытия двери, звука) и при срабатывании отправляет запрос в облачный сервис (например. IFTTT или Pushover API) для моментального уведомления на телефон. Настройка, какие события отслеживать, прямо через Telegram-бота. Возможность выбрать канал оповещения: push-уведомление, e-mail, сообщение в чат. Локаль- ный режим: при отсутствии интернета ESP32 подает сигнал на сирену или включает свет. Идея № 3. Персональный юлосовон помощник на ESP32 ESP32 с модулем микрофона (например. 1NMP441) и динамиком принимает голосовые команды и через облачный API (например, Google Speech-to-Text или Vosk) преобразует их в текст. Управление умными устройствами дома по голосу (включить свет, запустить музыку).
Возможность отвечать с помощью синтеза речи (через Google I TS или ESP-Speak). Локаль- ный режим: без интернета обрабатываются базовые команды, записанные в прошивке. Обнов- ление словаря команд и сценариев через Telegram или веб-интерфейс. Умное оповещение о событиях Датчики движекия/дверей отправляют push-уведомления через облачные API. Motion IFTTT Pushover Smartphone Sensor Notification Icon Персональный голосовой помощник ESP32 с микрофоном распознает речь через облачные API и управляет домом Автономный ESP-napcep Микроконтроллер отслеживает изменения на сайтах и присылает данные в Telegram.
Глава I. ВВЕДЕНИЕ И ОСНОВЫ.................................................3 Урок № 1.1. ESP32 + Telegram = Умные устройства..........................3 Урок № 1.2. Подготовка к работе..........................................8 Урок № 1.3. Первый бот с FastBot: «Привет, мир!» из ESP32...............13 Урок № 2. Прием и обработка сообщений от пользователя на ESP32...........19 Урок № 3. Сравниваем подход: отправка и получение сообщений с Universal Telegram Bot................................................24 Урок № 4. Управление светодиодом через Telegram - первый шаг к реальным устройствам..................................................30 Урок № 5. Управление несколькими светодиодами...........................35 Урок №5.1. От команд к кнопкам: простое меню для бота...................40 Урок № 6. Интерактивное управление: инлайн-кнопки в Telegram с FastBot2..45 Урок № 7. Инлайн-кнопки в Universal Telegram Bot.........................51 Урок № 8. Физическая кнопка и уведомления в Telegram (FastBot2)..........57 Урок № 9. Датчик расстояния HC-SR04 и Telegram (FastBot2)...............61 Урок № 10. Управление сервоприводом через Telegram (FaslBot2)...........67 Глава II. УМНЫЕ УСТРОЙСТВА. СОЗДАНИЕ И У ПРАВЛЕНИЕ........................74 Урок № 11. Датчик температуры и влажности DHT11/DHT22: получаем данные в Telegram (FastBot2)...................................74 Урок № 12. Автоматическая отправка данных с DHT по расписанию (FastBot2).83 Урок № 13. Датчик освещенности (фоторезистор). Измеряем свет и отправляем данные в Telegram..........................................90 Урок № 14. Сохраняем данные? Введение в энергонезависимую память ESP32 (Preferences)..............................................94 Урок № 15. Уведомления по условию: создание проактивного 1оТ-монитора....99 Урок № 16 DHT22 с Universal Telegram Bot...............................105 Урок № 17. Отправка фото с ESP.32-CAM через Telegram...................109 Урок № 18 Парсинг сложных команд в Telegram: создание гибкого интерфейса.ИЗ Урок № 19. Защита Telegram-бота: авторизация доступа по «белому списку»..117 Урок № 20. Централизованное управление несколькими ESP32 через одного Telegram-бота.............................................122 Глава 111. УМНЫЕ УСТРОЙСТВА. ИДЕИ ДЛЯ ПРОЕКТОВ ..........................127 Тема № 1. Интеграция ESP32 с облачными сервисами и API...................127 Тема № 2. Создание модулей для умного дома...............................127 Тема № 3. Работа IoT-устройств без интернета...........................127 Идея № 1. ESP-napcep...................................................127 Идея № 2. Умное оповещение о событиях в доме через API.................127 Идея № 3. Персональный голосовой помощник на ESP32.....................127
Инфра-Инженерия ательство технической литературы Издательство предлагает учебную литературу по следующим направлениям: • IT. Информатика • Авиационная и ракетно-космическая техника • Автоматизация • Автомобильная техника • Арматура. Трубопроводы • Бетоны Бурение нефтяных и газовых скважин • Вооружение. Радиоэлектронные системы. • Газовое хозяйство • Геодезия, картография и маркшейдерское дело • Геология. Геофизика. Геохимия • Горное дело • Железнодорожный транспорт • Лесная промышленность • Логистика • Машиностроение • Медицина и биоинженерия • Металлургия • Нефтегазовая промышленность • Педагогика. Психология • Пищевая промышленность • Промышленная безопасность. Охрана труда • Разработка и эксплуатация нефтяных и газовых месторождений • Сварочное дело • Словари • Сети и коммуникации. Волоконно-оптическая техника • Строительство • Судостроение • Транспортное строительство. Дороги. Мосты. Тоннели • Физико-математические науки • Химия. Химические технологии • Экология. Безопасность жизнедеятельности • Экономика. Управление. Электронная коммерция • Электроника • Электро- и теплоэнергетика Интернет-магазин infra-e.ru WhatsApp VK Telegram Телефон 8-800-250-66-01 8-911-512-48-48 Более 3000 выпущенных книг по 30 темам и направлениям Доставляем наши книги по всей России от Калининграда до Камчатки, а также в страны СНГ Нам доверяют более 90 учебных заведений в России и за рубежом
Учебное издание Мырадов Мырат Венаевич Павлов Дмитрий Игоревич Первые шаги в lo l Учебное пособие ISBN 978 5-9729-31С4-0 9 785972 93Ю40 Подписано в печать 26.02.2026 Формат 70x100/16. Усл. печ. л. 10,73. Печать по требованию. Бумага офсетная. Гарнитура «Таймс». 1Издательство «Инфра-Инженерия» 160011, г. Вологда, ул. Козленская, д. 63 Тел.: 8 (800) 250-66-01 E-mail: booking@infra-e.ru https://infra-e.ru Издательство приглашает к сотрудничеству авторов научно-технической литературы