#include <WiFi.h> // Подключаем библиотеку для работы с Wi-Fi
#include <WiFiClientSecure.h> // Подключаем библиотеку для безопасного соединения Wi-Fi (HTTPS)
#include <UniversalTelegramBot.h> // Подключаем библиотеку для работы с Telegram ботом
#define WIFI_SSID "Wokwi-GUEST" // Определяем имя сети Wi-Fi (SSID)
#define WIFI_PASSWORD "" // Определяем пароль сети Wi-Fi
#define BOT_TOKEN "8005275506:AAHkraeneluqJue5MtGwGLbbBOuFfHrf2sg" // Определяем токен Telegram бота
#define RED_PIN 27 // Определяем пин для красного светодиода (номер пина ESP32)
#define GREEN_PIN 26 // Определяем пин для зеленого светодиода (номер пина ESP32)
#define BLUE_PIN 25 // Определяем пин для синего светодиода (номер пина ESP32)
const int PIR = 14;
int motion = 0;
const unsigned long UPDATE_INTERVAL = 1000; // Определяем минимальное время между проверками новых сообщений от бота (в миллисекундах) //bot_mtbs -> UPDATE_INTERVAL
WiFiClientSecure secureClient; // Создаем объект для безопасного Wi-Fi соединения //secured_client -> secureClient
UniversalTelegramBot bot(BOT_TOKEN, secureClient); // Создаем объект бота, передавая токен и клиент //secured_client -> secureClient
unsigned long lastCheck; // Время последней проверки сообщений от бота //bot_lasttime -> lastCheck
void setup() {
Serial.begin(115200); // Инициализируем последовательный порт для отладки со скоростью 115200 бод
pinMode(RED_PIN, OUTPUT); // Настраиваем пин красного светодиода как выход (для управления светодиодом)
pinMode(GREEN_PIN, OUTPUT); // Настраиваем пин зеленого светодиода как выход (для управления светодиодом)
pinMode(BLUE_PIN, OUTPUT); // Настраиваем пин синего светодиода как выход (для управления светодиодом)
pinMode (PIR, INPUT);
digitalWrite(RED_PIN, 1); // Выключаем красный светодиод (1 - выключен, 0 - включен) // Предполагается использование светодиода с общим анодом
digitalWrite(GREEN_PIN, 1); // Выключаем зеленый светодиод (1 - выключен, 0 - включен)
digitalWrite(BLUE_PIN, 1); // Выключаем синий светодиод (1 - выключен, 0 - включен)
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // Подключаемся к Wi-Fi сети, используя SSID и пароль
secureClient.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Устанавливаем корневой сертификат для безопасного соединения с Telegram //secured_client -> secureClient
Serial.print("Подключение к Wi-Fi..."); // Выводим сообщение в последовательный порт для отладки
while (WiFi.status() != WL_CONNECTED) { // Ждем подключения к Wi-Fi
delay(500); // Пауза 500 миллисекунд (половина секунды)
Serial.print("."); // Выводим точку, показывая процесс подключения (визуальный индикатор)
}
Serial.println("WiFi подключён"); // Выводим сообщение об успешном подключении к Wi-Fi
Serial.print("IP-адрес: "); // Выводим сообщение
Serial.println(WiFi.localIP()); // Выводим IP адрес ESP32 (для проверки подключения)
configTime(0, 0, "pool.ntp.org"); // Настраиваем время с использованием NTP сервера (для получения точного времени)
while (time(nullptr) < 24 * 3600) { // Ждем получения времени (пока время не станет больше одного дня, 24 * 3600 секунд)
delay(100); // Пауза 100 миллисекунд
Serial.print("."); // Выводим точку, показывая процесс получения времени
}
Serial.println("Начинайте работать с чат-ботом."); // Сообщение о готовности к работе с ботом (система инициализирована)
}
void loop() {
motion = digitalRead(PIR);
if (millis() - lastCheck > UPDATE_INTERVAL) { // Если прошло достаточно времени с последней проверки //bot_lasttime -> lastCheck, BOT_MTBS -> UPDATE_INTERVAL
int msgCount = bot.getUpdates(bot.last_message_received + 1); // Получаем количество новых сообщений от бота, начиная с последнего обработанного сообщения + 1 //numNewMessages -> msgCount
if (msgCount) { // Если есть новые сообщения //numNewMessages -> msgCount
handleNewMessages(msgCount); // Обрабатываем новые сообщения, передавая их количество //numNewMessages -> msgCount
}
lastCheck = millis(); // Обновляем время последней проверки //bot_lasttime -> lastCheck
}
}
void handleNewMessages(int numMessages) { // Функция для обработки новых сообщений от бота //numNewMessages -> numMessages
for (int i = 0; i < numMessages; i++) { // Перебираем все новые сообщения (от 0 до количества новых сообщений) //numNewMessages -> numMessages
String chatID = bot.messages[i].chat_id; // Получаем ID чата, из которого пришло сообщение //chat_id -> chatID
String msgText = bot.messages[i].text; // Получаем текст сообщения //text -> msgText
msgText.toLowerCase(); // Преобразуем текст сообщения в нижний регистр (для удобства сравнения команд) //text -> msgText
String userName = bot.messages[i].from_name; // Получаем имя отправителя сообщения //from_name -> userName
if (userName == "") { // Если имя отсутствует (например, у бота) //from_name -> userName
userName = "Guest"; // Устанавливаем имя "Guest" (для сообщений без имени) //from_name -> userName
}
Serial.print("Получено сообщение от "); // Выводим сообщение в последовательный порт для отладки
Serial.print(userName); // Выводим имя отправителя //from_name -> userName
Serial.print(": "); // Выводим разделитель (для читаемости)
Serial.println(msgText); // Выводим текст сообщения //text -> msgText
if (msgText == "/currentstate") {
if (motion == 1) {
bot.sendMessage(chatID, "Движение было зафиксировано.", "");
motion = 0;
}
else {
bot.sendMessage(chatID, "Движения зафиксировано не было", "");
}
}
if (msgText == "/redon") { // Если получена команда "/redon" //text -> msgText
bot.sendMessage(chatID, "Красный свет включён.", ""); // Отправляем сообщение боту, подтверждая включение красного //chat_id -> chatID
digitalWrite(RED_PIN, 0); // Включаем красный светодиод (0 - включен, 1 - выключен) // Предполагается использование светодиода с общим анодом
digitalWrite(GREEN_PIN, 1); // Выключаем зеленый светодиод
digitalWrite(BLUE_PIN, 1); // Выключаем синий светодиод
}
if (msgText == "/greenon") { // Если получена команда "/greenon" //text -> msgText
bot.sendMessage(chatID, "Зелёный свет включён.", ""); // Отправляем сообщение боту, подтверждая включение зеленого //chat_id -> chatID
digitalWrite(RED_PIN, 1); // Выключаем красный светодиод
digitalWrite(GREEN_PIN, 0); // Включаем зеленый светодиод
digitalWrite(BLUE_PIN, 1); // Выключаем синий светодиод
}
if (msgText == "/blueon") { // Если получена команда "/blueon" //text -> msgText
bot.sendMessage(chatID, "Синий свет включён.", ""); // Отправляем сообщение боту, подтверждая включение синего //chat_id -> chatID
digitalWrite(RED_PIN, 1); // Выключаем красный светодиод
digitalWrite(GREEN_PIN, 1); // Выключаем зеленый светодиод
digitalWrite(BLUE_PIN, 0); // Включаем синий светодиод
}
if (msgText == "/yellowon") { // Если получена команда "/yellowon" //text -> msgText
bot.sendMessage(chatID, "Жёлтый свет включён.", ""); // Отправляем сообщение боту, подтверждая включение желтого //chat_id -> chatID
digitalWrite(RED_PIN, 0); // Включаем красный светодиод
digitalWrite(GREEN_PIN, 0); // Включаем зеленый светодиод
digitalWrite(BLUE_PIN, 1); // Выключаем синий светодиод
}
if (msgText == "/violeton") { // Если получена команда "/violeton" //text -> msgText
bot.sendMessage(chatID, "Фиолетовый свет включён.", ""); // Отправляем сообщение боту, подтверждая включение фиолетового //chat_id -> chatID
digitalWrite(RED_PIN, 0); // Включаем красный светодиод
digitalWrite(GREEN_PIN, 1); // Выключаем зеленый светодиод
digitalWrite(BLUE_PIN, 0); // Включаем синий светодиод
}
if (msgText == "/turquoiseon") { // Если получена команда "/turquoiseon" //text -> msgText
bot.sendMessage(chatID, "Бирюзовый свет включён.", ""); // Отправляем сообщение боту, подтверждая включение бирюзового //chat_id -> chatID
digitalWrite(RED_PIN, 1); // Выключаем красный светодиод
digitalWrite(GREEN_PIN, 0); // Включаем зеленый светодиод
digitalWrite(BLUE_PIN, 0); // Включаем синий светодиод
}
if (msgText == "/whiteon") { // Если получена команда "/whiteon" //text -> msgText
bot.sendMessage(chatID, "Белый свет включён.", ""); // Отправляем сообщение боту, подтверждая включение белого //chat_id -> chatID
digitalWrite(RED_PIN, 0); // Включаем красный светодиод
digitalWrite(GREEN_PIN, 0); // Включаем зеленый светодиод
digitalWrite(BLUE_PIN, 0); // Включаем синий светодиод
}
if (msgText == "/rgboff") { // Если получена команда "/rgboff" //text -> msgText
bot.sendMessage(chatID, "RGB-светодиод выключен.", ""); // Отправляем сообщение боту, подтверждая выключение //chat_id -> chatID
digitalWrite(RED_PIN, 1); // Выключаем красный светодиод
digitalWrite(GREEN_PIN, 1); // Выключаем зеленый светодиод
digitalWrite(BLUE_PIN, 1); // Выключаем синий светодиод
}
if (msgText == "/start") { // Если получена команда "/start" //text -> msgText
String welcome = "Управление RGB-светодиодом:\n"; // Формируем приветственное сообщение
welcome += "/redon, /greenon, /blueon, /yellowon\n"; // Добавляем список доступных команд в сообщение
welcome += "/violeton, /turquoiseon, /whiteon, /rgboff"; // Добавляем список доступных команд в сообщение
bot.sendMessage(chatID, welcome); // Отправляем приветственное сообщение боту //chat_id -> chatID
}
}
}