#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include "DHTesp.h"
#include <ESP32Servo.h>
#include <Keypad.h>
// Настройки WiFi и Telegram
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define BOT_TOKEN "7978061436:AAHKc3d100Lg4JBkv4QjUOQZjXMMibXebAs"
#define BOT_MTBS 1000
// Пины подключения устройств
#define PIR 13
#define LDR_PIN 34
#define chsen4 35
#define ECHO_PIN 14
#define TRIG_PIN 12
#define SPEAKER_PIN 23
#define DHT_PIN 22
// Пины RGB светодиода
#define pinG 26
#define pinR 27
#define pinB 25
const int servoPin = 32;
// Настройка матричной клавиатуры
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','H'},
{'4','5','6','T'},
{'7','8','9','O'},
{'*','0','=','!'}
};
byte rowPins[ROWS] = {19, 21, 17, 16};
byte colPins[COLS] = {15, 2, 0, 4};
String passwordlog = "HTO!";// 🚨Это пароль🚨
String password;
// Флаги состояния системы
bool alarmActive = true;
bool distanceTriggered = false;
bool pirTriggered = false;
bool flagPIR = false;
bool CH4 = false;
bool light;
bool last_CH4_state = false;
bool servoST = false;
bool lightST = false;
bool manualMode = false;
bool buzzerState = false;
bool alarmSounding = false; // Флаг тревожной пищалки
bool alarmBlocked = false; // Флаг блокировки при тревоге
// Переменные для хранения цвета RGB
int lastRed = HIGH;
int lastGreen = HIGH;
int lastBlue = LOW;
// Данные с датчиков
int val = 0;
int distance;
int t, h;
// Таймеры
unsigned long bot_lasttime;
// Инициализация компонентов
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
Servo servo;
DHTesp dhtSensor;
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
// Клавиатуры для Telegram бота
String keyboardMain = "[[\"📊Доклад📊\", \"🌤Погода🌤\"], [\"⚙️Периферия⚙️\"]]";
String keyboardPeripheryAuto = "[[\"🔄Смена режима🔄\", \"🎨Смена цвета🎨\"], [\"🔙Назад🔙\"]]";
String keyboardPeripheryManual = "[[\"📈Опрос📈\", \"🎛️Управление🎛️\"], [\"🔄Смена режима🔄\"], [\"🔙Назад🔙\"]]";
String keyboardColors = "[[\"🔴Красный🔴\", \"🟢Зеленый🟢\"], [\"🔵Синий🔵\", \"🟡Желтый🟡\"], [\"🟣Фиолетовый🟣\", \"⚪Белый⚪\"], [\"🔙Периферия🔙\"]]";
String PollKeyboard = "[[\"🌡Температура🌡\", \"💧Влажность💧\"], [\"📡Ультразвук📡\", \"☁️Газ☁️\"], [\"💡Освещенность💡\", \"🏃➡️Движение🏃➡️\"], [\"🔊Пищалка🔊\", \"🪟Окно🪟\"], [\"🚨Сигнализация🚨\", \"💡Светодиод💡\"], [\"👨💼Режим👨💼\"], [\"🔙Периферия🔙\"]]";
String chat_id = "";
// Функция получения клавиатуры для меню Периферия
String getPeripheryKeyboard() {
if (manualMode) {
return keyboardPeripheryManual;
} else {
return keyboardPeripheryAuto;
}
}
// Установка цвета светодиода
void setLEDColor(bool red, bool green, bool blue) {
lastRed = red;
lastGreen = green;
lastBlue = blue;
}
// Применение сохраненного цвета
void applySavedColor() {
digitalWrite(pinR, lastRed);
digitalWrite(pinG, lastGreen);
digitalWrite(pinB, lastBlue);
}
// Получение клавиатуры управления
String getControlKeyboard() {
if (manualMode) {
String windowButton = servoST ? "[\"🔴Закрыть окно🔴\"]" : "[\"🟢Открыть окно🟢\"]";
String lightButton = lightST ? "[\"🔴Свет ВЫКЛ🔴\"]" : "[\"🟢Свет ВКЛ🟢\"]";
String buzzerButton = buzzerState ? "[\"🔴Пищалка ВЫКЛ🔴\"]" : "[\"🟢Пищалка ВКЛ🟢\"]";
String alarmButton = alarmActive ? "[\"🔴Сигнализация ВЫКЛ🔴\"]" : "[\"🟢Сигнализация ВКЛ🟢\"]";
return "[" +
windowButton + "," +
lightButton + "," +
buzzerButton + "," +
alarmButton + "," +
"[\"🎨Цвет света🎨\"]," +
"[\"🔙Периферия🔙\"]]";
} else {
return "[[\"🔄Смена режима🔄\", \"🎨Цвет света🎨\"], [\"🔙Периферия🔙\"]]";
}
}
// Получение описания погоды на основе температуры и влажности
String getWeatherDescription(int temperature, int humidity) {
if (temperature >= 15 && temperature <= 25 && humidity >= 40 && humidity <= 70) {
return "🌤Температура и влажность в комфортном диапазоне. Идеальный день для прогулок.🌤";
}
else if (temperature < 15 && humidity < 40) {
return "❄️Низкая температура сочетается с низкой влажностью (сухо). Оденьтесь теплее, пейте воду для увлажнения изнутри.❄️";
}
else if (temperature > 25 && humidity < 40) {
return "🔥Высокая температура и сухой воздух. Высок риск перегрева. Пейте много воды, носите головной убор.🔥";
}
else if (temperature < 15 && humidity > 70) {
return "💨Низкая температура усугубляется высокой влажностью (сыро). Одевайтесь теплее, отдавайте предпочтение непромокаемой и ветрозащитной одежде.💨";
}
else if (temperature > 25 && humidity > 70) {
return "💦Высокая температура и высокая влажность (душно). Нагрузка на организм максимальна. Ограничьте активность, пейте больше воды.💦";
}
else if (humidity >= 40 && humidity <= 70 && (temperature < -30 || temperature > 30)) {
return "⚠️Влажность комфортная, но температура экстремальная. Одевайтесь по погоде крайне тщательно.⚠️";
}
else {
return "📊Умеренные условия. Одевайтесь по погоде.📊";
}
}
// Чтение расстояния с ультразвукового датчика
int readDistanceCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}
void handleNewMessages(int numNewMessages) {
for (int i = 0; i < numNewMessages; i++) {
chat_id = bot.messages[i].chat_id;
String text = bot.messages[i].text;
String nn = "\n";
String from_name = bot.messages[i].from_name;
if (from_name == "") from_name = "Guest";
if(text == "📊Доклад📊"){
String dokl = "🗂Параметры🗂:" + nn;
dokl += "🌡Температура🌡: " + String(t) + "℃" + nn;
dokl += "💧Влажность💧: " + String(h) + "%" + nn;
dokl += "📡Ультразвук📡: " + String(distance) + " см" + nn;
dokl += "☁️Газ☁️: " + String(CH4 ? "🔴ВНИМАНИЕ ГАЗ🔴" : "🟢ЧИСТО🟢") + nn;
dokl += "💡Свет💡: " + String(light ? "🌚ТЕМНО🌚" : "☀️СВЕТЛО☀️") + nn;
dokl += "🏃➡️Движение🏃➡️: " + String(flagPIR ? "🔴ОБНАРУЖЕНО🔴" : "🟢ЧИСТО🟢") + nn + nn;
dokl += "📡Периферия📡:" + nn;
dokl += "🚨Сигнализация🚨: " + String(alarmActive ? "🔴АКТИВНА🔴" : "🟢ВЫКЛ🟢") + nn;
dokl += "🪟Окно🪟: " + String(servoST ? "🟢ОТКРЫТО🟢" : "🔴ЗАКРЫТО🔴") + nn;
dokl += "💡Светодиод💡: " + String(lightST ? "🟢ВКЛ🟢" : "🔴ВЫКЛ🔴") + nn;
dokl += "🔊Пищалка🔊: " + String(buzzerState ? "🟢ВКЛ🟢" : "🔴ВЫКЛ🔴") + nn;
dokl += "🚨Тревога: " + String(alarmSounding ? "🔴АКТИВНА🔴" : "🟢НЕТ🟢") + nn;
dokl += "👨💼Режим👨💼: " + String(manualMode ? "🟢РУЧНОЙ🟢" : "🔴АВТО🔴") + nn;
bot.sendMessageWithReplyKeyboard(chat_id, dokl, "", keyboardMain, true);
}
else if(text == "🌤Погода🌤"){
String weatherInfo = getWeatherDescription(t, h);
String weatherReport = "📈Анализ погоды📈:" + nn;
weatherReport += "🌡Температура🌡: " + String(t) + "℃" + nn;
weatherReport += "💧Влажность💧: " + String(h) + "%" + nn + nn;
weatherReport += weatherInfo;
bot.sendMessageWithReplyKeyboard(chat_id, weatherReport, "", keyboardMain, true);
}
else if(text == "⚙️Периферия⚙️"){
String peri = "🛠Управление периферией🛠:" + nn;
peri += "Текущий режим: " + String(manualMode ? "🟢РУЧНОЙ🟢" : "🔴АВТО🔴") + nn;
peri += "Выберите действие:";
bot.sendMessageWithReplyKeyboard(chat_id, peri, "", getPeripheryKeyboard(), true);
}
else if(text == "🎛️Управление🎛️" || text == "🔙Управление🔙"){
String peri = "🎛️Управление устройствами🎛️:" + nn;
peri += "💡Свет💡: " + String(lightST ? "🟢ВКЛ🟢" : "🔴ВЫКЛ🔴") + nn;
peri += "🪟Окно🪟: " + String(servoST ? "🟢ОТКРЫТО🟢" : "🔴ЗАКРЫТО🔴") + nn;
peri += "🔊Пищалка🔊: " + String(buzzerState ? "🟢ВКЛ🟢" : "🔴ВЫКЛ🔴") + nn;
peri += "🚨Сигнализация🚨: " + String(alarmActive ? "🟢ВКЛ🟢" : "🔴ВЫКЛ🔴") + nn;
peri += "🚨Тревога: " + String(alarmSounding ? "🔴АКТИВНА🔴" : "🟢НЕТ🟢") + nn;
peri += "👨💼Режим👨💼: " + String(manualMode ? "🟢РУЧНОЙ🟢" : "🔴АВТО🔴") + nn;
bot.sendMessageWithReplyKeyboard(chat_id, peri, "", getControlKeyboard(), true);
}
else if(text == "📈Опрос📈" || text == "🔙Опрос🔙"){
String peri = "📈Опрос устройств и датчиков📈:" + nn;
peri += "Нажмите на кнопку для получения текущих параметров:";
bot.sendMessageWithReplyKeyboard(chat_id, peri, "", PollKeyboard, true);
}
else if(text == "🔄Смена режима🔄"){
manualMode = !manualMode;
String modeMessage = manualMode ? "🟢Режим изменен на РУЧНОЙ🟢" : "🔴Режим изменен на АВТОМАТИЧЕСКИЙ🔴";
bot.sendMessageWithReplyKeyboard(chat_id, modeMessage, "", getPeripheryKeyboard(), true);
}
else if(text == "🎨Смена цвета🎨" || text == "🎨Цвет света🎨"){
bot.sendMessageWithReplyKeyboard(chat_id, "🎨Выберите цвет светодиода🎨:", "", keyboardColors, true);
}
else if((text == "🟢Свет ВКЛ🟢" || text == "🔴Свет ВЫКЛ🔴") && manualMode){
lightST = !lightST;
if (lightST) {
applySavedColor();
bot.sendMessageWithReplyKeyboard(chat_id, "💡Свет ВКЛЮЧЕН💡", "", getControlKeyboard(), true);
} else {
digitalWrite(pinR, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinB, LOW);
bot.sendMessageWithReplyKeyboard(chat_id, "💡Свет ВЫКЛЮЧЕН💡", "", getControlKeyboard(), true);
}
}
else if((text == "🟢Открыть окно🟢" || text == "🔴Закрыть окно🔴") && manualMode){
if (text == "🟢Открыть окно🟢") {
servo.write(180);
servoST = true;
bot.sendMessageWithReplyKeyboard(chat_id, "🟢Окно ОТКРЫТО🟢", "", getControlKeyboard(), true);
} else {
servo.write(0);
servoST = false;
bot.sendMessageWithReplyKeyboard(chat_id, "🔴Окно ЗАКРЫТО🔴", "", getControlKeyboard(), true);
}
}
else if((text == "🟢Пищалка ВКЛ🟢" || text == "🔴Пищалка ВЫКЛ🔴") && manualMode){
buzzerState = !buzzerState;
if (buzzerState) {
tone(SPEAKER_PIN, 1000);
bot.sendMessageWithReplyKeyboard(chat_id, "🔊Пищалка ВКЛЮЧЕНА🔊", "", getControlKeyboard(), true);
} else {
noTone(SPEAKER_PIN);
// Если была тревожная пищалка - снимаем блокировку
if (alarmSounding) {
alarmSounding = false;
alarmBlocked = false;
}
bot.sendMessageWithReplyKeyboard(chat_id, "🔊Пищалка ВЫКЛЮЧЕНА🔊", "", getControlKeyboard(), true);
}
}
else if((text == "🟢Сигнализация ВКЛ🟢" || text == "🔴Сигнализация ВЫКЛ🔴") && manualMode){
alarmActive = !alarmActive;
if (alarmActive) {
bot.sendMessageWithReplyKeyboard(chat_id, "🚨Сигнализация ВКЛЮЧЕНА🚨", "", getControlKeyboard(), true);
} else {
bot.sendMessageWithReplyKeyboard(chat_id, "🚨Сигнализация ВЫКЛЮЧЕНА🚨", "", getControlKeyboard(), true);
}
}
else if(text == "🔴Красный🔴"){
setLEDColor(HIGH, LOW, LOW);
if(lightST && manualMode){
applySavedColor();
}
bot.sendMessageWithReplyKeyboard(chat_id, "🔴Цвет изменен на КРАСНЫЙ🔴", "", keyboardColors, true);
}
else if(text == "🟢Зеленый🟢"){
setLEDColor(LOW, HIGH, LOW);
if(lightST && manualMode){
applySavedColor();
}
bot.sendMessageWithReplyKeyboard(chat_id, "🟢Цвет изменен на ЗЕЛЕНЫЙ🟢", "", keyboardColors, true);
}
else if(text == "🔵Синий🔵"){
setLEDColor(LOW, LOW, HIGH);
if(lightST && manualMode){
applySavedColor();
}
bot.sendMessageWithReplyKeyboard(chat_id, "🔵Цвет изменен на СИНИЙ🔵", "", keyboardColors, true);
}
else if(text == "🟡Желтый🟡"){
setLEDColor(HIGH, HIGH, LOW);
if(lightST && manualMode){
applySavedColor();
}
bot.sendMessageWithReplyKeyboard(chat_id, "🟡Цвет изменен на ЖЕЛТЫЙ🟡", "", keyboardColors, true);
}
else if(text == "🟣Фиолетовый🟣"){
setLEDColor(HIGH, LOW, HIGH);
if(lightST && manualMode){
applySavedColor();
}
bot.sendMessageWithReplyKeyboard(chat_id, "🟣Цвет изменен на ФИОЛЕТОВЫЙ🟣", "", keyboardColors, true);
}
else if(text == "⚪Белый⚪"){
setLEDColor(HIGH, HIGH, HIGH);
if(lightST && manualMode){
applySavedColor();
}
bot.sendMessageWithReplyKeyboard(chat_id, "⚪Цвет изменен на БЕЛЫЙ⚪", "", keyboardColors, true);
}
else if(text == "🌡Температура🌡"){
String message = "🌡Температура🌡:" + nn;
message += "Текущая температура: " + String(t) + "℃" + nn;
bot.sendMessageWithReplyKeyboard(chat_id, message, "", PollKeyboard, true);
}
else if(text == "💧Влажность💧"){
String message = "💧Влажность💧:" + nn;
message += "Текущая влажность: " + String(h) + "%" + nn;
bot.sendMessageWithReplyKeyboard(chat_id, message, "", PollKeyboard, true);
}
else if(text == "📡Ультразвук📡"){
String message = "📡Ультразвуковой датчик📡:" + nn;
message += "Расстояние: " + String(distance) + " см" + nn;
bot.sendMessageWithReplyKeyboard(chat_id, message, "", PollKeyboard, true);
}
else if(text == "☁️Газ☁️"){
String message = "☁️Датчик газа☁️:" + nn;
message += "Состояние: " + String(CH4 ? "🔴ОБНАРУЖЕН ГАЗ🔴" : "🟢ЧИСТО🟢") + nn;
bot.sendMessageWithReplyKeyboard(chat_id, message, "", PollKeyboard, true);
}
else if(text == "💡Освещенность💡"){
String message = "💡Датчик освещенности💡:" + nn;
message += "Освещенность: " + String(light ? "🌚ТЕМНО🌚" : "☀️СВЕТЛО☀️") + nn;
bot.sendMessageWithReplyKeyboard(chat_id, message, "", PollKeyboard, true);
}
else if(text == "🏃➡️Движение🏃➡️"){
String message = "🏃➡️Датчик движения🏃➡️:" + nn;
message += "Состояние: " + String(flagPIR ? "🔴ОБНАРУЖЕНО ДВИЖЕНИЕ🔴" : "🟢ЧИСТО🟢") + nn;
bot.sendMessageWithReplyKeyboard(chat_id, message, "", PollKeyboard, true);
}
else if(text == "🔊Пищалка🔊"){
String message = "🔊Пищалка🔊:" + nn;
message += "Состояние: " + String(buzzerState ? "🟢ВКЛЮЧЕНА🟢" : "🔴ВЫКЛЮЧЕНА🔴") + nn;
bot.sendMessageWithReplyKeyboard(chat_id, message, "", PollKeyboard, true);
}
else if(text == "🪟Окно🪟"){
String message = "🪟Окно (сервопривод)🪟:" + nn;
message += "Состояние: " + String(servoST ? "🟢ОТКРЫТО🟢" : "🔴ЗАКРЫТО🔴") + nn;
bot.sendMessageWithReplyKeyboard(chat_id, message, "", PollKeyboard, true);
}
else if(text == "🚨Сигнализация🚨"){
String message = "🚨Система сигнализации🚨:" + nn;
message += "Состояние: " + String(alarmActive ? "🟢АКТИВНА🟢" : "🔴ВЫКЛЮЧЕНА🔴") + nn;
message += "Тревога: " + String(alarmSounding ? "🔴АКТИВНА (БЛОКИРОВКА)🔴" : "🟢НЕТ🟢") + nn;
bot.sendMessageWithReplyKeyboard(chat_id, message, "", PollKeyboard, true);
}
else if(text == "💡Светодиод💡"){
String message = "💡RGB светодиод💡:" + nn;
message += "Состояние: " + String(lightST ? "🟢ВКЛЮЧЕН🟢" : "🔴ВЫКЛЮЧЕН🔴") + nn;
message += "Цвет: ";
if (lastRed == HIGH && lastGreen == LOW && lastBlue == LOW) message += "🔴КРАСНЫЙ🔴";
else if (lastRed == LOW && lastGreen == HIGH && lastBlue == LOW) message += "🟢ЗЕЛЕНЫЙ🟢";
else if (lastRed == LOW && lastGreen == LOW && lastBlue == HIGH) message += "🔵СИНИЙ🔵";
else if (lastRed == HIGH && lastGreen == HIGH && lastBlue == LOW) message += "🟡ЖЕЛТЫЙ🟡";
else if (lastRed == HIGH && lastGreen == LOW && lastBlue == HIGH) message += "🟣ФИОЛЕТОВЫЙ🟣";
else if (lastRed == HIGH && lastGreen == HIGH && lastBlue == HIGH) message += "⚪БЕЛЫЙ⚪";
else message += "⚫ВЫКЛЮЧЕН⚫";
bot.sendMessageWithReplyKeyboard(chat_id, message, "", PollKeyboard, true);
}
else if(text == "👨💼Режим👨💼"){
String message = "👨💼Режим работы системы👨💼:" + nn;
message += "Текущий режим: " + String(manualMode ? "🟢РУЧНОЙ🟢" : "🔴АВТОМАТИЧЕСКИЙ🔴") + nn;
bot.sendMessageWithReplyKeyboard(chat_id, message, "", PollKeyboard, true);
}
else if(text == "🔙Периферия🔙"){
String peri = "🛠Управление периферией🛠:" + nn;
peri += "Текущий режим: " + String(manualMode ? "🟢РУЧНОЙ🟢" : "🔴АВТО🔴") + nn;
peri += "Выберите действие:";
bot.sendMessageWithReplyKeyboard(chat_id, peri, "", getPeripheryKeyboard(), true);
}
else if(text == "🔙Назад🔙"){
bot.sendMessageWithReplyKeyboard(chat_id, "📋Главное меню📋:", "", keyboardMain, true);
}
else if (text == "/start") {
String welcome = "Вас приветствует бот Умного дома команды *Кибер пельмени*, " + from_name + ".\n";
welcome += "Используйте кнопки для управления:";
bot.sendMessageWithReplyKeyboard(chat_id, welcome, "Markdown", keyboardMain, true);
}
}
}
void setup() {
Serial.begin(115200);
Serial.println();
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
servo.attach(servoPin, 500, 2400);
servo.write(0);
pinMode(chsen4, INPUT);
pinMode(PIR, INPUT);
pinMode(LDR_PIN, INPUT);
pinMode(pinR, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(SPEAKER_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.print("Connecting to Wifi SSID ");
Serial.print(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.print("\nWiFi connected. IP address: ");
Serial.println(WiFi.localIP());
configTime(0, 0, "pool.ntp.org");
time_t now = time(nullptr);
while (now < 24 * 3600) {
delay(100);
now = time(nullptr);
}
Serial.println("🔴Сигнализация АКТИВИРОВАНА");
Serial.println("Пароль для активации/деактивации: " + passwordlog);
}
void fastPasswordInputActivation() {
Serial.println("\n🔐 АКТИВАЦИЯ СИГНАЛИЗАЦИИ");
Serial.print("Введите пароль: ");
password = "";
unsigned long passwordStartTime = millis();
bool passwordEntered = false;
while (!passwordEntered && (millis() - passwordStartTime < 10000)) {
char key = keypad.getKey();
if (key != NO_KEY) {
if (key == '*') {
password = "";
Serial.println();
Serial.print("Введите пароль заново: ");
}
else if (key == '=') {
passwordEntered = true;
Serial.println();
Serial.println("Проверка пароля...");
if (password == passwordlog) {
Serial.println("✅ ПАРОЛЬ ВЕРНЫЙ! Сигнализация АКТИВИРОВАНА.");
alarmActive = true;
distanceTriggered = false;
Serial.println("Ожидание срабатывания ультразвукового датчика...");
bot.sendMessage(chat_id, "📡ПАРОЛЬ ВЕРНЫЙ! Сигнализация АКТИВИРОВАНА.📡", "");
} else {
Serial.println("❌ НЕВЕРНЫЙ ПАРОЛЬ!");
}
}
else {
password += key;
Serial.print("*");
}
}
delay(50);
}
if (!passwordEntered) {
Serial.println();
Serial.println("⏰ ВРЕМЯ ВЫШЛО!");
}
Serial.println("Режим активации завершен");
pirTriggered = false;
}
void fastPasswordInputDeactivation() {
// Проверяем, не заблокирована ли система тревогой
if (alarmBlocked) {
Serial.println("🚨 СИСТЕМА ЗАБЛОКИРОВАНА! ТРЕВОЖНАЯ ПИЩАЛКА АКТИВНА!");
Serial.println("Отключите пищалку через Telegram в ручном режиме");
distanceTriggered = false;
return;
}
Serial.println("\n🚨 ОБНАРУЖЕНО ПРИБЛИЖЕНИЕ!");
Serial.print("Введите пароль: ");
password = "";
unsigned long passwordStartTime = millis();
bool passwordEntered = false;
while (!passwordEntered && (millis() - passwordStartTime < 10000)) {
char key = keypad.getKey();
if (key != NO_KEY) {
if (key == '*') {
password = "";
Serial.println();
Serial.print("Введите пароль заново: ");
}
else if (key == '=') {
passwordEntered = true;
Serial.println();
Serial.println("Проверка пароля...");
if (password == passwordlog) {
Serial.println("✅ ПАРОЛЬ ВЕРНЫЙ! Сигнализация ОТКЛЮЧЕНА.");
alarmActive = false;
distanceTriggered = false;
servo.attach(servoPin, 500, 2400);
noTone(SPEAKER_PIN);
bot.sendMessage(chat_id, "📡ПАРОЛЬ ВЕРНЫЙ! Сигнализация ОТКЛЮЧЕНА.📡", "");
Serial.println("⚠️ Сигнализация ВЫКЛЮЧЕНА. Для активации нажмите =");
} else {
Serial.println("❌ НЕВЕРНЫЙ ПАРОЛЬ! АКТИВАЦИЯ ТРЕВОЖНОЙ ПИЩАЛКИ!");
tone(SPEAKER_PIN, 1000);
alarmSounding = true;
alarmBlocked = true; // Блокируем систему
buzzerState = true;
bot.sendMessage(chat_id, "🚨Сработала сигнализация!🚨", "");
Serial.println("🚨Отключите пищалку через Telegram🚨");
}
}
else {
password += key;
Serial.print("*");
}
}
delay(50);
}
if (!passwordEntered) {
Serial.println();
Serial.println("⏰ ВРЕМЯ ВЫШЛО!");
tone(SPEAKER_PIN, 1000);
alarmSounding = true;
alarmBlocked = true; // Блокируем систему
buzzerState = true;
bot.sendMessage(chat_id, "🚨Сработала сигнализация!🚨", "");
Serial.println("🚨Отключите пищалку через Telegram🚨");
}
distanceTriggered = false;
Serial.println("Режим деактивации завершен");
}
void loop() {
// Проверяем блокировку перед обработкой ультразвука
if (distanceTriggered && alarmActive && !alarmBlocked) {
fastPasswordInputDeactivation();
}
else if (pirTriggered && !alarmActive && !alarmBlocked) {
fastPasswordInputActivation();
}
// Чтение данных с датчиков
t = dhtSensor.getTemperature();
h = dhtSensor.getHumidity();
CH4 = !digitalRead(chsen4);
light = digitalRead(LDR_PIN);
distance = readDistanceCM();
// Автоматическое управление светом
if (!manualMode) {
if (light) {
applySavedColor();
if (!lightST) {
lightST = true;
if (chat_id != "") {
bot.sendMessage(chat_id, "🟢Светодиод включен (стало темно)🟢", "");
}
}
} else {
if (lightST) {
lightST = false;
digitalWrite(pinR, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinB, LOW);
if (chat_id != "") {
bot.sendMessage(chat_id, "🔴Светодиод выключен (стало светло)🔴", "");
}
}
}
}
// Обработка газа
if (!manualMode) {
if (CH4 && !last_CH4_state) {
servo.attach(servoPin, 500, 2400);
servo.write(180);
servoST = true;
Serial.println("ОБНАРУЖЕН ГАЗ! Окно открыто!");
if (chat_id != "") {
bot.sendMessage(chat_id, "🚨🚨🚨ВНИМАНИЕ! Обнаружена утечка газа! Окно открыто🚨🚨🚨", "");
}
}
else if (!CH4 && last_CH4_state) {
servo.attach(servoPin, 500, 2400);
servo.write(0);
servoST = false;
Serial.println("Газ устранен, окно закрыто");
if (chat_id != "") {
bot.sendMessage(chat_id, "✅СИТУАЦИЯ НОРМАЛИЗОВАЛАСЬ! Утечка газа устранена! Окно закрыто✅", "");
}
}
}
last_CH4_state = CH4;
// Обработка датчика движения PIR
val = digitalRead(PIR);
if(val == 1 && !flagPIR){
Serial.println("PIR: Обнаружено движение!");
if (chat_id != "") {
bot.sendMessage(chat_id, "📡Обнаружено движение!📡", "");
}
flagPIR = true;
}
if(val == 0 && flagPIR){
flagPIR = false;
}
// Обработка ультразвукового датчика (только если нет блокировки)
if(distance < 200 && alarmActive && !distanceTriggered && !alarmBlocked){
Serial.println("Ультразвук: Обнаружено приближение! Расстояние: " + String(distance) + " см");
distanceTriggered = true;
}
// Обработка сообщений Telegram бота
if (millis() - bot_lasttime > BOT_MTBS) {
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
if (numNewMessages) {
handleNewMessages(numNewMessages);
}
bot_lasttime = millis();
}
// Обработка нажатий на клавиатуре
char key = keypad.getKey();
if(key == '=' && !alarmActive && !pirTriggered && !alarmBlocked){
Serial.println("Запрос активации сигнализации...");
pirTriggered = true;
}
// Вывод статуса системы в Serial
Serial.println("=== СТАТУС ===");
Serial.println("Сигнализация: " + String(alarmActive ? "🔴АКТИВНА🔴" : "🟢ВЫКЛ🟢"));
Serial.println("Тревога: " + String(alarmSounding ? "🔴АКТИВНА (БЛОКИРОВКА)🔴" : "🟢НЕТ🟢"));
Serial.println("PIR: " + String(val ? "🔴ДВИЖЕНИЕ🔴" : "🟢НЕТ🟢"));
Serial.println("Газ: " + String(CH4 ? "🔴ОБНАРУЖЕН🔴" : "🟢НЕТ🟢"));
Serial.println("Расстояние: " + String(distance) + " см");
Serial.println("Режим: " + String(manualMode ? "🟢РУЧНОЙ🟢" : "🔴АВТО🔴"));
if (alarmBlocked) {
Serial.println("🚨Отключите пищалку через Telegram🚨");
}
Serial.println("====================");
delay(100);
}Датчик расстояния
Клавиатура
Датчик освещённости
Сервопривод
Датчик газа
Датчик движения
Буззер
Светодиод
🚨🚨🚨ВНИМАНИЕ!🚨🚨🚨
Для работы оповещений вставьте chat id в 86 строку кода
или нажмите старт в ТГ боте чтобы chat id записался сам.
ТГ бот: @cyberpelmeny_bot
Пароль от дома: НТО!
Примечание:
Пароль смотри в строке 42.
Для ввода пароля при активации
сигнализации зажмите =
пока не напишется в мониторе
порта о вводе пароля !!!!!