Телеграм бот на ESP32 ESP8266
Телеграм бот на платформе ESP32/8266
Итак, всё начинается с задач, которые мы хотим выполнять на микроконтроллере.
ESP 32 в таком исполнении, как и подобного вида контролеры, имеет пару светодиодов компаратор и стабилизатор питания. На этой плате нет периферийных устройств. Если привести аналогию, то данная плата является системным блоком компьютера, и если включить системник, то он будет работать, но вот работать на нем без монитора и клавиатуры с мышкой будет непросто). Как системному блоку нужен монитор, так и микроконтроллеру нужны датчики, реле, модули. Для примера возьмем адресные термометры 18b20 для сбора данных о температуре и MOSFET транзистор irf3205, для управления нагрузкой 12 В. В данном статье будет приведен пример реализации бота на микроконтроллере ESP8266, но программный код подходит и для ESP32.
Для чего можно использовать телеграм бота
Телеграм можно использовать вместо MQTT клиента, как более простой и защищенный канал связи между контроллером и вашими устройствами. К плюсам можно отнести удобство и простоту использования. Например, можно добавить бота в группу и каждый участник группы будет иметь доступ к боту.
Как зарегистрировать нового бота в Телеграм
Чтобы зарегистрировать бота, его нужно создать способом описанным ниже.
- В поиске Телеграм ищем @BotFather . Это официальный бот, созданный для создания и управления вашими ботами.
- Шлём команду:
-
/newbot
- @BotFather Дальше нужно придумать название для бота. Следующим сообщением отправьте его название, заканчивающееся на «_bot».
- Скопируйте токен от @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
Обратите внимание, что название пинов отличаются от их номеров, и если мы хоти обратиться к пину D1, то это 5 выход, а не 1.
Спаиваем на макетной плате все детали и прошиваем микроконтроллер.
Полный код программы
#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»
Бот поприветствует вас и даст список команд.
Таким образом бот работает, его функционал значительно шире, чем у умной розетки от Яндекс или sonoff.