Телеграм бот на ESP32 ESP8266

Телеграм бот на платформе ESP32/8266

Итак, всё начинается с задач, которые мы хотим выполнять на микроконтроллере.

esp 32

ESP 32  в таком исполнении, как и подобного вида контролеры, имеет пару светодиодов компаратор и стабилизатор питания. На этой плате нет периферийных устройств. Если привести аналогию, то данная плата является системным блоком компьютера, и если включить системник, то он будет работать, но вот работать на нем без монитора и клавиатуры с мышкой будет непросто). Как системному блоку нужен монитор, так и микроконтроллеру нужны датчики, реле, модули. Для примера возьмем адресные термометры 18b20 для сбора данных о температуре и MOSFET транзистор irf3205, для управления нагрузкой 12 В. В данном статье будет приведен пример реализации бота на микроконтроллере ESP8266, но программный код подходит и для ESP32.

Для чего можно использовать телеграм бота

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

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

Чтобы зарегистрировать бота, его нужно создать способом описанным ниже.

  1. В поиске Телеграм ищем @BotFather . Это официальный бот, созданный для создания и  управления вашими ботами.
  2. Шлём команду:
  3. /newbot
  4. @BotFather Дальше нужно придумать название для бота. Следующим сообщением отправьте его название, заканчивающееся на «_bot».
  5. Скопируйте токен  от @BotFather — это ключ для работы с Telegram API, выглядит он так «5123379471:ADTGHoklIb9xYOaasdeJo6Dghj5hxkHYhwvg».

Доступ и приватность бота

Алгоритм обеспечения безопасности заключается в уникальном имени пользователя или группы.

for (int i=0; i<numNewMessages; i++) {
    // Идентификатор чата запроса
    String chat_id = String(bot.messages[i].chat_id);
    if (chat_id != CHAT_ID){
      bot.sendMessage(chat_id, "Unauthorized user", "");
      continue;
    }

Если id пользователя или группы будут не совпадать с исходными, то бот ответит «Unauthorized user».

Для получения id своего или группы, нужно написать или добавить в группу бота  @get_id_bot

Этот номер нужно вписать в строку

#define CHAT_ID "-558000000"

Базовые настройки

Итак, для работы нужно загрузить следующие библиотеки

#ifdef ESP32
  #include <WiFi.h>
#else
  #include <ESP8266WiFi.h>
#endif
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h> 
#include <ArduinoJson.h>
#include <OneWire.h>
#include <DallasTemperature.h>

Что-то можно установить с Arduino IDE, что-то придется устанавливать через zip

Подключение библиотеки

Недостающие библиотеки скачиваем с GitHub

ESP8266 для доступа в интернет использует wi-fi поэтому вводим имя сети и пароль

// Вставьте сюда свои учетные данные сети
const char* ssid = "wifi";
const char* password = "12345678";

Распиновка микроконтроллера ESP8266

esp8266

Обратите внимание, что название пинов отличаются от их номеров, и если мы хоти обратиться к пину D1, то это 5 выход, а не 1.

Спаиваем на макетной плате все детали и прошиваем микроконтроллер.

esp 8266

Полный код программы

#ifdef ESP32
  #include <WiFi.h>
#else
  #include <ESP8266WiFi.h>
#endif
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h> 
#include <ArduinoJson.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define relay1 4 // D4 pin rrelay1
#define relay2 5 // D1 pin rrelay2
#define t 2 // D1 pin rrelay2
 
// Вставьте сюда свои учетные данные сети
const char* ssid = "wifi";
const char* password = "12345678";
 
// Запускаем бот
#define BOTtoken "5120009471:ADTGHoklIb9xYOaasdeJo6Dghj5hxkHYhwvg"  // Вставляем токен бота.           5119754332:AAE8epAvJozSIa6_FsAJlrKLVpPx0Iw1KxA
 
// это номер группы или пользователя
#define CHAT_ID "-558000000"
 
#ifdef ESP8266
  X509List cert(TELEGRAM_CERTIFICATE_ROOT);
#endif
 
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
 
// Каждую секунду проверяет новые сообщения
int botRequestDelay = 1000;
unsigned long lastTimeBotRan;

//timer
uint32_t myTimer1;
uint32_t myTimer2;

int relayState1 = 0;
int relayState2 = 0;
float t1, t2;
int trevoga = 0;
int ignorTrevoga = 1; 
int ignorPovestka = 1;
int climatMod;
 

// temp
OneWire oneWire(t); // вход датчиков 18b20
DallasTemperature ds(&oneWire);
// это id датчиков 18b20
DeviceAddress sensor1 = {0x28, 0xFF, 0x64, 0x02, 0xEF, 0x67, 0xDD, 0x47}; 
DeviceAddress sensor2 = {0x28, 0xFF, 0x64, 0x02, 0x19, 0xF1, 0x69, 0x21};

 
// Задаем действия при получении новых сообщений 
void handleNewMessages(int numNewMessages) {
  Serial.println("handleNewMessages");
  Serial.println(String(numNewMessages));
 
  for (int i=0; i<numNewMessages; i++) {
    // Идентификатор чата запроса
    String chat_id = String(bot.messages[i].chat_id);
    if (chat_id != CHAT_ID){
      bot.sendMessage(chat_id, "Unauthorized user", "");
      continue;
    }

    // Print the received message
    String text = bot.messages[i].text;
    Serial.println(text);
    
    String from_name = bot.messages[i].from_name;
    if (text == "/start") {
      String welcome = "Здорово , " + from_name + "\n";
      welcome += "Выбирай команды, исполню \n";
      welcome += "/relay1 : включить реле 1\n";
      welcome += "/relay2 : включить реле 2\n";
      welcome += "/ignorTrevoga : охрана off(on)\n";
      welcome += "/ignorPovestka : оповещение off(on)\n";
      welcome += "/temperature : температура датчиков\n";
      welcome += "/status : состояние прибора\n";
      bot.sendMessage(CHAT_ID, welcome, "");
    }
    
    if (text == "/relay1") {
      relayState1 = relayState1 + 1;
      if (relayState1 > 1) {  
        relayState1 = 0; 
        }
      Serial.println("relay 1");
    }
    if (text == "/relay2") {
      relayState2 = relayState2 + 1;
      if (relayState2 > 1) {  
        relayState2 = 0; 
        }
      digitalWrite(relay2, relayState2);
      Serial.println("relay 2");
    }
    if (text == "/temperature") {
      String readings = (String)" Температура1:  " + t1 + " Температура2:  " + t2  ;
      bot.sendMessage(chat_id, readings, "");
    }  
    if (text == "/status") {
      String readings = (String)" Реле_1:  " + relayState1 + " Реле_2:  " + relayState2 + " температура1:  " + t1+ " температура2:  "+ t2 + " оповещение:  "+ ignorPovestka + " тревога:  "+ignorTrevoga + " Вентилятор включен:  " + climatMod;
      bot.sendMessage(chat_id, readings, "");
    }  
    if (text == "/ignorTrevoga") {
      ignorTrevoga = ignorTrevoga + 1;
      if (ignorTrevoga > 1) {  
        ignorTrevoga = 0; 
        }
    }  
    if (text == "/ignorPovestka") {
      ignorPovestka = ignorPovestka + 1;
      if (ignorPovestka > 1) {  
        ignorPovestka = 0; 
        }
    }
  }
}
 
void setup() {
  Serial.begin(115200);
  
  pinMode(relay1, OUTPUT);  //relay 1
  pinMode(relay2, OUTPUT); // relay 2

WiFi.setOutputPower(20.5);  // only esp8266
// WiFi.setTxPower(WIFI_POWER_19_5dBm);  // only esp32

  #ifdef ESP8266
    configTime(0, 0, "pool.ntp.org");      // получаем всемирное координированное время (UTC) через NTP
    client.setTrustAnchors(&cert); // Получаем сертификат api.telegram.org
  #endif
  
  // Подключаемся к Wi-Fi
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  #ifdef ESP32
    client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Добавляем корневой сертификат для api.telegram.org
  #endif
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }
  // Выводим IP ESP32
  Serial.println(WiFi.localIP());
 
  bot.sendMessage(CHAT_ID, "Bot Started", "");
}
 
void loop() {
  ds.requestTemperatures(); // считываем температуру с датчиков
    
    t1=ds.getTempC(sensor1);
    t2=ds.getTempC(sensor2);
  
  if (millis() > lastTimeBotRan + botRequestDelay) {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
 
    while(numNewMessages) {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }
    lastTimeBotRan = millis();
  }
if (millis() - myTimer2 >= 600000) {   // ищем разницу (10 минут) Эта конструкция работает
    myTimer2 = millis();              // сброс таймера
    // выполнить действиe
    if (ignorPovestka == 1 and t1> 31) {
    String readings = (String)" Температура1:  " + t1 + " Температура2:  " + t2 + " Вентилятор включен:  " + climatMod ;
      bot.sendMessage(CHAT_ID, readings, "");}
      Serial.println(t1);
 }
// термоконтроль t1
  
if (relayState1 == 1){
  digitalWrite(relay1, HIGH);}
else if (t1>30){
  climatMod = 1;
  digitalWrite(relay1 , HIGH);}
else if (t1 < 27) {
  digitalWrite(relay1, LOW);
  climatMod = 0;}
}

Что умеет этот бот

Если всё сделали правильно, то если отправить боту команду «/start»

ESP telegram

Бот поприветствует вас и даст список команд.

ESP32 TelegramESP8266 telegram

Таким образом бот работает, его функционал значительно шире, чем у умной розетки от Яндекс или sonoff.

Это может быть Вам интересно

SSD диски – плюсы и минусы

SSD диск это SSD диск построен на базе энергонезависимой памяти, где используется технология NAND и FRAM. Технология NAND SSD позволяет при использовании схем балансирования нагрузки...

Видеорегистратор Redline CCTV перегрелся

Ремонт видеорегистратора Redline При тестировании видеорегистратора Redline CCTV специалистами компании РосАвтоатизации был выявлен недостаток регистратора и произведён ремонт видеорегистратора. У регистратора при температуре окружающей среды...

Настройка PACS DICOM. Что выбрать: ClearCanvas, MRIdb или dcm4chee?

    Сравнение PACS DICOM систем для медицины. Настройка PACS DICOM. Перед нашей компанией поставили задачу внедрения бесплатной PACS системы, включающая DICOM сервер, просмотрщик и клиентское...

Оставьте заявку и мы Вам перезвоним

Политика конфиденциальности

Данная политика конфиденциальности (далее — «Политика») распространяется на всю персональную информацию, которую получает от Пользователя во время его пребывания веб-сайт Ra38.ru или его поддомены (далее «Веб-сайт»). Также, Политика описывает, как Веб-сайт собирает, использует и раскрывает полученную персональную информацию. Пользователь, пользуясь Веб-сайтом, дает свое согласие на сбор и использование его персональной информации.

Получение персональной информации

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

Веб-сайт самостоятельно или через сервисы других Веб-сайтов может запросить у Пользователя следующую информацию: имя и фамилию, название компании, которую он представляет (если есть), почтовый адрес, номер телефона, адрес электронной почты.

Любая информация, автоматически считываемая в результате посещения Пользователем Веб-сайта, включая последовательность просмотра, используется без идентификации отдельных пользователей. Веб-сайт «cookies» для того, чтобы быть более удобным для Пользователя.

Использование и раскрытие персональной информации

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

Веб-сайт никому не продает и не разглашает персональную информацию о Пользователе. Веб-сайт вправе раскрыть и передать персональную информацию третьим лицам только в том случае, если это требует российское или международное законодательство и/или органы власти с соблюдением законной процедуры.

Удаление персональной информации

Пользователь, зарегистрированный на Веб-сайте, имеет возможность в любое время удалить свою персональную информацию, для этого необходимо связаться по электронной почте info@ra38.ru.

Ссылки на другие веб-сайты

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

Безопасность

Веб-сайт предпринимает соответствующие меры для обеспечения безопасности персональной информации Пользователя от потери, неправильного использования, несанкционированного доступа, разглашения или изменения.

Изменения условий Политики

Веб-сайт оставляет за собой право дополнять и изменять условия Политики в связи с требованиями законодательства, внедрением дополнительных сервисов и сложившейся практикой взаимоотношений с Пользователями.