В данном коде ESP8266 подключается к датчику DHT22 для измерения температуры и влажности, а также к Telegram-боту для отправки показаний датчика и управления двумя устройствами: реле и светодиодной лампочкой (LED).
Подключаем датчик 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>
- #include <WiFiClientSecure.h>: Эта библиотека используется для создания безопасных клиентских подключений по Wi-Fi. Ее часто используют для выполнения безопасных HTTP-запросов или подключения к службам, которым требуется безопасное соединение, таким как Telegram Bot API при использовании HTTPS.
- #include <UniversalTelegramBot.h>: Это библиотека для работы с API Telegram Bot. Он предназначен для обеспечения простого способа взаимодействия Telegram ботов на платформе Arduino или ESP8266 / ESP32.
- #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 «;
- BOTtoken: Это директива препроцессора (#define), используемая для определения константы с именем «BOTtoken». Значением, присвоенным этой константе, должен быть токен вашего Telegram-бота. Вам необходимо заменить «Тут токен вашего бота телеграм» на токен вашего реального Telegram-бота.
- 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;
- #ifdef ESP8266 и #endif: Эти директивы препроцессора используются для условного включения определенного кода при компиляции для платы ESP8266. Если вы используете плату ESP8266, будет включен код между #ifdef ESP8266 и #endif. Если вы не используете плату ESP8266, этот код будет исключен.
- X509List cert(TELEGRAM_CERTIFICATE_ROOT);: Этот код определяет объект cert класса X509List что связан с обработкой сертификатов X.509. Конструктор TELEGRAM_CERTIFICATE_ROOT, который, является константой или макрокомандой, определенной в другом месте вашего кода. Он используется для настройки сертификата для безопасного соединения.
- WiFiClientSecure client;: Этот код определяет объект client класса WiFiClientSecure. Этот объект используется для создания безопасного соединения с серверами Telegram. WiFiClientSecure Класс специфичен для платформ ESP8266 и ESP32 способен устанавливать безопасные соединения по Wi-Fi.
- UniversalTelegramBot bot(BOTtoken, client);: Эта строка создает экземпляр UniversalTelegramBot класса, который используется для взаимодействия с API Telegram Bot. Он принимает два аргумента: токен вашего бота (BOTtoken) и client объект для обработки соединения. Эта строка инициализирует bot объект.
- int botRequestDelay = 1000;: Эта строка определяет целочисленную переменную botRequestDelaybotRequestDelay и устанавливает ее равной 1000 миллисекундам (1 секунда). Это задержка между запросами к серверу Telegram.
- 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 и возвращает форматированную строку, содержащую показания датчика. Вот краткое описание того, что делает каждая часть функции:
- float temperature, humidity;: Объявляет две переменные с плавающей запятой для хранения показаний температуры и влажности.
- temperature = dht.readTemperature();: Считывает температуру с датчика DHT и присваивает ее temperature переменной.
- humidity = dht.readHumidity();: Считывает влажность с датчика DHT и присваивает ей значение humidity переменной.
- String message = «Temperature: » + String(temperature) + » ºC \n»;: Создает строковую переменную с именем message для хранения показаний датчика. Она форматирует показания температуры и добавляет их в строку сообщения вместе с единицей измерения «ºC» (градусы Цельсия) и символом перевода строки.
- message += «Humidity: » + String(humidity) + » % \n»;: Добавляет значение влажности к строке сообщения вместе с единицей измерения «%» и символом новой строки.
- return message;: Возвращает форматированное сообщение, содержащее показания температуры и влажности в виде строки.
Эта функция используется для получения данных датчика, которые затем могут быть отправлены получателю, например, через канал связи, такой как Telegram в нашем случае. Возвращаемая строка может быть отправлена в виде сообщения для предоставления информации о температуре и влажности в режиме реального времени.
const int ledPin = 12;
bool ledState = LOW;
const int relayPin = 5;
bool relayState = false;
Oпределение двух константа и их начальные состояния:
- ledPin определяется как 12, что указывает на то, что он подключен к выводу 12 GPIO.
- ledState изначально установлено значение LOW, указывающее на то, что индикатор, подключенный к ledPin, изначально выключен.
- 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, который, вероятно, представляет количество полученных новых сообщений.
Внутри этой функции выполняются следующие действия:
- Он выводит «handleNewMessages» на последовательный монитор. Эта строка предназначена для отладки и указывает на начало обработки сообщений.
- Выводится значение, 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-боте. Вот что он делает:
- Цикл повторяет numNewMessages количество новых сообщений, которое указано в качестве входного параметра.
- Внутри цикла он извлекает chat_id из i-го сообщения, используя messages[i].chat_id. chat_id представляет идентификатор чата, связанный с сообщением.
- Он проверяет, не равно ли извлеченное chat_id значение предопределенному CHAT_ID. Если оно не равно, это означает, что пользователь является sendMessage методом. The message is «Не авторизованный пользователь» (Unauthorized user).
- Оператор continue используется для пропуска остальной части кода цикла для текущего сообщения и перехода.
- После проверки авторизации код извлекает текст сообщения с помощью messages[i].text и выводит его на последовательный монитор с помощью Serial.println(text).
- Он также извлекает 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-бота. Он реагирует на конкретные сообщения пользователя, предоставляя различные наборы информации или действий.
Вот объяснение того, что делает этот код:
- Он проверяет, является ли входящее сообщение (text) либо «/ start», либо «hi». Это распространенный способ обработки начала разговора или приветствия от пользователя.
- Если сообщение совпадает с «/start» или «hi», оно подготавливает приветственное сообщение в переменной welcome. В сообщении указывается имя пользователя (from_name).
- welcome Сообщение содержит список доступных действий, из которых пользователь может выбрать. Эти действия представлены в виде серии текстовых строк, и каждая строка отформатирована с использованием формата «Markdown». Эти действия включают в себя включение или выключение светодиода, управление реле, проверку состояния контактов и получение показаний температуры и влажности.
- Затем sendMessage функция используется для отправки welcome сообщения в чат пользователя. Указывается формат «Markdown», указывающий на то, что сообщение может содержать форматирование в стиле Markdown.
- После этого выполняется еще одна условная проверка: если сообщение пользователя «/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», «»);
}
}
}
}
Этот код обрабатывает различные пользовательские команды для управления различными аспектами устройства. Вот что делает каждая часть кода:
- Когда пользователь отправляет команду «/вкл.», код отвечает включением реле. Он устанавливает relayState значение HIGH и использует digitalWrite для активации реле. Кроме того, он отправляет сообщение в чат пользователя, указывающее, что ретрансляция теперь включена.
- Аналогично, когда пользователь отправляет команду «/выкл.», код отключает реле. Он устанавливает relayState значение LOW, деактивирует реле с помощью digitalWrite и отправляет пользователю сообщение, подтверждающее, что реле выключено.
- Когда пользователь отправляет «/LedOn», код включает светодиод. Он устанавливает ledState значение HIGH, активирует индикатор с помощью digitalWrite и уведомляет пользователя о том, что индикатор теперь включен.
- Для команды «/LedOff» код отключает светодиод. Он устанавливает ledState значение LOW, деактивирует индикатор с помощью digitalWrite и информирует пользователя о том, что индикатор выключен.
- Команда «/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-бота. Давайте разберем, что делает каждый раздел:
- 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 подключен к сети.
- 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 функции, которая не включена в этот фрагмент.
Перейдите на Форум для просмотра полного кода