#1 21-09-2021 11:33:03

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,589

Стабильный Телеграм бот/градусник на esp8266/esp32 + ds18b20.

Сделал новый Телеграм/градусник на новых библиотеках. Работает всё много стабильнее и быстрее, чем в предыдущем подобном девайсе. Даже при плохом 3G интернете, телеметрия приходит, телеуправление работает. ESP8266 "Witty Cloud" протестирован. ESP32
тоже должен работать.
https://github.com/cotestatnt/AsyncTelegram2
https://github.com/pstolarz/OneWireNg

Не в сети

#2 21-09-2021 11:34:23

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,589

Re: Стабильный Телеграм бот/градусник на esp8266/esp32 + ds18b20.

#define USE_CLIENTSSL true  
#include <AsyncTelegram2.h>
// Timezone definition
#include <time.h>
#define MYTZ "CET-1CEST,M3.5.0,M10.5.0/3"
#ifdef ESP8266
  #include <ESP8266WiFi.h>
  BearSSL::WiFiClientSecure client;
  BearSSL::Session   session;
  BearSSL::X509List  certificate(telegram_cert); 
#elif defined(ESP32)
  #include <WiFi.h>
  #include <WiFiClient.h>
  #if USE_CLIENTSSL
    #include <SSLClient.h>  
    #include "tg_certificate.h"
    WiFiClient base_client;
    SSLClient client(base_client, TAs, (size_t)TAs_NUM, A0, 1, SSLClient::SSL_ERROR);
  #else
    #include <WiFiClientSecure.h>
    WiFiClientSecure client;    
  #endif
#endif
AsyncTelegram2 myBot(client);
const char* ssid = "XXXXXXXXX";         
const char* pass = "XXXXXXXXX";
const char* token = "XXXXXXXXXXXXXXXXXXXXXXXXXXX";     // REPLACE myToken WITH YOUR TELEGRAM BOT TOKEN
const uint8_t LED = 13;//порт синего светодиода
String T="";
#include "OneWireNg_CurrentPlatform.h"
#include "drivers/DSTherm.h"
#define OW_PIN          5//порт DS18B20
/*
 * Set to true for parasitically powered sensors.
 */
#define PARASITE_POWER  false
/*
 * Uncomment for power provided by a switching
 * transistor and controlled by this pin.
 */
//#define PWR_CTRL_PIN    9
static OneWireNg *ow = NULL;
static DSTherm *dsth = NULL;
/* returns false if not supported */
static bool printId(const OneWireNg::Id& id)
{
    const char *name = DSTherm::getFamilyName(id);
    Serial.print(id[0], HEX);
    for (size_t i=1; i < sizeof(OneWireNg::Id); i++) {
        Serial.print(':');
        Serial.print(id[i], HEX);
    }
    if (name) {
        Serial.print(" -> ");
        Serial.print(name);
    }
    Serial.println();

    return (name != NULL);
}
static void printScratchpad(DSTherm::Scratchpad *scrpd)
{
    const uint8_t *scrpd_raw = scrpd->getRaw();

    Serial.print("  Scratchpad:");
    for (size_t i = 0; i < DSTherm::Scratchpad::LENGTH; i++) {
        Serial.print(!i ? ' ' : ':');
        Serial.print(scrpd_raw[i], HEX);
    }

    Serial.print("; Th:");
    Serial.print(scrpd->getTh());

    Serial.print("; Tl:");
    Serial.print(scrpd->getTl());

    Serial.print("; Resolution:");
    Serial.print(9 + (int)(scrpd->getResolution() - DSTherm::RES_9_BIT));

    long temp = scrpd->getTemp();
    Serial.print("; Temp:");
   
    if (temp < 0) {
        temp = -temp;
        Serial.print('-');
    }
    Serial.print(temp / 1000);
    Serial.print('.');
    Serial.print(temp % 1000);
    Serial.print(" C");

    Serial.println();
 T=String(temp / 1000)+"."+String(temp % 1000);
}
void setup() {
  #ifdef PWR_CTRL_PIN
    ow = new OneWireNg_CurrentPlatform(OW_PIN, PWR_CTRL_PIN, false);
#else
    ow = new OneWireNg_CurrentPlatform(OW_PIN, false);
#endif
    dsth = new DSTherm(*ow);
 delay(500);
  // initialize the Serial
  Serial.begin(115200);
 
#if (CONFIG_MAX_SRCH_FILTERS > 0)
    dsth->filterSupportedSlaves();
#endif
  dsth->writeScratchpadAll(0, 0, DSTherm::RES_12_BIT);
  Serial.println("\nStarting TelegramBot...");

  // set the pin connected to the LED to act as output pin
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH); // turn off the led (inverted logic!)

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  delay(500);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }

#ifdef ESP8266
  // Sync time with NTP, to check properly Telegram certificate
  configTime(MYTZ, "time.google.com", "time.windows.com", "pool.ntp.org");
  //Set certficate, session and some other base client properies
  client.setSession(&session);
  client.setTrustAnchors(&certificate);
  client.setBufferSizes(1024, 1024);
#elif defined(ESP32)
  // Sync time with NTP
  configTzTime(MYTZ, "time.google.com", "time.windows.com", "pool.ntp.org");
  #if USE_CLIENTSSL == false
    client.setCACert(telegram_cert);
  #endif
#endif

  // Set the Telegram bot properies
  myBot.setUpdateTime(1000);
  myBot.setTelegramToken(token);

  // Check if all things are ok
  Serial.print("\nTest Telegram connection... ");
  myBot.begin() ? Serial.println("OK") : Serial.println("NOK");

  Serial.print("Bot name: @");
  Serial.println(myBot.getBotName());
}
void ds18b20()
{
    OneWireNg::Id id;
    OneWireNg::ErrorCode ec;
    MAKE_SCRATCHPAD(scrpd);

    /* convert temperature on all sensors connected... */
    dsth->convertTempAll(DSTherm::SCAN_BUS, PARASITE_POWER);

    /* ...and read them one-by-one */
    ow->searchReset();
    do
    {
        ec = ow->search(id);
        if (!(ec == OneWireNg::EC_MORE || ec == OneWireNg::EC_DONE))
            break;

        if (printId(id)) {
            if (dsth->readScratchpad(id, scrpd) == OneWireNg::EC_SUCCESS) {
                printScratchpad(scrpd);
            } else {
                Serial.println("  Invalid CRC!");
            }
        }
    } while (ec == OneWireNg::EC_MORE);

    Serial.println("----------");
    delay(1000);
}
void loop() {
  // local variable to store telegram message data
  TBMessage msg;
  
  // if there is an incoming message...
  if (myBot.getNewMessage(msg)) {
    String msgText = msg.text;
    if (msgText.equals("т1") or msgText.equals("t1")) 
    {    
       ds18b20();
      // generate the message for the sender
      String reply;
      reply = "Бот 1. Температура 1: " ;   
      reply += (T+"*C");
      myBot.sendMessage(msg, reply);                  
    }
    if (msgText.equals("off1")) {                 // if the received message is "LIGHT ON"...
      digitalWrite(LED, LOW);                          // turn on the LED (inverted logic!)
      myBot.sendMessage(msg, "Бот 1. Синий светодиод выключен");       // notify the sender
    }
    else if (msgText.equals("on1")) {           // if the received message is "LIGHT OFF"...
      digitalWrite(LED, HIGH);                          // turn off the led (inverted logic!)
      myBot.sendMessage(msg, "Бот 1. Синий светодиод включен");       // notify the sender   
    }
    else {                                              // otherwise...
         }
  }
}

Не в сети

#3 21-09-2021 11:43:10

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,589

Re: Стабильный Телеграм бот/градусник на esp8266/esp32 + ds18b20.

Если боту будет отправлена команда "t1", в ответ бот пришлёт температуру в данный момент времени.
Если боту будет отправлена команда "on1", бот включит синий светодиод.
Если боту будет отправлена команда "off1", бот выключит синий светодиод.

Не в сети

#4 21-09-2021 11:59:54

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,589

Re: Стабильный Телеграм бот/градусник на esp8266/esp32 + ds18b20.

16322003189762036704398379811632.jpg

Не в сети

#5 21-09-2021 12:03:16

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,589

Re: Стабильный Телеграм бот/градусник на esp8266/esp32 + ds18b20.

16322005162425083554522816560943.jpg

Не в сети

#6 21-09-2021 12:51:56

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,589

Re: Стабильный Телеграм бот/градусник на esp8266/esp32 + ds18b20.

Screenshot-2021-09-21-12-51-13-034-org-telegram-messenger.jpg

Не в сети

#7 21-09-2021 22:18:56

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,589

Re: Стабильный Телеграм бот/градусник на esp8266/esp32 + ds18b20.

Новый Телеграм/градусник/бот снова установлен на моём балконе.  Измеряемая температура, соответствует планетарным данным.

Screenshot-2021-09-21-22-12-02-987-org-telegram-messenger.jpg

Screenshot-2021-09-21-22-15-37-108-com-android-chrome.jpg

Не в сети

#8 21-09-2021 22:22:46

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,589

Re: Стабильный Телеграм бот/градусник на esp8266/esp32 + ds18b20.

Начнём долговременный эксперимент, на  esp8266 и новых библиотеках. Посмотрим, не будет ли микропроцессор зависать на длительных промежутках измерения.

Не в сети

#9 21-09-2021 22:47:20

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,589

Re: Стабильный Телеграм бот/градусник на esp8266/esp32 + ds18b20.

Чтоб найти мой бот в Телеграм, нужно набрать в поиске "Температура в Бийске".
Бот открытый, можете сами запрашивать тепературу у бота, по средствам команд "Т1","т1","T1","t1".

Не в сети

Подвал раздела

Работает на FluxBB (перевод Laravel.ru)