Термометр на ESP8266 с оповещением через телеграмм Бота

pmbarsukov

✩✩✩✩✩✩✩
29 Янв 2024
2
0
Прошу помощи.
Решил я сделать термометр на ESP8266, что бы удаленно следить за температурой через телеграмм бота, и в случае отклонения температуры мне бы в телегу приходило сообщение. Програмированием ни когда не занимался, делаю все в первый раз, используя примеры с разных проектов. В прицепе все работает но при критическом изменение температуры сообщение приходит только после того как ты спрашиваешь у бота "какая температура"




C++:
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


float DS18b20 = 0;


#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64  // OLED display height, in pixels
#define OLED_RESET  -1 // sharing Arduino reset pin
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWireBus(2);
DallasTemperature sensors(&oneWireBus);

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#define WIFI_SSID "TP-LINK_E00C92"
 #define WIFI_PASSWORD "71660905"
 #define BOT_TOKEN "XXXXXXXXXXXXXXXXXXXXXXXXX"
 const unsigned long BOT_MTBS = 100;
 X509List cert(TELEGRAM_CERTIFICATE_ROOT);
 WiFiClientSecure secured_client;
 UniversalTelegramBot bot(BOT_TOKEN, secured_client);
 unsigned long bot_lasttime;
 int ledStatus = 0;
 void handleNewMessages(int numNewMessages)
 {
 
 for (int i = 0; i < numNewMessages; i++)
 {
 String chat_id = bot.messages[i].chat_id;
 String text = bot.messages[i].text;
 String from_name = bot.messages[i].from_name;
  if (DS18b20 > 26){
    bot.sendMessage(chat_id, (String("Внимание температура ") + String(String(DS18b20)) + String("  С")), "");
  }
 if (from_name == "")
 from_name = "Guest";
 
    if(text == "Какая температура"){
      bot.sendMessage(chat_id, (String("Температура ") + String(String(DS18b20)) + String("  С")), "");
   }
 }
 }


void setup() {
  sensors.begin();

  Serial.begin(9600);
 Serial.println();
 configTime(0, 0, "pool.ntp.org");
 secured_client.setTrustAnchors(&cert);
 WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
 while (WiFi.status() != WL_CONNECTED)
 {

 delay(500);
 }
 Serial.print("WiFi connected. IP address: ");
 Serial.println(WiFi.localIP());
 Serial.print("Retrieving time: ");
 time_t now = time(nullptr);
 while (now < 24 * 3600)
 {
  delay(100);
 now = time(nullptr);
 }

display.setRotation(0);

}

void loop() {

  Wire.begin(1, 3);  //(SDA = GPIO1, SCL = GPIO3)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.display();
  sensors.requestTemperatures();
  DS18b20 = sensors.getTempCByIndex(0);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(15, 3);
  display.println("-TEMPERATURA-");
  display.display();
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.setCursor(0, 35);
  display.println(DS18b20);
  display.display();
  delay(1000);
 
    sensors.requestTemperatures();
     DS18b20 = sensors.getTempCByIndex(0);
    if (millis() - bot_lasttime > BOT_MTBS)
    {
     int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
        while (numNewMessages)
     {

     handleNewMessages(numNewMessages);
     numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }
     bot_lasttime = millis();
     }

}
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
А почему оно должно это отсылать ? Бегло посмотрев код (его надо вставлять в определенном виде, для вставки есть специальный тэг вида < / > ) , вижу что sendMessage , т.е. отправка сообщения, происходит только в ответ на новое сообщение.
Что бы бот отсылал сообщение по изменению температуры проверять надо температуру в цикле loop. При этом надо уже как то задать нужный chat_id
 

pmbarsukov

✩✩✩✩✩✩✩
29 Янв 2024
2
0
@Старик Похабыч, вот в этом и проблема , что я не могу разобраться как правильно исправить код, что бы он правильно работал. И вообще может ли данная библиотека отправлять сообщения самостоятельно ( без запроса ).
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
@pmbarsukov, надо что то почитать. И научиться гуглу , яндексу, или еще кому задавать вопросы.
У есп есть USB разъем ? если да, то проще для начала забыть про телеграм бот и сделать вывод в монитор порта.
Дальше задаем вопрос гуглу "C++ как выполнить что то по условию": https://yandex.ru/search/?text=C%2B%2B+как+выполнить+что+то+по+условию&clid=2270455&banerid=0702004852%3ASW-536e4d6903f6&win=528&lr=213
И читаем про условные операторы.
Далее надо понять, что измерение температуры никак не связано с телеграмм ботом. Значит их надо получать отдельно друг от друга в цикле loop , а не в обработке полученного сообщения от телеграмма. Проше всего завести глобальную переменную, которая будет содержать в себе текущую температуру.
В обработке сообщений от телеги не вызывать заново измерение, а выводить значение этой переменной.
В теле цикла loop соотв постоянно обновлять значение переменной.
И там же сравнивать полученное значение с критической и в случае при превышении порога отправлять сообщение в нужный chat_id. Отсюда вывод - chat_id должен быть известен сразу, либо оповещение начнется только после получения chat_id от входящего сообщения. Тогда пока chat_id пустой - сообщения не будут уходить.
 
  • Лойс +1
Реакции: pmbarsukov