#include #include #include #include #include "SparkFun_Si7021_Breakout_Library.h" #include Weather sensor; //Створюємо екземпляр SI7021 для датчика температури та вологості OneWire ds(15); //Створюємо об'єкт OneWire для шини 1-Wire, за допомогою якої буде здійснюватися робота з датчиком DS18B20 //Ідентифікаційні дані мережі WiFi #define WIFI_SSID "WIFI_NAME" #define WIFI_PASSWORD "WIFI_PASSWORD" //Telegram BOT Token (Отримайте від Botfather) #define BOT_TOKEN "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" const unsigned long BOT_MTBS = 1000; //час між повідомленнями unsigned long bot_lasttime; //час останнього сканування повідомлень WiFiClientSecure secured_client; UniversalTelegramBot bot(BOT_TOKEN, secured_client); //Вимірювання температури з DS18b20 float f_temperature() { byte dsData[2]; //масив для отримання значення температури ds.reset(); //скинути всіх попередні команди та параметри датчику DS18b20 ds.write(0xCC); //команда DS18b20 пропустити пошук за адресою (використано один DS18b20) ds.write(0x44); //команда DS18b20 вимірювати температуру delay(1000); ds.reset(); ds.write(0xCC); ds.write(0xBE); //команда DS18b20 передати значення температури //зчитуємо відповідь dsData[0] = ds.read(); //зчитуємо молодший байт значення температури dsData[1] = ds.read(); //зчитуємо старший байт значення температури float tempOutside = ((dsData[1] << 8) | dsData[0]) * 0.0625; //коефіцієнт 0.0625, відповідає АЦП 12 біт //відладка Serial.println("Outside temperature: " + String(tempOutside) + " C"); return tempOutside; } //------------ void handleNewMessages(int numNewMessages) { Serial.print("handleNewMessages "); Serial.println(numNewMessages); String answer; for (int i = 0; i < numNewMessages; i++) { telegramMessage &msg = bot.messages[i]; Serial.println("Received " + msg.text); if (msg.text == "/report") { float tempOutside = f_temperature();//вимірювання температури за допомогою датчика DS18b20 float humidity = sensor.getRH(); //вимірювання відносної вологості датчиком Si7021 float tempf = sensor.getTempF(); //вимірювання температури датчиком Si7021 float tempC = (tempf - 32) * 5 / 9; //переведення градусів Фаренгейта в Цельсія answer = "temperature outside: \t" + String(tempOutside) + " C\n"; answer += "room temperature: \t" + String(tempC) + " C\n"; answer += "room humidity: \t" + String(humidity) + "%\n"; } else if (msg.text == "/status") answer = "I am working! Everything is fine"; else answer = "Say what?"; bot.sendMessage(msg.chat_id, answer, "Markdown"); } } //Налаштування команд бота void bot_setup() { const String commands = F("[" "{\"command\":\"report\", \"description\":\"Shows measured outdoor temperature, indoor temperature and humidity\"}," "{\"command\":\"status\",\"description\":\"ESP32 status\"}" // no comma on last command "]"); bot.setMyCommands(commands); } //Основна програма void setup() { Serial.begin(115200); Serial.println(); //підключення до Wifi: Serial.print("Connecting to Wifi SSID "); Serial.print(WIFI_SSID); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT); //Add root certificate for api.telegram.org while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.print("\nWiFi connected"); bot_setup(); sensor.begin(); } void loop() { if (millis() - bot_lasttime > BOT_MTBS) { int numNewMessages = bot.getUpdates(bot.last_message_received + 1); while (numNewMessages) { Serial.println("got an answer"); handleNewMessages(numNewMessages); numNewMessages = bot.getUpdates(bot.last_message_received + 1); } bot_lasttime = millis(); } }