Взлом PIR-датчика движения с помощью ESP8266 и HLK-PM03
В этом проекте мы модифицируем коммерческий датчик движения (питающийся от сетевого напряжения) с помощью ESP8266, чтобы записывать данные при каждом обнаружении движения. Данные будут отправляться в Node-RED с использованием протокола связи MQTT. ESP8266 будет получать питание через фазный выходной провод датчика движения с помощью AC/DC преобразователя HLK-PM03.
Предварительные требования
Прежде чем приступить к этому проекту, мы рекомендуем ознакомиться со следующими ресурсами:
Необходимые компоненты
Вот список компонентов, необходимых для этого проекта:
ESP8266-01 – ознакомьтесь с обзором Лучшие платы разработки ESP8266 Wi-Fi
Последовательный адаптер ESP8266-01 (для загрузки кода в ESP8266)
Hi-Link HLK-PM03 (для преобразования сетевого напряжения в постоянное 3.3В)
Предохранитель с медленным срабатыванием (200 мА)
Raspberry Pi (для размещения Node-RED и MQTT-брокера) – ознакомьтесь с обзором Лучшие наборы Raspberry Pi
Вы можете использовать приведенные выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Обзор проекта
Этот проект разделен на три части:
Сборка схемы
Написание и загрузка кода ESP8266
Создание потока Node-RED
На следующем изображении показан общий обзор проекта, который мы будем создавать.
Датчик движения
Мы взломаем коммерческий датчик движения, внутри которого достаточно места для размещения ESP-01 и модуля AC/DC преобразователя HLK-PM03. Мы купили наш датчик движения за $5 в местном магазине.
Когда PIR-датчик обнаруживает движение, из красного фазного провода поступает питание, которое может включить лампу или устройство. Ваш датчик движения должен иметь аналогичную схему подключения на крышке или в инструкции по эксплуатации.
В нашем проекте выходной нагрузкой датчика движения является модуль AC/DC преобразователя HLK-PM03, который будет питать ESP8266.
Связанная статья: Питание ESP8266 от сетевого напряжения переменного тока с помощью преобразователя HLK-PM03
Модуль AC/DC преобразователя HLK-PM03 обеспечивает напряжение 3.3В от 110В или 220В переменного тока. Это делает его идеальным для питания ESP8266 от сетевого напряжения.
Таким образом, при обнаружении движения питание поступает на ESP8266. ESP8266 может выполнять задачи в течение всего времени, пока датчик движения активирован.
Возможно, вам потребуется отрегулировать длительность срабатывания датчика, чтобы у ESP8266 было достаточно времени для выполнения своих задач. На датчике должна быть ручка для регулировки времени (и еще одна для регулировки чувствительности к освещенности).
В нашем примере, каждый раз когда ESP8266 включается, он запускает скетч, который отправляет информацию в Node-RED через MQTT для записи даты и времени обнаружения движения.
Вместо отправки информации в Node-RED вы можете выполнять другие задачи, такие как:
Отправлять электронное письмо с предупреждением об обнаружении движения;
Отправлять уведомления на ваш смартфон.
Эти задачи можно легко выполнить с помощью IFTTT.
1. Сборка схемы
На следующей принципиальной схеме показана цепь для данного проекта.
Снимите крышку PIR-датчика движения. Внутри должно быть три провода: фаза вход, нейтраль и фаза выход. Выполните следующие шаги:
Подключите фазу вход (коричневый) и нейтраль (синий) к датчику движения
Подключите нейтраль (синий) и фазу выход (красный) ко входу HLK-PM03
Рекомендуется добавить предохранитель с медленным срабатыванием непосредственно перед преобразователем HLK-PM03 и конденсатор на выходе.
Примечание
Если вы используете ESP8266, который постоянно запитан от HLK-PM03, мы рекомендуем использовать эту схему защиты.
HLK-PM03 выдает 3.3В и GND. Они подключаются к выводам VCC и GND ESP8266 для его питания.
Мы собрали схему HLK-PM03 и ESP8266 на небольшой макетной плате для экономии места. Мы также добавили несколько штыревых разъемов для установки ESP8266-01. Таким образом, вы можете подключать и отключать плату каждый раз, когда вам нужно загрузить новый код.
Рекомендуемая статья: Распиновка ESP8266 и справочник по GPIO
2. Написание и загрузка кода ESP8266
Мы будем программировать ESP8266 с помощью Arduino IDE. Для загрузки кода в ESP8266 сначала необходимо установить дополнение ESP8266, если вы этого еще не сделали (Установка платы ESP8266 в Arduino IDE).
Вам также потребуется установить библиотеку PubSubClient для создания MQTT-клиента с ESP8266. Библиотека PubSubClient предоставляет клиент для выполнения простого обмена сообщениями по модели публикация/подписка с сервером, поддерживающим MQTT (по сути, позволяет ESP8266 общаться с Node-RED).
Нажмите здесь, чтобы скачать библиотеку PubSubClient. В папке загрузок должен появиться файл .zip
Распакуйте файл .zip, и вы получите папку pubsubclient-master
Переименуйте папку из pubsubclient-master в pubsubclient
Переместите папку pubsubclient в папку libraries вашей установки Arduino IDE
Затем скопируйте следующий код в Arduino IDE, но пока не загружайте его. Вам нужно внести несколько изменений, чтобы он заработал.
Вам нужно отредактировать код, указав свои SSID, пароль и IP-адрес MQTT-брокера (IP-адрес Raspberry Pi).
/*********
Rui Santos
Complete project details at https://randomnerdtutorials.com
*********/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Replace with your SSID, password and MQTT broker IP address
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
const char* mqtt_server = "REPLACE_WITH_YOUR_MQTT_BROKER_IP";
//For example
//const char* mqtt_server = "192.168.1.144";
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
digitalWrite(BUILTIN_LED, HIGH);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
while (!client.connected()) {
reconnect();
}
Serial.print("Motion Detected");
// Publish MQTT message
String mqttMessage = "Motion Detected";
client.publish("esp/pir", mqttMessage.c_str());
}
void loop() {
client.loop();
}
Укажите свои сетевые учетные данные
Вам нужно указать свои сетевые учетные данные в следующих строках.
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Укажите IP-адрес вашего MQTT-брокера
Вам также нужно указать IP-адрес вашего MQTT-брокера.
const char* mqtt_server = "REPLACE_WITH_YOUR_MQTT_BROKER_IP";
Чтобы узнать IP-адрес вашего MQTT-брокера, его сначала нужно настроить. Мы используем брокер Mosquitto, размещенный на Raspberry Pi. Следуйте следующим ресурсам, если вы еще этого не сделали:
Как работает код
Код очень простой. Он просто публикует сообщение в топик. Для тестирования мы также включаем встроенный светодиод каждый раз при включении ESP8266. Это делается в функции setup(), потому что она выполняется только один раз (при обнаружении движения и пока ESP8266 получает питание).
void setup() {
pinMode(BUILTIN_LED, OUTPUT); // BUILTIN_LED pin as an output
digitalWrite(BUILTIN_LED, HIGH);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
while (!client.connected()) {
reconnect();
}
Serial.print("Motion Detected");
// Publish MQTT message
String mqttMessage = "Motion Detected";
client.publish("esp/pir", mqttMessage.c_str());
}
Загрузка кода
После изменения кода с вашими сетевыми учетными данными вы можете загрузить его на плату. Для загрузки кода в ESP8266-01 вам потребуется последовательный адаптер или FTDI программатор.
3. Создание потока Node-RED
Перед созданием потока на вашем Raspberry Pi должны быть установлены:
Импорт потока Node-RED
Чтобы импортировать предоставленный поток Node-RED, перейдите в репозиторий GitHub или нажмите на изображение ниже, чтобы увидеть исходный файл, и скопируйте предоставленный код.
Далее, в окне Node-RED в правом верхнем углу выберите меню и перейдите в Import > Clipboard.
Затем вставьте предоставленный код и нажмите Import.
Вот импортированный поток. Он принимает MQTT-сообщения от ESP8266 и записывает время каждого обнаружения движения.
Мы также добавили две кнопки для очистки и обновления журнала.
Панель управления Node-RED
После внесения всех необходимых изменений нажмите кнопку Deploy, чтобы сохранить все изменения.
Теперь ваше приложение Node-RED готово. Чтобы получить доступ к панели управления Node-RED и увидеть, как выглядит ваше приложение, откройте любой браузер в вашей локальной сети и введите:
http://Your_RPi_IP_address:1880/ui
Демонстрация
Теперь вы можете протестировать свой проект. При каждом обнаружении движения ESP8266 включается и отправляет сообщение через MQTT в Node-RED.
Если вы перейдете на панель управления Node-RED, вы увидите все записи о том, когда было обнаружено движение. Ваше приложение должно выглядеть как на следующем изображении.
Панель управления показывает последнее время обнаружения движения и все предыдущие записи журнала. У вас также есть возможность обновить журнал и очистить журнал. Обратите внимание, что очистка журнала необратима.
Заключение
В этом проекте было показано, как можно взломать коммерческий датчик движения с помощью ESP8266, чтобы сделать его умнее. Вы можете легко запитать ESP8266 с помощью HLK-PM03 от сетевого напряжения и создать компактную схему, которая поместится в датчик движения.
При каждом обнаружении движения ESP8266 включается и выполняет задачу. В данном случае он публикует MQTT-сообщение для записи времени обнаружения движения, но вы можете легко написать код для выполнения любой другой задачи.
Надеемся, что этот проект оказался для вас полезным. Если вам понравился этот проект, вас также могут заинтересовать следующие ресурсы: