- Управление через Telegram
- Уведомления о сработке датчиков движения
- Уведомления о сработке пожарных датчиков (температурных/дымовых/огневых датчиков)
- Отслеживание температуры окружающего воздуха (датчик DS18b20) и построение графиков на open.monitoring.online
- Отслеживание связи с WiFi, проверка наличия выхода в интернет, перезагрузка модема/роутера при потере интернет-соединения
- Поддержка настраиваемого количества пользователей, выбор количества "админов" среди них
- Запись в EEPROM-память важных настроек, возможность их изменения без перепрошивки
- Обновление прошивки через ArduinoOTA (в локальной сети) и через Telegram (на любом расстоянии)
- Нам понадобится:
- Краткий обзор настроек:
- Настройка сервиса OpenMonitoring для работы с проектом:
- Печатная плата и подключение компонентов:
- Как это работает?
- Примечание:
- Известные ошибки:
- ESP32
- Созданный телеграм бот (инструкцию по созданию и настройке можно найти здесь)
- Релейный модуль(-ли)
- Датчики движения (инфракрасного или иного типа)
- Пожарные датчики (читайте соответствующий раздел)
- Несколько номиналов резисторов (4.7 кОм для DS18b20 и несколько для делителя напряжения (читайте о подключении пожарных датчиков))
- Наличие стабилизированного постоянного питания
- Постоянное наличие интернет-соединения
- Температурный датчик DS18b20 (опционально)
В каталоге с проектом вы можете увидеть файл passwords_example.txt, который содержит все самые важные и конфиденциальные дефайны. Остальная их часть находиться в файле Signalization.ino. Чтобы проект успешно скомпилировался и работал, вам нужно:
- Заполнить все конфиденциальные данные в дефайнах файла
passwords_example.txt(ssid и password, BOT_TOKEN и так далее...) вашими значениями - Переименовать файл из
passwords_example.txtвpasswords.txt. Это позволит проекту видеть ваши настройки и успешно их использовать
#define ssid "" //имя WiFi сети
#define password "" //пароль от WiFi сети
#define BOT_TOKEN "" //идентификатор бота в телеге (получаем у BotFather после создания)
Необходимо заменить значения по умолчанию своими данными:
#define FIRE_SENSOR1 39 //пин, к которому подключен 1-й датчик дыма
#define FIRE_SENSOR2 36 //пин, к которому подключен 2-й датчик дыма
#define RELAY1 4 //пин управления первым реле
#define RELAY2 18 //пин управления вторым реле
#define RELAY3 17 //пин управления третьим реле
#define RELAY4 16 //пин управления четвертым реле
#define DATCH_HOME 22 //пин, к которому подключен домашний датчик движения
#define DATCH_1 23 //пин, к которому подключен первый датчик движения
#define DATCH_2 25 //пин, к которому подключен второй датчик движения
#define DATCH_3 26 //пин, к которому подключен третий датчик движения
#define ThermoPin 32 //пин, к которому подключен датчик температуры
#define USERS_NUM 2 //кол-во пользователей (с начала общего списка), которым будет показана часть меню с управлением реле, от которых можно обновлять прошивку и т.д.
#define FIRE_RELE_NUM 1 //номер реле, через которое питаются датчики дыма (нумерация с 1)
#define MODEM_RELE_NUM 2 //номер реле, через которое питается роутер/модем (нумерация с 1)
Остальные дефайны можно оставить по умолчанию, либо же изменить, руководствуясь приведенными в коде комментриями.
-
- Делаем новый дефайн, содержащий номер пина, к которому подключен этот датчик (например
#define FIRE_SENSOR3 39)
- Делаем новый дефайн, содержащий номер пина, к которому подключен этот датчик (например
-
- Добавляем его в соответствующий список, например, для датчиков движения, в
const byte d_pins[]
- Добавляем его в соответствующий список, например, для датчиков движения, в
-
- Если добавляем реле, то придумываем ему имя и вписываем его в
const char* r_names[]
- Если добавляем реле, то придумываем ему имя и вписываем его в
-
- если это датчик движения, то имя вписываем в
const char* d_names[]
- если это датчик движения, то имя вписываем в
-
- Во вкладке AlarmString, руководствуясь комментариями (добавляем новый case в конструкцию), придумываем текст, который будет содержаться в сообщении о сработке датчиков дыма и движения
Для уменьшения количества датчиков/реле действуем по аналогичному принципу в обратную сторону.
- id пользователей добавляются в
const String Users[], id пользователя можно узнать например через него или него или через другого подобного бота. - Количество админов задается дефайном:
#define USERS_NUM 2 //кол-во пользователей (с начала общего списка), которым будет показана часть меню с управлением реле, от которых можно обновлять прошивку и т.д.
- Для того, чтобы иметь возможноть удаленно отслеживать графики изменения температуры окружающего воздуха (датчик DS18), а также време без сети (см. ниже), нам нужно зарегистрироваться на cервисе Open-Monitoring.online, а так же получить оттуда некоторые данные. Подробно процесс регистрации и создания нового устройства описан здесь, рекомендую на этапе создания параметров создать дополнительные, по 1-2 каждого типа (целые, с плавающей точкой и строковые). Их можно скрыть от видимости и они не будут мешать, а если не взять такой запас, в будущих обновлениях, возможно, вы не сможете использовать новые функции. Созданные параметры должны выглядеть следующим образом:
После создания нового контроллера на сервере, раскрываем меню действий с ним -> "о контроллере" и копируем поле с заголовком "Код для отправки GET-запросом".
Где после cid и key будут идти ваши уникальные значения, позволяющие добавлять, с помощью http запроса, данные на сервер.
Копируем эту строку, вплость до &p1= во вкладку HTTP.ino, а именно в эти кавычки: String req = "";
Если вы создавали все параметры как на фото выше (порядок, имена и т.д.), то остальные параметры в этой вкладке можно не трогать. Иначе вам придется немного видоизменить поля сборки запроса.
На странице open.monitoring.online выполняем следующие шаги:
- На стартовой странице сайта, в левой части экрана нажимаем на название нашего ранее созданного контроллера
- Кнопка
Журнал событий - В правой верхней части экрана ищем кнопку:

- Жмем
Создать событие - Название вписываем любое
- Тип ->
Таймаут - В следующее поле вписываем время ожидание, т.е., если в течении этого времени контроллер ни разу не свяжется с сервером (не отправит новые данные), то событие сработает
- Вписываем текст, который будет записываться в журнал событий
- Включаем уведомления на почту
- Указываем email, на который будут приходить письма (Важно! Следите, чтобы отправитель не попал в спам или другое место, из которго вам не будут приходить уведомления о новом письме)
- Вписываем сообщение, которое будет приходить в письме, при потере связи с контроллером
- Вписываем сообщение, которое будет приходить в письме, при восстановлении связи с контроллером
- Нажимаем
Создать
Уведомления настроены! Если что-то работает не правильно, проверяем наличие отправителя в папке спама, или включаем уведомиления о входящих сообщениях.
- Компоненты подключаются подобным образом (для контактов, установленных по умолчанию):
Питание пожарных датчиков осуществляется через нормально замкнутый контакт реле. Номер (в нумерации по массиву ) того реле, через которое питаются датчики, должен быть указан в:
#define FIRE_RELE_NUM 1 //номер реле, через которое питаются датчики дыма (нумерация с 1)
Аналогичная история получается и с питание модема, если вы хотите осуществлять его программный сброс.
По данной схеме можно развести печатную плату, либо заказав ее у китайцев, либо изготовив ее наколенным методом, например ЛУТ.
Note
Подключение пожарных датчиков к микроконтроллеру, возможность их использования в проекте, а так же их напряжения питания различаются для каждой модели датчиков!
- В зависимости от типа пожарных датчиков, у них может быть разное напряжение питания, а так же тип сигнала, который они выдают при сработке. Если у вас датчик с "сухим контактом", то вам повезло. В вашем случае достаточно, чтобы датчик размыкал, например, пин 3.3V и контакт на esp. Для некоторых других датчиков, например для ИП212-45, есть возможность регистрировать срабатывания, подогнав напряжение сработки под максимум 3.3 - 3.2V (максимальное входное напрыяжение на пины esp32) с помощью делителя напряжения (вот тут можно рассчитать сопротивления для вашего делителя).
- В итоге суть колхоза заключается в получении четкой разницы в напряжении, подаваемом на контакт микроконтроллера, для случаев тревоги и обычной работы. Для исходного кода разница должна быть такова, чтобы
digitalRead()выдавалfalseпри работе иtrueдля сработки датчика. Да, придется поколхозить. Да, придется просчитывать все сопротивления вашей модели датчика. Да, придется покопаться в документациях к вашему датчику, чтобы узнать его тип и пригодность к участию в проекте. Но не в этом ли счастье настоящего радиолюбителя?) - Возможно перестроение кода, для других изменение сигнала при тревоги датчика, например для извещателей с изменяющимся током. Смотрите комментарии в коде и раздел Как это работает?.
- Информация скоро обновится.
Important
- Проект написан одним энтузиастом, переписывался полностью 7 раз (каждый раз, когда навыки программирования создателя становились на уровень выше). Проект имеет известные и еще не обнаруженные баги и ошибки, список известных можно найти в соответствующем разделе, а вами обнаруженные можно написать в
Issuesили сразу на почту alekseyzh5@gmail.com. Конечно, автор не несет никакой ответственности за работоспособность вашего устройства и за последствия, к которым может привести использование проекта. Рекомендуется тщательно протестировать собранный проект в разных условиях, прежде чем возлагать на него какую-нибудь ответственность. При возниконовении проблем, большая просьба, не выливать негатив в адрес автора, а с пониманием отнестись к его несовершенству. Проект открыт для вашихIssuesиPull Request'ов! Буду рад каждому вашему вкладу в развитие проекта! Спасибо, что помогаете развивать и улучшать его!
- v0.5 - Пре-релизная версия, имеет несколько функций в разработке
- v1.0 - Релизная версия. Все основные функции реализованы
Те баги программы, которые известны автору (он обязательно приступит к их исправлению при первой возможности):
- ...


