230

ESP8266 подключаем к датчику DHT22 для измерения температуры и влажности, а также к Telegram-боту. Пример кода и подробный обзор.

https://androidchik.ru

В данном коде ESP8266 подключается к датчику DHT22 для измерения температуры и влажности, а также к Telegram-боту для отправки показаний датчика и управления двумя устройствами: реле и светодиодной лампочкой (LED).

В этом ESP8266-коде мы:

Подключаем датчик DHT22 (DHT — Digital Humidity and Temperature) для измерения температуры и влажности в окружающей среде.

Инициализируем и настраиваем Telegram-бота для взаимодействия с пользователем через мессенджер Telegram.

Отправляем текущие показания температуры и влажности нашему Telegram-боту

Реализуем возможность управления двумя устройствами:

Реле: Пользователь может включить или выключить реле, что может быть полезно для управления электрическими устройствами.

Пользователь будет отправлять команды боту, такие как «/on» (включить реле), «/off» (выключить реле), «

Общий функционал этого кода позволяет пользователю получать информацию о температуре и влажности в реальном времени и управлять реле и светодиодной лампочкой через Telegram.

 

Перейдите на Форум для просмотра полного кода

 

#include <ArduinoJson.h>

ArduinoJson: Эта библиотека позволяет вам работать с данными JSON. Она используется для создания, синтаксического анализа и манипулирования объектами JSON и структурами данных. JSON (объектная нотация JavaScript) — это облегченный формат обмена данными, часто используемый для файлов конфигурации, обмена данными между сервером и веб-приложением и многого другого.

 

#include <Adafruit_Sensor.h>

Adafruit_Sensor: Эта библиотека является частью унифицированной сенсорной системы Adafruit. Это общий интерфейс для работы с различными датчиками и драйверами датчиков. Adafruit, хорошо известная компания в сообществе производителей, предлагает широкий ассортимент датчиков для различных применений. Adafruit_Sensor Библиотека стандартизирует способ взаимодействия с датчиками, упрощая работу с различными типами датчиков с использованием согласованного интерфейса.

 

#include <DHT.h>

include <DHT.h> Директива используется для включения библиотеки DHT в ваш Arduino sketch. Эта библиотека специально разработана для взаимодействия с датчиками DHT (цифровой влажности и температуры), такими как DHT11 и DHT22. Она предоставляет функции, которые позволяют считывать данные о температуре и влажности с этих датчиков.

 

#define DHTPIN 2

#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

#define DHTPIN 2: Эта строка определяет константу DHTPIN и присваивает ей значение 2. Обычно она используется для указания вывода Arduino, к которому подключен датчик DHT22. Вы можете изменить это значение, чтобы оно соответствовало фактическому контакту, к которому вы подключили датчик DHT22.

#define DHTTYPE DHT22: Эта строка определяет другую константу DHTTYPE и присваивает ей значение DHT22. Она определяет тип используемого вами датчика DHTDHT11

DHT dht(DHTPIN, DHTTYPE);: В этой строке создается экземпляр датчика DHT. Он использует значения, определенные константами DHTPIN и DHTTYPE, для указания контакта, к которому подключен датчик, и его типа.

С помощью этого кода мы настраиваем необходимую конфигурацию для работы с DHT22 readHumidity() и readTemperature() с dht объекта для считывания данных влажности и температуры с датчика соответственно.

 

 

#ifdef ESP32

  #include <WiFi.h>

#else

  #include <ESP8266WiFi.h>

#endif

Этот код использует директивы препроцессора (#ifdef, #include, #else и #endif) для включения соответствующей библиотеки в зависимости от того, компилируется ли код для платы ESP32 или ESP8266. Вот как это работает:

  • #ifdef ESP32: В этой строке проверяется, определен ли символ ESP32. Если вы компилируете свой код для платы ESP32, вы обычно определяете его ESP32 где-нибудь в настройках вашего проекта или конфигурации, зависящей от конкретной платформы.
  • #include <WiFi.h>: Если ESP32 задан, код включает в себя <WiFi.h> библиотеку. Эта библиотека предоставляет функции для подключения к сетям Wi-Fi и работы с сетевыми задачами на платах ESP32.
  • #else: Если ESP32 параметр не определен, компилируется следующий #else код. Это код, который будет использоваться для плат ESP8266.
  • #include <ESP8266WiFi.h>: При компиляции для платы ESP8266 код включает в себя <ESP8266WiFi.h> библиотеку. Эта библиотека предоставляет те же функциональные возможности, что и WiFi.h библиотека, но специфична для плат ESP8266.

Это условное включение библиотек позволяет вам писать код, который можно использовать как для плат ESP32, так и для плат ESP8266, без ручного изменения состава библиотеки при каждом переключении целевой платы. Это упрощает обслуживание кода для проектов, которые могут выполняться на другом оборудовании.

 

 

#include <WiFiClientSecure.h>

#include <UniversalTelegramBot.h>

#include <ArduinoJson.h>

  1. #include <WiFiClientSecure.h>: Эта библиотека используется для создания безопасных клиентских подключений по Wi-Fi. Ее часто используют для выполнения безопасных HTTP-запросов или подключения к службам, которым требуется безопасное соединение, таким как Telegram Bot API при использовании HTTPS.
  2. #include <UniversalTelegramBot.h>: Это библиотека для работы с API Telegram Bot. Он предназначен для обеспечения простого способа взаимодействия Telegram ботов на платформе Arduino или ESP8266 / ESP32.
  3. #include <ArduinoJson.h>: Эта библиотека предназначена для работы с данными в формате JSON. Она позволяет анализировать и генерировать данные в формате JSON, которые обычно используются при работе с веб-API, включая Telegram Bot API.

Эти библиотеки используются вместе для создания Telegram-ботов на платформах микроконтроллеров, таких как Arduino или ESP8266 / ESP32. WiFiClientSecure обеспечивает безопасное соединение с серверами Telegram, UniversalTelegramBot упрощает взаимодействие с Telegram API и ArduinoJson используется для анализа и создания данных в формате JSON, именно так вы обычно взаимодействуете с Telegram API.

 

const char* ssid = «Ваш имя WiF»;

const char* password = «Ваш пароль от WiFi»;

 

Эти строки кода определяют две переменные:

В коде переменные ssid и password содержат информацию о имени (SSID) вашей Wi-Fi-сети и пароле к ней. Эти данные используются для настройки подключения вашего ESP8266 модуля к Wi-Fi сети.

Пожалуйста, убедитесь, что вы заменили "Имя WiF" на имя вашей Wi-Fi сети (SSID), и "пароль от WiFi" на пароль вашей Wi-Fi сети. Это важно, чтобы ваш ESP8266 мог успешно подключиться к вашей Wi-Fi сети и взаимодействовать с Telegram API через интернет.

 

#define BOTtoken «Тут токен вашего бота телеграм»; 

#define CHAT_ID » Тут Ваш чат  ID «;

  1. BOTtoken: Это директива препроцессора (#define), используемая для определения константы с именем «BOTtoken». Значением, присвоенным этой константе, должен быть токен вашего Telegram-бота. Вам необходимо заменить «Тут токен вашего бота телеграм» на токен вашего реального Telegram-бота.
  2. CHAT_ID: Это еще одна директива препроцессора (#define), используемая для определения «Тут Ваш чат ID»

Эти константы используются в вашем коде для указания токена бота и идентификатора чата, что позволяет вашему Arduino sketch подключаться к вашему Telegram-боту и взаимодействовать с ним. Обязательно замените эти значения-заполнители на токен вашего реального Telegram-бота и чат.

 

#ifdef ESP8266

  X509List cert(TELEGRAM_CERTIFICATE_ROOT);

#endif

WiFiClientSecure client;

UniversalTelegramBot bot(BOTtoken, client);

int botRequestDelay = 1000;

unsigned long lastTimeBotRan;

  1. #ifdef ESP8266 и #endif: Эти директивы препроцессора используются для условного включения определенного кода при компиляции для платы ESP8266. Если вы используете плату ESP8266, будет включен код между #ifdef ESP8266 и #endif. Если вы не используете плату ESP8266, этот код будет исключен.
  2. X509List cert(TELEGRAM_CERTIFICATE_ROOT);: Этот код определяет объект cert класса X509List что связан с обработкой сертификатов X.509. Конструктор TELEGRAM_CERTIFICATE_ROOT, который, является константой или макрокомандой, определенной в другом месте вашего кода. Он используется для настройки сертификата для безопасного соединения.
  3. WiFiClientSecure client;: Этот код определяет объект client класса WiFiClientSecure. Этот объект используется для создания безопасного соединения с серверами Telegram. WiFiClientSecure Класс специфичен для платформ ESP8266 и ESP32 способен устанавливать безопасные соединения по Wi-Fi.
  4. UniversalTelegramBot bot(BOTtoken, client);: Эта строка создает экземпляр UniversalTelegramBot класса, который используется для взаимодействия с API Telegram Bot. Он принимает два аргумента: токен вашего бота (BOTtoken) и client объект для обработки соединения. Эта строка инициализирует bot объект.
  5. int botRequestDelay = 1000;: Эта строка определяет целочисленную переменную botRequestDelaybotRequestDelay и устанавливает ее равной 1000 миллисекундам (1 секунда). Это задержка между запросами к серверу Telegram.
  6. unsigned long lastTimeBotRan;: В этой строке объявляется unsigned long переменная lastTimeBotRan. Эта переменная, предназначена для хранения временной метки последнего запуска бота, но она не инициализирована в предоставленном фрагменте кода.

Этот фрагмент кода настраивает необходимые объекты и параметры для взаимодействия с Telegram API с использованием платы ESP8266 при условии правильной настройки требуемых библиотек и учетных данных. Обязательно инициализируйте `lastTimeBotlastTimeBotRan текущим временем (например, с помощью millis()), прежде чем использовать его для сравнения временных меток в вашем эскизе.

 

String getReadings(){

  float temperature, humidity;

  temperature = dht.readTemperature();

  humidity = dht.readHumidity();

  String message = «Temperature: » + String(temperature) + » ºC \n»;

  message += «Humidity: » + String (humidity) + » % \n»;

  return message;

}

getReadings Функция считывает температуру и влажность с датчика DHT и возвращает форматированную строку, содержащую показания датчика. Вот краткое описание того, что делает каждая часть функции:

  1. float temperature, humidity;: Объявляет две переменные с плавающей запятой для хранения показаний температуры и влажности.
  2. temperature = dht.readTemperature();: Считывает температуру с датчика DHT и присваивает ее temperature переменной.
  3. humidity = dht.readHumidity();: Считывает влажность с датчика DHT и присваивает ей значение humidity переменной.
  4. String message = «Temperature: » + String(temperature) + » ºC \n»;: Создает строковую переменную с именем message для хранения показаний датчика. Она форматирует показания температуры и добавляет их в строку сообщения вместе с единицей измерения «ºC» (градусы Цельсия) и символом перевода строки.
  5. message += «Humidity: » + String(humidity) + » % \n»;: Добавляет значение влажности к строке сообщения вместе с единицей измерения «%» и символом новой строки.
  6. return message;: Возвращает форматированное сообщение, содержащее показания температуры и влажности в виде строки.

Эта функция используется для получения данных датчика, которые затем могут быть отправлены получателю, например, через канал связи, такой как Telegram в нашем случае. Возвращаемая строка может быть отправлена в виде сообщения для предоставления информации о температуре и влажности в режиме реального времени.

 

const int ledPin = 12;

bool ledState = LOW;

const int relayPin = 5;

bool relayState = false;

Oпределение двух константа и их начальные состояния:

  1. ledPin определяется как 12, что указывает на то, что он подключен к выводу 12 GPIO.
    • ledState изначально установлено значение LOW, указывающее на то, что индикатор, подключенный к ledPin, изначально выключен.
  2. relayPin определяется как 5, что указывает на то, что он подключен к выводу 5 GPIO.
    • relayState изначально установлено значение false, указывающее на то, что реле, подключенное к relayPin, изначально находится в выключенном состоянии

Эти константы и их начальные состояния обычно используются в проектах Arduino или ESP8266 для управления светодиодами и реле. Вы можете изменить значения ledState иrelayState на HIGH или true, чтобы включить светодиод и реле соответственно, и снова установить их на LOW или false, чтобы выключить.

 

 void handleNewMessages(int numNewMessages) {

  Serial.println(«handleNewMessages»);

  Serial.println(String(numNewMessages));

В фрагменте кода это, начало функции с именем handleNewMessages. Эта функция принимает целочисленный параметр numNewMessages, который, вероятно, представляет количество полученных новых сообщений.

Внутри этой функции выполняются следующие действия:

  1. Он выводит «handleNewMessages» на последовательный монитор. Эта строка предназначена для отладки и указывает на начало обработки сообщений.
  2. Выводится значение, numNewMessages преобразованное в строку с помощью println(String(numNewMessages)). Эта строка также предназначена для отладки и используется для отображения количества новых сообщений, полученных на последовательном мониторе.

Эта функция является частью реализации Telegram-бота и используется для обработки входящих сообщений. В зависимости от остальной части кода, она, вероятно, содержит больше логики для обработки этих сообщений и ответа на них.

 

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, «Не авторизованный пользователь», «»);

      continue;

    }

   String text = bot.messages[i].text;

    Serial.println(text);

String from_name = bot.messages[i].from_name;

    Код является частью цикла обработки входящих сообщений в Telegram-боте. Вот что он делает:

  1. Цикл повторяет numNewMessages количество новых сообщений, которое указано в качестве входного параметра.
  2. Внутри цикла он извлекает chat_id из i-го сообщения, используя messages[i].chat_id. chat_id представляет идентификатор чата, связанный с сообщением.
  3. Он проверяет, не равно ли извлеченное chat_id значение предопределенному CHAT_ID. Если оно не равно, это означает, что пользователь является sendMessage методом. The message is «Не авторизованный пользователь» (Unauthorized user).
  4. Оператор continue используется для пропуска остальной части кода цикла для текущего сообщения и перехода.
  5. После проверки авторизации код извлекает текст сообщения с помощью messages[i].text и выводит его на последовательный монитор с помощью Serial.println(text).
  6. Он также извлекает from_name из messages[i].from_name. Это представляет имя отправителя сообщения. Однако, похоже, что код ничего не делает с этой информацией в предоставленном фрагменте.

В целом, этот код является частью цикла обработки сообщений для Telegram-бота и отвечает за проверку авторизации пользователей, протоколирование входящих сообщений и, возможно, их дальнейшую обработку на основе их содержимого.

 

 

if (text == «/start» || text == «hi»){

  String welcome = «Welcome! Выберите действие пожалуйста » +from_name+ «.\n»;

  welcome += «/LedOn : ВклЛед \n»;

  welcome += «/LedOff : ВыклЛед \n»;

  welcome += «/on : ВклРеле \n»;

  welcome += «/off : ВыклРеле \n»;

  welcome += «/state : Состояние Pin \n»;

  welcome += «/TempVla : ТемперВлажн. \n»;

    bot.sendMessage(chat_id, welcome, «Markdown»);

  }

 if (text == «/TempVla») { String readings = getReadings(); bot.sendMessage(chat_id, readings, «»); }

Этот фрагмент кода является частью логики обработки сообщений Telegram-бота. Он реагирует на конкретные сообщения пользователя, предоставляя различные наборы информации или действий.

Вот объяснение того, что делает этот код:

  1. Он проверяет, является ли входящее сообщение (text) либо «/ start», либо «hi». Это распространенный способ обработки начала разговора или приветствия от пользователя.
  2. Если сообщение совпадает с «/start» или «hi», оно подготавливает приветственное сообщение в переменной welcome. В сообщении указывается имя пользователя (from_name).
  3. welcome Сообщение содержит список доступных действий, из которых пользователь может выбрать. Эти действия представлены в виде серии текстовых строк, и каждая строка отформатирована с использованием формата «Markdown». Эти действия включают в себя включение или выключение светодиода, управление реле, проверку состояния контактов и получение показаний температуры и влажности.
  4. Затем sendMessage функция используется для отправки welcome сообщения в чат пользователя. Указывается формат «Markdown», указывающий на то, что сообщение может содержать форматирование в стиле Markdown.
  5. После этого выполняется еще одна условная проверка: если сообщение пользователя «/TempVla», оно вызывает функцию с именем getReadings() для получения показаний температуры и влажности. Функция возвращает эти показания в виде строки (readings), которая затем отправляется в чат пользователя с помощью sendMessage.

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

 

    if (text == «/on») {

      relayState = HIGH;

      digitalWrite(relayPin, relayState);

      bot.sendMessage(chat_id, «Реле включено», «»);

    }

    if (text == «/off») {

      relayState = LOW;

      digitalWrite(relayPin, relayState);

 

            bot.sendMessage(chat_id, «Реле выключено», «»);

    }

 

    if (text == «/LedOn») {

      bot.sendMessage(chat_id, «LED state set to ON», «»);

      ledState = HIGH;

      digitalWrite(ledPin, ledState);

    }

    if (text == «/LedOff») {

      bot.sendMessage(chat_id, «LED state set to OFF», «»);

      ledState = LOW;

      digitalWrite(ledPin, ledState);

    }

    if (text == «/state») {

      if (digitalRead(ledPin)){

        bot.sendMessage(chat_id, «LED is ON», «»);

      }

      else{

        bot.sendMessage(chat_id, «LED is OFF», «»);

      }

        if (digitalRead(relayPin)){

        bot.sendMessage(chat_id, «rele is ON», «»);

      }

      else{

        bot.sendMessage(chat_id, «rele is OFF», «»);

      }

    }

  }

}

Этот код обрабатывает различные пользовательские команды для управления различными аспектами устройства. Вот что делает каждая часть кода:

  1. Когда пользователь отправляет команду «/вкл.», код отвечает включением реле. Он устанавливает relayState значение HIGH и использует digitalWrite для активации реле. Кроме того, он отправляет сообщение в чат пользователя, указывающее, что ретрансляция теперь включена.
  2. Аналогично, когда пользователь отправляет команду «/выкл.», код отключает реле. Он устанавливает relayState значение LOW, деактивирует реле с помощью digitalWrite и отправляет пользователю сообщение, подтверждающее, что реле выключено.
  3. Когда пользователь отправляет «/LedOn», код включает светодиод. Он устанавливает ledState значение HIGH, активирует индикатор с помощью digitalWrite и уведомляет пользователя о том, что индикатор теперь включен.
  4. Для команды «/LedOff» код отключает светодиод. Он устанавливает ledState значение LOW, деактивирует индикатор с помощью digitalWrite и информирует пользователя о том, что индикатор выключен.
  5. Команда «/state» проверяет и сообщает о состоянии как светодиода, так и реле. Он использует digitalRead для определения текущего состояния этих компонентов и отправляет пользователю сообщения, указывающие, включены или выключены светодиод и реле.

Этот код, по сути, позволяет пользователю управлять светодиодом и реле через чат Telegram, а также предоставляет обратную связь о текущем состоянии этих компонентов по запросу.

 

 

 

void setup() {

  Serial.begin(115200);

 dht.begin();

 

  #ifdef ESP8266

    configTime(0, 0, «pool.ntp.org»);  

    client.setTrustAnchors(&cert);

  #endif

 

  pinMode(ledPin, OUTPUT);

  digitalWrite(ledPin, ledState);

 

  pinMode(relayPin,OUTPUT);

  digitalWrite(relayPin, relayState);

 

  WiFi.mode(WIFI_STA);

  WiFi.begin(ssid, password);

  #ifdef ESP32

    client.setCACert(TELEGRAM_CERTIFICATE_ROOT);

  #endif

  while (WiFi.status() != WL_CONNECTED) {

    delay(1000);

    Serial.println(«Connecting to WiFi..»);

  }

 

  Serial.println(WiFi.localIP());

 

  bot.sendMessage(CHAT_ID, «Я в сети», «»);

 

}

 

void loop()

{

  getReadings(); 

 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();

  }

}

 

В этой части кода мы инициализируем и настраиваем различные компоненты ESP8266 и Telegram-бота. Давайте разберем, что делает каждый раздел:

  1. void setup() { … }: Эта функция выполняется один раз при загрузке ESP8266. Она инициализирует и настраивает необходимые параметры.
    • begin(115200): Инициализирует последовательную связь для отладки и устанавливает скорость передачи данных в бодах равной 115200.
    • begin(): Инициализирует датчик DHT.
    • #ifdef ESP8266 … #endif: Этот блок кода условно скомпилирован для платформы ESP8266. Он устанавливает синхронизацию времени с сервером NTP и инициализирует привязки доверия сертификатов для безопасной связи.
    • pinMode(ledPin, OUTPUT): Настраивает ledPin вывод в качестве выходного для управления светодиодом. Для начального состояния установлено значение ledState.
    • pinMode(relayPin, OUTPUT): Настраивает relayPin в качестве выходного контакта для управления реле. Для начального состояния установлено значение relayState.
    • mode(WIFI_STA): Переводит ESP8266 в режим станции (клиентский режим) для подключения к сети Wi-Fi.
    • begin(ssid, password): Пытается подключиться к сети Wi-Fi с помощью предоставленных SSID и пароля. Ожидает, пока соединение не будет установлено.
    • #ifdef ESP32 … #endif: Условно компилирует этот раздел для ESP32. Он устанавливает корневой сертификат для безопасной связи.
    • Цикл ожидает установления соединения Wi-Fi, отображая «Подключение к Wi-Fi ..» на последовательном мониторе.
    • Как только соединение Wi-Fi установлено, он печатает локальный IP-адрес ESP8266.
    • Наконец, он отправляет указанному CHAT_ID через Telegram-бота сообщение, указывающее, что ESP8266 подключен к сети.
  2. void loop() { … }: Эта функция непрерывно выполняется после setup() функции.
    • getReadings(): Функция, которая считывает и форматирует данные датчика (температуру и влажность) и может отправлять их пользователю.
    • Код в if (millis() > lastTimeBotRan + botRequestDelay) блоке гарантирует, что бот запускается не слишком часто, чтобы избежать превышения лимитов скорости. Если указанная задержка прошла, бот проверяет наличие новых сообщений от Telegram-бота.
    • int numNewMessages = bot.getUpdates(bot.last_message_received + 1): Получает количество новых сообщений от бота Telegram. Он получает только те сообщения, которые еще не были обработаны.
    • Для обработки каждого нового сообщения одно за другим используется while цикл. Он вызывает handleNewMessages функцию для обработки сообщений и выполнения соответствующих действий.
    • После обработки всех новых сообщений lastTimeBotRan переменная обновляется, чтобы бот не запускался слишком часто.

В целом, этот код настраивает ESP8266, подключает его к Wi-Fi, инициализирует датчики и обрабатывает входящие сообщения Telegram от пользователей. Конкретные действия, выполняемые в ответ на сообщения пользователя, определены в handleNewMessages функции, которая не включена в этот фрагмент.

 

Перейдите на Форум для просмотра полного кода

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