Как связать ардуино и Телеграмм

Нужно управлять различными устройствами: свет, вентиляция, полив, а также получать нужные данные от микроконтроллера.
При этом для учебно-тренировочных или DIY-задач совершенно не хочется задействовать дополнительные устройства, на которых будет размещаться сервер и уж тем более не оплачивать внешний статический IP-адрес.

Идея

Обеспечить выход в интернет с микроконтроллера, запустить два скрипта: веб-сервер для приема информации от микроконтроллера и телеграм-бот для связи с пользователем.

Веб-сервер на Flask и бота будем размещать на ReplIt. Как это сделать бесплатно с работой 24/7 описано в статье Как хостить телеграм-бота.

Первая попытка была использовать Arduino + Ethernet-модуль W5500, эта связка заработала только внутри локальной сети и провалилась при переносе на ReplIt, т.к. ссылка веб-сервера оказалась доступна только по протоколу https, который Arduino не поддерживает.

Решение нашлось в виде платы NodeMCU v3 с модулем Wi-Fi:

NodeMCU v3 с WiFi-модулем

«Arduino и Telegram» – Урок 1: Arduino IDE, бот Telegram

Эта плата, основанная на микроконтроллере ESP8266, программируется через среду Arduino IDE с небольшой настройкой.

Реализация — шаг 0 — настраиваем IDE

Пример будет для версии Arduino IDE 2.0.3, которая легко доступна на официальном сайте.

После установки IDE необходимо добавить в нее библиотеки для работы с ESP8266.
Нужно зайти в настройки File→Preference:

и добавить ссылки для скачивания информации о дополнительных платах:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
https://dl.espressif.com/dl/package_esp32_index.json

Далее открываем в левом меню BOARDS MANAGER и устанавливаем пакет для работы с ESP8266:

После этого IDE готова к работе. Но прежде, чем загрузить код в ESP, нужно создать два скрипта на Python и получить ссылку, по которой будет осуществляться обмен данными.

Реализация — шаг 1 — Пишем код телеграм-бота и веб-сервера на Flask

В данной статье будет описан принцип обмена данными, поэтому от ESP будет передаваться только «условная температура» (условная, потому что всегда статичная из переменной) и состояния встроенного в микроконтроллер светодиода.

Обмен данными между веб-сервером и телеграм-ботом будет происходить через текстовые файлы, чтобы не усложнять понимание кода.

Создаем проект на ReplIt, в нем делаем два файла main.py (в нем будет телеграм-бот) и background.py (в нем будет веб-сервер). Более подробно процесс описан в статье Как хостить телеграм-бота.

Telegram-бот

Размещаем в файле main.py.

Моменты, на которые стоит обратить внимание:

  • import pip pip.main([‘install’, ‘pytelegrambotapi’]) — установит необходимую нам библиотеку.
  • f.write(str(call.from_user.id)) — записываем id пользователя, с которым общаемся. В данной реализации предполагаем, что с ботом не будет одновременно работать несколько человек.
  • bot.send_message(call.from_user.id,»Свет скоро включится») — отправляем сообщение пользователю, что «команда принята». Чуть позже, когда от ESP придет информация, что свет включен, мы отправим еще одно подтверждение. Именно для этого и нужно запоминать user_id.
  • Токен от бота прячем в SECRETS, т.к. проект в бесплатном режиме открыт в режиме просмотра для всех. Подробнее об этом в документации.

Веб-сервер на Flask

В этой статье не приводится полное описание, что такое Flask и как им пользоваться. Есть огромное количество статей на русском или английском об этом фреймворке. В качестве примера, можно почитать вот эту.

Размещаем код в файле background.py
Этот сервер выполняет сразу 2 задачи:

  • Обеспечивает обмен данными с микроконтроллером через GET-запросы.
  • Используется для поддержки работоспособности скрипта через UpTimeRobot. Подробности все в той же статье.

Прекрасно! Теперь, когда все запустилось, нужно записать ссылку доступа к серверу и ключ шифрования для доступа по протоколу https.

Реализация — шаг 2 — код для ESP8266

После запуска сервера в правом верхнем углу экрана будет ссылка. Копируем ее и вставляем в браузер:

Еще по теме:  Как восстановить Телеграмм аккаунт без доступа в мобильную сеть

Нажимаем на иконку замка рядом с адресом сайта:

и просматриваем сертификат. Текст меню может немного отличаться в разных браузерах, но принцип остается тот же.

Копируем и сохраняем «отпечаток SHA-1»:

Копируем код в Arduino IDE. Меняем параметры доступа к Wi-Fi, адрес сервера (указывается без https) и отпечаток SHA-1:

#include #include #include #include #define LED 2 const char *ssid = «ИМЯ_WiFi_сети»; const char *password = «ППАРОЛЬ_WiFi_сети»; const char *host = «test.username.repl.co»;//адрес сервера без https:// const int httpsPort = 443; //отпечаток SHA-1, который скопировали раньше const char fingerprint[] PROGMEM = «AA BB CC DD EE FF 00 11 22 33 44 55 66»; void setup() < pinMode(LED, OUTPUT); digitalWrite(LED, HIGH); delay(1000); Serial.begin(115200); WiFi.mode(WIFI_OFF); delay(1000); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password);//подключаемся к сети Serial.println(«»); Serial.print(«Connecting»); while (WiFi.status() != WL_CONNECTED) < delay(500); Serial.print(«.»); >Serial.println(«»); Serial.print(«Connected to «); Serial.println(ssid); Serial.print(«IP address: «); Serial.println(WiFi.localIP()); > void loop() < WiFiClientSecure httpsClient; Serial.println(host); Serial.printf(«Using fingerprint ‘%s’n», fingerprint); httpsClient.setFingerprint(fingerprint); httpsClient.setTimeout(500); delay(1000); //подключение к серверу Serial.print(«HTTPS Connecting»); int r=0; while((!httpsClient.connect(host, httpsPort)) (r < 30))< delay(100); Serial.print(«.»); r++; >if(r==30) < Serial.println(«Connection failed»); >else < Serial.println(«Connected to web»); >String ADCData, getData, Link; //создаем переменные, значения которых будут передаваться на сервер int temp = 15;//условная температура, которую в дальнейшем можно получать с датчика int light = !digitalRead(LED);//состояние встроенного светодиода, которы и есть СВЕТ в данном проекте Link = «/iot?temp=»+String(temp)+»+String(light);//собираем ссылку из параметров Serial.print(«requesting URL: «); Serial.println(host+Link); // выполняем переход по этой ссылке httpsClient.print(String(«GET «) + Link + » HTTP/1.1rn» + «Host: » + host + «rn» + «Connection: closernrn»); Serial.println(«request sent»); while (httpsClient.connected()) < String line = httpsClient.readStringUntil(‘n’); if (line == «r») < Serial.println(«headers received»); break; >> Serial.print(«reply:»); //в переменную line записываем ответ сервера. В данном случае 0 или 1, команда от телеграм-бота String line; while(httpsClient.available()) < line = httpsClient.readStringUntil(‘n’); Serial.println(line); if (line==»0″) if (line==»1″) < digitalWrite(LED, LOW); >> Serial.println(«closing connection»); delay(500);//ждем 0.5с и повторяем >

Загружаем код в ESP и наслаждаемся первым шагом к умному дому, сделанному своими руками.

Дальше полет фантазии в реализации не ограничен!

Такие дела! Успехов!

  • Python
  • Разработка под Arduino
  • Умный дом
  • Интернет вещей
  • DIY или Сделай сам

Источник: habr.com

Интегрируйте своего Telegram-бота с реальным миром через микроконтроллер ESP32/ESP8266 Arduino

Интегрируйте своего Telegram-бота с реальным миром через микроконтроллер ESP32/ESP8266 Arduino

На практике все запоминается лучше. Итак, я объясню все через практический проект из моего опыта. Код проекта опубликован на моем GitHub страница проекта Smart Queue. В этой статье объясняется, как создать телеграмм-бота, обрабатывать сообщения и отвечать пользователям. Также, в конце, будут даны некоторые идеи для будущих проектов для вас.

Коротко о проекте

Я сделал проект для управления очередью в нашу офисную игровую комнату с помощью Telegram на базе Arduino. Arduino с серводвигателем был установлен для блокировки и разблокировки двери. Люди могли встать в очередь и проверить, сколько человек в очереди, с помощью телеграмм-бота.

В этом проекте использовался NodeMCU, но та же логика работает и для Arduino с ESP32/ESP8266.

Телеграмма

Telegram — это мессенджер с мобильными приложениями (iPhone и Android) и настольными приложениями (Mac, Windows и Linux). В Telegram у нас есть возможность создать бота. Мы будем управлять им с помощью нашего микроконтроллера, обрабатывая сообщения от пользователей.

Создание Telegram-бота

Чтобы создать Telegram-бота, нам нужно запросить его у телеграмм-бота «botfather». Все, что вам нужно, это найти бота по поиску или получить его по ссылке: https://t.me/botfather. Бот удобен для пользователя, и когда вы откроете чат с ботом, наши дальнейшие действия должны быть ясны для вас.

Отправьте команду /start для запуска бота. Отправьте команду /newbot для создания нового бота. Нас попросят ввести имя и имя пользователя нового бота. После успешного создания бота бототец отправит нам токен. Этот потребуется для получения всех сообщений, отправленных боту, и отправки сообщений от бота пользователям.

Связь

Управление ESP8266 через Telegram бота

logo

В данной статье вы узнаете как создать своего Telegram бота, задать ему список навыков, научить его отправлять и читать сообщения в чате, а также взаимодействовать с ESP8266 через библиотеку FastBot.

Создание Telegram бота

Основные термины

Давайте для начала определимся с основными терминами и разберем что есть что.

Еще по теме:  Как создать свою группу в Телеграмме на Айфоне

Telegram – один из самых популярных мессенджеров, который работает на всех платформах:

  • Компьютер (Windows, Linux, MacOS): официальный сайт
  • Браузер: официальный сайт
  • Android: Google Play
  • iOS: App Store

Telegram бот — это специальный аккаунт, созданный в автоматическим режиме, который позволяет пользователям совершать разные действия через сам мессенджер. Такой бот может писать вам сообщения, читать ваши сообщения и реагировать на них, отправлять в чат меню с кнопками и многое другое. ESP8266 может управлять таким ботом, что даёт нам огромные возможности: получение данных с датчиков или управление своим проектом из любой точки планеты, причём абсолютно бесплатно!

Создание бота

Чтобы создать бота нам нужен еще один бот. Как бы парадоксально это не звучало.

Открываем поиск Telegram и ищем бота BotFather

botfather

Запускаем и отправляем ему команду /newbot

Далее вам предложат придумать и оправить имя для бота. Оно может быть любым и в случае необходимости его всегда можно будет изменить.

На следующем шаге вам необходимо отправить имя пользователя для бота. Оно обязательно должно быть уникальным, заканчиваться на bot и в последствии изменить его уже будет нельзя

И, наконец, вас поздравят с регистрацией и отправят вам токен. Токен — длинный уникальный код, который даёт полный контроль над ботом. Никому не показывайте этот код! Он понадобится нам дальше. Кликните по нему, чтобы скопировать в буфер обмена и сохраните в надежное место.

borfatherlog

Получение ID чата

Чтобы бот мог отправлять сообщения, он должен знать, кому их отправлять. Каждый аккаунт и каждый чат в Telegram имеет свой уникальный номер – ID, зная этот номер бот может написать в чат сообщение.

Для получения своего ID, перейдите в поиск и найдите IDBot

idbot

Перейдите к диалогу с ботом и отправьте следующую команду /getid

Сохраните полученный ID

Создание списка команд

Этот шаг совсем не обязательный, но очень сильно упрощает общение с ботом

Переходим в диалог с BotFather и отправляем команду /mybots. Затем выбираем нужного бота из списка. Далее нажимаем на Edit Bot > Edit Commands. Вводим команды в следующем формате имя — описание

botcomands

В чате с ботом появится новая кнопка, при нажатии на которую появится список созданных нами команд.

comlist

Управление ESP8266 через Telegram бота

Сейчас мы напишем простой скетч, который будет при получении сообщения от созданного на предыдущем шаге бота, выполнять следующие действия:

  • Выводить текст сообщения на oled экран, подключенный к ESP
  • При успешном старте и соединении с ботом писать в част сообщение «ESP запущен и готов к работе!»
  • При получении команды /on — включать встроенный светодиод и отправлять боту в чат отклик на команду
  • При получении команды /off выключать его и отправлять боту в чат отклик на команду
  • При получении команды /state отправлять боту в чат сообщение о состоянии светодиода

Подготовка

Для данного проекта понадобятся:

  • Oled экран 0.96 I2C
  • Wemos D1 Mini
  • Отладочная плата
  • Несколько проводов для соединений

Также дополнительно нужно в менеджере библиотек Arduino IDe найти и установить билиотеку FastBot

fastbot

Схема соединения

Соединяем все компоненты по схеме ниже и переходим к следующему шагу.

схема

Скетч программы

Запускаем Arduino IDE и копируем в него следующий скетч

#include #include #include #include // Подключение библиотеки Adafruit_GFX #include // Подключение библиотеки Adafruit_SSD1306 #define OLED_RESET -1 #define SCL 5 // D1 #define SDA 4 #define SCREEN_WIDTH 128 // OLED дисплей ширина в пикселях #define SCREEN_HEIGHT 64 // OLED дисплей высота в пикселях #define BOT_TOKEN «xxxxxxxx:xxxxxxxxxxxxxxxxxxx» // Здесь введите Ваш Bot Token, сгенерированный Botfather #define CHAT_ID «xxxxxxxxxxx» // Здесь введите идентификатор пользователя Telegram (UserID) #define WIFI_SSID «ssid» //название точки доступа WiFi #define WIFI_PASS «pass» //пароль к точке доступа Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, // Инициализация Telegram BOT FastBot bot(BOT_TOKEN); const int ledPin = 2; bool ledState = HIGH; void newMsg(FB_msg // выводим имя юзера и текст сообщения display.clearDisplay(); display.setCursor(0,0); display.println(msg.text); display.display(); // выводим всю информацию о сообщении Serial.println(msg.toString()); if (msg.text == «/on») < bot.sendMessage(«Светодиод включен»,CHAT_ID); // Светодиод включен ledState = LOW; // HIGH for ESP32 digitalWrite(ledPin, ledState); >if (msg.text == «/off») < bot.sendMessage(«Светодиод выключен»,CHAT_ID); // Светодиод выключен ledState = HIGH; // LOW for ESP3 digitalWrite(ledPin, ledState); >if (msg.text == «/state») < if (digitalRead(ledPin)) < bot.sendMessage(«На ESP8266 cветодиод выключен»,CHAT_ID); // Светодиод включен (ОС) >else < bot.sendMessage(«На ESP8266 cветодиод включен»,CHAT_ID); // Светодиод выключен (ОС) >> > void setup() < Serial.begin(115200); connectWiFi(); Wire.begin(); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Указываем адрес дисплея display.clearDisplay(); // Очищаем дисплей display.setTextSize(1); // Устанавливаем размер шрифта display.setTextColor(WHITE); // Цвет фона display.display(); pinMode(ledPin, OUTPUT); pinMode(A0, INPUT); digitalWrite(ledPin, ledState); bot.setChatID(CHAT_ID); // передайте «» (пустую строку) чтобы отключить проверку bot.attach(newMsg); bot.sendMessage(«ESP запущен и готов к работе!»); >void loop() < bot.tick(); >void connectWiFi() < WiFi.begin(WIFI_SSID, WIFI_PASS); while (WiFi.status() != WL_CONNECTED) < delay(500); Serial.print(«.»); if (millis() >15000) ESP.restart(); > Serial.println(«Подключен»); >

Еще по теме:  Как зайти в Телеграм если вышел с аккаунта а код не приходит

Теперь, пожалуй, стоит дать пояснения к некоторым местам кода

Этом блоке пишем свои данные для подключения

#define BOT_TOKEN «xxxxxxxx:xxxxxxxxxxxxxxxxxxx» // Здесь введите Ваш Bot Token, сгенерированный Botfather #define CHAT_ID «xxxxxxxxxxx» // Здесь введите идентификатор пользователя Telegram (UserID) #define WIFI_SSID «ssid» //название точки доступа WiFi #define WIFI_PASS «pass» //пароль к точке доступа

Вводим свои данные WiFi, токен нашего бота, полученный на предыдущем шаге и ваш ID, полученный у IDBot

Далее инициализируем нашего бота

FastBot bot(BOT_TOKEN);

Затем идет функция-обработчик, в которой задается порядок действий при получении новых сообщений от бота

void newMsg(FB_msg // выводим имя юзера и текст сообщения display.clearDisplay(); display.setCursor(0,0); display.println(msg.text); display.display(); // выводим всю информацию о сообщении Serial.println(msg.toString()); if (msg.text == «/on») < bot.sendMessage(«Светодиод включен»,CHAT_ID); // Светодиод включен ledState = LOW; // HIGH for ESP32 digitalWrite(ledPin, ledState); >if (msg.text == «/off») < bot.sendMessage(«Светодиод выключен»,CHAT_ID); // Светодиод выключен ledState = HIGH; // LOW for ESP3 digitalWrite(ledPin, ledState); >if (msg.text == «/state») < if (digitalRead(ledPin)) < bot.sendMessage(«На ESP8266 cветодиод выключен»,CHAT_ID); // Светодиод включен (ОС) >else < bot.sendMessage(«На ESP8266 cветодиод включен»,CHAT_ID); // Светодиод выключен (ОС) >> >

На этом следует остановиться более подробно

Внутри этой функции можно пользоваться переданной переменной сообщение, которая имеет тип FB_msg (структура) и содержит в себе:

  • String userID — ID пользователя
  • String username — имя пользователя или канала
  • bool isBot — сообщение от бота
  • String chatID — ID чата
  • int32_t messageID — ID сообщения в чате
  • bool edited — сообщение отредактировано
  • String text — текст сообщения или попдпись к файлу
  • String replyText — текст ответа, если он есть
  • String data — callback данные из меню (если есть)
  • bool query — запрос
  • bool isFile — это файл
  • String fileName — имя файла
  • String fileUrl — адрес файла для загрузки
  • bool OTA — запрос на OTA обновление (получен .bin файл)
  • uint32_t unix — время сообщения

В данном примере мы проверяем текст сообщения msg.text на соответствие одному из заданных значений и выполняем необходимые действия. При этом отправляем боту в чат ответ с помощью bot.sendMessage(«message»,»ID»), что действие выполнено

Далее переходим к блоку Setup() и еще одному интересному участку кода

bot.setChatID(CHAT_ID); // передайте «» (пустую строку) чтобы отключить проверку bot.attach(newMsg); bot.sendMessage(«ESP запущен и готов к работе!»);

bot.setChatID(CHAT_ID) — устанавливает ID пользователя, который может управлять ESP8266 с помощью бота. Если параметр оставить пустым, то управлять сможет любой желающий имеющий доступ к нашему боту. Также несколько упрощает написание функций для работы с ботом. Т.е. для того чтобы отправить сообщение боту можно написать просто bot.sendMessage(«message») вместо bot.sendMessage(«message»,»ID»)
bot.attach(newMsg) — указывает боту функцию-обработчик при получении новых сообщений

И, наконец, в цикле loop() вызываем процедуру проверки обновлений по таймеру

void loop()

Демонстрация работы

И напоследок небольшое видео с демонстрацией работы

  • Подключение LCD дисплея к Arduino и ESP8266
  • Спящий режим ESP8266
  • Распиновка отладочных плат ESP8266 и ESP32
  • Работа с файловой системой ESP8266 в IDE Arduino
  • Создание простого веб-сервера на ESP8266 в Arduino IDE
  • ESP8266 NodeMCU: отправка сообщений в WhatsApp

Источник: projectalt.ru

Рейтинг
( Пока оценок нет )
Загрузка ...