NodeMCU + Telegram. Часть 2.

Всем привет!

В прошлый раз мы рассматривали связку NodeMCU + Blynk, сегодня рассмотрим не менее интересную связку — NodeMCU + Telegram. В данной статье мы все так же, как и в прошлой, будем управлять светодиодом на плате NodeMCU, и считывать текущую температуру при помощи цифрового датчика температуры DS18B20, подключенного к порту D2 указанной платы. Среда разработки все та же — Arduino IDE, настройки те же, что и в первой части. Проект очень простой, но постигнув азы работы мессенджера с платой NodeMCU, полученные знания можно будет использовать в более сложных проектах домашней автоматизации и интернета вещей.

Итак, чтобы данная связка у нас заработала нам необходимо проделать следующие манипуляции:

  • Для управления платой NodeMCU требуется создать Telegram бота.
  • Получить идентификатор пользователя Telegram (User ID).
  • Написать скетч в среде Arduino IDE для управления состоянием светодиода и считывания текущей температуры.
  • Описать боту команды для управления платой NodeMCU.

Telegram Messenger — это облачная служба обмена мгновенными сообщениями и передачи голоса по IP. Вы можете легко установить его на свой смартфон (Android и iPhone) или компьютер (ПК, Mac и Linux). Messenger бесплатен и не содержит рекламы. Telegram позволяет создавать ботов, с которыми вы можете взаимодействовать. Боты — это сторонние приложения, которые работают внутри Telegram. Пользователи могут взаимодействовать с ботами, отправляя им сообщения, команды и встроенные запросы. Вы управляете своими ботами, используя HTTPS-запросы к Telegram Bot API .

1. Создает Telegram бота.

Итак, входим в Play Market или App Store, скачиваем и установливаем Telegram Messenger. У меня приложение уже установлено, поэтому вместо «Установить» у меня отображается «Открыть», у Вас будет «Установить».

Теперь приступим к созданию нашего бота. Для этого открываем Telegram, и в строке поиска вводим «BotFather»:

Выбираем указанного на картинке бота и можем ознакомиться с тем, что умеет данный бот. Далее введем команду /start

Далее введите команду /newbot и создайте своего бота, задайте имя своему боту, а так же имя пользователя, который будет с этим ботом работать.

Как только Ваш бот будет успешно создан, Вы получите сообщение со ссылкой на бота и токен бота. Сохраните токен бота, он Вам понадобится, чтобы плата NodeMCU могла взаимодействовать с Вашим ботом.

2. Получение идентификатора пользователя Telegram (User ID).

Любой, кто знает имя пользователя вашего бота, может взаимодействовать с ним. Чтобы быть уверенным, что мы игнорируем сообщения не из нашей учетной записи Telegram (или любых авторизованных пользователей), вы можете получить свой идентификатор пользователя Telegram (User ID). Затем, когда ваш бот Telegram получает сообщение, NodeMCU может проверить, соответствует ли идентификатор отправителя (User ID) вашему идентификатору пользователя (User ID), и обработать сообщение или проигнорировать его.

Открываем Telegram, и в строке поиска вводим «IDBot»:

Выбираем указанного на картинке бота и можем ознакомиться с тем, что умеет данный бот. Далее введем команду /start

Затем введите команду /getedit , в результате бот выдаст Вам идентификатор пользователя (User ID). Сохраните данный User ID, он нам еще пригодится 😉

3. Настройка среды Arduino IDE и написане скетча.

О настройка Arduino IDE мы с Вами разговаривали в первой части. Так что все настройки идентичные, за исключением некоторых библиотек. В этот раз нам понадобятся следующие библиотеки:

  1. Universal Telegram Bot Library
  2. ArduinoJson library

Ниже приведен скетч:

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

// Replace with your network credentials
const char* ssid = "**********";    // Имя вашей WiFi сети
const char* password = "*********";  // Пароль вашей WiFi сети


// Датчик DS18B20 подключаем к порту D2 чипа ESP8266
#define ONE_WIRE_BUS D2

// Настройка сети OneWire для работы с OneWire устройствами
OneWire oneWire(ONE_WIRE_BUS);

// neWire устройство - DS18B20
DallasTemperature sensors(&oneWire);

float tempSensor1; // Переменная в которй будем хранить значение температуры
String T;  // Строковая переменная

// ID датчика температуры DS18B20
uint8_t sensor1[8] = { 0x28, 0xFF, 0xD0, 0xF7, 0xC1, 0x17, 0x05, 0xA4 };

// Инициализация Telegram BOT
#define BOTtoken "************************************************"  // Здесь введите Ваш Bot Token, сгенерированный Botfather

// Здесь введите идентификатор пользователя Telegram (UserID)
#define CHAT_ID "*************"

WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);

// Проверяет наличие новых сообщений каждые секунду.
int botRequestDelay = 1000;
unsigned long lastTimeBotRan;

const int ledPin = 2;
bool ledState = HIGH; // LOW for ESP32

// Обработка новых сообщений
void handleNewMessages(int numNewMessages) {
  Serial.println("handleNewMessages");
  Serial.println(String(numNewMessages));

  for (int i = 0; i < numNewMessages; i++) {
    // Chat id of the requester
    String chat_id = String(bot.messages[i].chat_id);
    if (chat_id != CHAT_ID) {
      bot.sendMessage(chat_id, "Неизвестный пользователь", ""); // Неавторизованный пользователь
      continue;
    }

    // Вывод полученного сообщения
    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\n"; // Используйте следующие команды
      welcome += "/on - Включить светодиод \n";       // Включение светодиода
      welcome += "/off - Выключить светодиод \n";     // Выключение светодиода
      welcome += "/temp - Считать температуру \n";    // Чтение температурыего
      welcome += "/state - Узнать состояние светодиода \n"; // Узнать состояние светодиода
      bot.sendMessage(chat_id, welcome, "");
    }

    if (text == "/on") {
      bot.sendMessage(chat_id, "Светодиод включен", ""); // Светодиод включен
      ledState = LOW; // HIGH for ESP32
      digitalWrite(ledPin, ledState);
    }

    if (text == "/off") {
      bot.sendMessage(chat_id, "Светодиод выключен", ""); // Светодиод выключен
      ledState = HIGH; // LOW for ESP3
      digitalWrite(ledPin, ledState);
    }
    
    if (text == "/temp") {
      bot.sendMessage(chat_id, "Считываю температуру...\n", ""); // Читаем температуру
      bot.sendMessage(chat_id, (T), "");
    }

    if (text == "/state") {
      if (digitalRead(ledPin)) {
        bot.sendMessage(chat_id, "На плате NodeMCU cветодиод выключен", ""); // Светодиод включен (ОС)
      }
      else {
        bot.sendMessage(chat_id, "На плате NodeMCU cветодиод включен", ""); // Светодиод выключен (ОС)
      }
    }
  }
}

// Инициализируем последовательный монитор.
void setup() {
  Serial.begin(115200);

  sensors.begin();
  
#ifdef ESP8266
  client.setInsecure();
#endif

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, ledState);

  // Подключение к сети Wi-Fi
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi.."); 
  }
  // Print ESP32 Local IP Address
  Serial.println(WiFi.localIP());
}

// Проверяем наличие новых сообщений каждую секунду.
void loop() {
  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();
  }
  
  sensors.requestTemperatures();
  tempSensor1 = sensors.getTempC(sensor1);
  T = "Temp="+String(tempSensor1)+" oC"; // Переводим цифровое значение температуры в строку
  Serial.print("Temp: ");
  Serial.print(tempSensor1);
  Serial.println(" oC"); 
}

Далее компилируем скетч и прошиваем нашу плату NodeMCU. Ну и проверяем как оно все работает 🙂

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.