Введение
Уличные светильники играют важную роль в обеспечении безопасности и комфорта на улицах. В данном проекте представлена умная система освещения, управляемая с помощью Telegram бота. С использованием Arduino и дополнительных компонентов, таких как PIR-датчик движения и датчик температуры и влажности DHT22, этот проект предоставляет возможность удаленного управления и мониторинга состояния уличного светильника.
Ключевые особенности проекта
Управление через Telegram бота:
Благодаря интеграции с Telegram ботом, пользователь может управлять светильником и получать информацию о его состоянии через удобный интерфейс мессенджера.
Датчики для автоматического режима:
PIR-датчик движения используется для определения наличия людей и включения светильника в автоматическом режиме.
Датчик температуры и влажности:
Датчик DHT22 предоставляет информацию о текущей температуре и влажности, что может быть полезным для мониторинга климата вокруг светильника.
Ручное управление и режим авто:
Пользователь может переключать светильник между ручным и автоматическим режимами работы.
Обновление программы через Telegram:
Реализована возможность обновления программы уличного светильника по запросу пользователя через Telegram бота.
Описание работы программы
Инициализация и подключение:
Программа начинает с подключения к Wi-Fi сети и инициализации необходимых библиотек и компонентов.
Обновление через Telegram:
Пользователь может запустить процесс обновления программы, отправив команду «/update». Это позволяет обеспечить легкость внесения изменений в программу.
Управление светильником:
Пользователь может включать и выключать светильник, а также выбирать между ручным и автоматическим режимами.
Мониторинг состояния:
Пользователь может запросить текущую температуру и влажность, а также получить информацию о текущем состоянии светильника.
Обработка датчиков:
PIR-датчик отслеживает движение, включая светильник при обнаружении людей. Датчик DHT22 предоставляет данные о температуре и влажности вокруг.
Цикл обработки сообщений:
Программа постоянно мониторит новые сообщения от Telegram бота, обрабатывая команды пользователя и отвечая на них.
Код (скетч)
/* Прoект= уличный светильник */
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
#include <Adafruit_Sensor.h>
#ifdef ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266httpUpdate.h>
#include <DHT.h>
#define DHTPIN 2 // Определите контакт, к которому подключен ваш датчик DHT22
#define DHTTYPE DHT22 // Измените это значение на DHT11, если вы используете этот датчик
DHT dht(DHTPIN, DHTTYPE);
// Вставьте сюда свои учетные данные сети-----------------------------------------------
const char* ssid = "ВАШ ssid ";
const char* password = "ВАШ password";
const char* updateURL = "ВАШ updateURL, ПРИМЕР - https://androidchik.ru/";
// Запускаем бот-------------------------------------------------------------------------
#define BOTtoken "ВАШ BOTtoken"; // Вставляем токен бота.
//Ваш чат ID
#define CHAT_ID "ВАШ CHAT_ID";
//----------------------------------------------------------------------
#ifdef ESP8266
X509List cert(TELEGRAM_CERTIFICATE_ROOT);
#endif
//------------------------------------------------------
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
//-------------------------------------------
// Каждую секунду проверяет новые сообщения
int botRequestDelay = 1000;
unsigned long lastTimeBotRan;
// Запрос показаний датчика dht22 и запись их в переменную типа String--------------------------------
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;
}
//Определение пинов------------------------------
const int pirPin = 4; // Пин, к которому подключено реле
const int LedPin = 12; // Пин, к которому подключено pir
int pirState = LOW;// sensor pir
bool control = false; // Переменная для отслеживания ручного управления
//-----------------------------------------------------
// Задаем действия при получении новых сообщений
void handleNewMessages(int numNewMessages) {
Serial.println("handleNewMessages");
Serial.println(String(numNewMessages));
// Получение новых сообщений из чата бота
// Проверка каждого нового сообщения
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;
//Приветствие бота и выбор действий
if (text == "/start" || text == "Привет" || text == "Салам") {
String welcome = "Салам " + from_name + ".\n";
welcome += "/Auto : Режим авто \n";
welcome += "/Manual : Режим ручной \n";
welcome += "/lampOn : Вкл Свет \n";
welcome += "/lampOff : Вык Свет \n";
welcome += "/TempH : Температура \n";
welcome += "/State : Состояние \n";
welcome += "/update : Обновление ПО \n";
bot.sendMessage(chat_id, welcome, "Markdown");
}
// Получение и Проверка команд с телеграм
if (text == "/TempH" || text == "Покажи температуру" || text == "Температура") { String readings = getReadings(); bot.sendMessage(chat_id, readings, ""); }
if (text == "/Auto" || text == "Автоматический режим")
{
control = false;
bot.sendMessage(chat_id, "Перешел в автоматический режим", "");
}
else if (text == "/Manual" || text == "Ручной режим")
{
control = true;
bot.sendMessage(chat_id, "Перешел в ручной режим", "");
}
else if (text == "/lampOn" || text == "Включи свет" && control) {
digitalWrite(LedPin, LOW);
bot.sendMessage(chat_id, "Свет включен", "");
}
else if (text == "/lampOff" || text == "Отключи свет" && control) {
digitalWrite(LedPin, HIGH);
bot.sendMessage(chat_id, "Свет выключен", "");
}
//Обнавление через телеграм чат----------------------------------------
if (text == "/update") {
bot.sendMessage(chat_id, "Начато обновление встроенного ПО", "");
t_httpUpdate_return ret = ESPhttpUpdate.update(client, updateURL);
// t_httpUpdate_return ret = ESPhttpUpdate.update(client, "server", 80, "file.bin");
switch (ret) {
case HTTP_UPDATE_FAILED:
bot.sendMessage(chat_id, "Не удалось обновить встроенное ПО", "");
break;
case HTTP_UPDATE_NO_UPDATES:
bot.sendMessage(chat_id, "Прошивка уже обновлена", "");
break;
case HTTP_UPDATE_OK:
bot.sendMessage(chat_id, "Успешное обновление встроенного ПО", "");
break;
}
} else {
bot.sendMessage(chat_id, "Команда не распознана", "");
}
//Состояние выполняемой программы бота
if (text == "/State" || text == "Состояние") {
if (control == false) {
bot.sendMessage(chat_id, "В автоматическом режиме", "");
}
else {
bot.sendMessage(chat_id, "В ручном режиме", "");
}
if (digitalRead(LedPin)) {
bot.sendMessage(chat_id, "Лампочка не светит", "");
}
else {
bot.sendMessage(chat_id, "Лампочка светит", "");
}
//Проверка состояние датчика температуры-------------------------------------------------
float t = dht.readTemperature();
float h = dht.readHumidity();
if (!isnan(t) && !isnan(h)){
bot.sendMessage(chat_id, "Датчик темпреатуры и влажности работает исправно", "");
}
else{
bot.sendMessage(chat_id, "Датчик температуры и флажности не работает исправно или не подключен", "");
}
}
}
}
void controlSensor() {
if (!control) {
pirState = digitalRead(pirPin);
if (pirState == HIGH) {
digitalWrite(LedPin, LOW);
}
else {
digitalWrite(LedPin, HIGH);
}
delay(1000);
}
//bot.sendMessage(CHAT_ID, "Движение обнаружено!", "");
}
void setup() {
Serial.begin(115200);
dht.begin();// Запуск датчика dht
ArduinoOTA.begin();//Запуск загрузка по воздуху
//ESPhttpUpdate.setClientTimeout(2000);
//---Запрос времени и сертификата-Telegram--------------------------------
#ifdef ESP8266
configTime(0, 0, "pool.ntp.org"); // получаем всемирное координированное время (UTC) через NTP
client.setTrustAnchors(&cert); // Получаем сертификат api.telegram.org
#endif
//---Инициализация пинов---------------------------
pinMode(LedPin, OUTPUT);// Инициализация пина как OUTPUT
digitalWrite(LedPin, HIGH);
pinMode(pirPin, INPUT); // Инициализация пина как INPUT
//--------------- Подключаемся к Wi-Fi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
#ifdef ESP32
client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Добавляем корневой сертификат для api.telegram.org
#endif
while (WiFi.status() != WL_CONNECTED) {
Serial.println("Connecting to WiFi..");
delay(1000);
}
// Выводим ай пи вайфай подключение
Serial.println(WiFi.localIP());
bot.sendMessage(CHAT_ID, "Я в сети", "");
}
void loop()
{
//--------------------------------------------------------
WiFiClient client;
//ArduinoOTA.handle();//Обновление по вздуху
//MDNS.update();
getReadings();//Функция Запрос показаний датчика pir
controlSensor();//Функция Запрос показаний датчика dht22
//--------Обработки сообщений в программе-----------------------
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();
}
}
Заключение
Этот проект демонстрирует, как можно создать умный уличный светильник с использованием платформы Arduino и интеграции с Telegram. Пользователи могут не только управлять светильником, но и получать важную информацию о погоде и состоянии окружающей среды в реальном времени. Данный проект может быть дополнен дополнительными функциональностями и доработками в зависимости от потребностей пользователя.