Взлом PIR-датчика движения с помощью ESP8266 и HLK-PM03

В этом проекте мы модифицируем коммерческий датчик движения (питающийся от сетевого напряжения) с помощью ESP8266, чтобы записывать данные при каждом обнаружении движения. Данные будут отправляться в Node-RED с использованием протокола связи MQTT. ESP8266 будет получать питание через фазный выходной провод датчика движения с помощью AC/DC преобразователя HLK-PM03.

Взлом PIR-датчика движения с помощью ESP8266

Предварительные требования

Прежде чем приступить к этому проекту, мы рекомендуем ознакомиться со следующими ресурсами:

Необходимые компоненты

Вот список компонентов, необходимых для этого проекта:

Вы можете использовать приведенные выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Обзор проекта

Этот проект разделен на три части:

  1. Сборка схемы

  2. Написание и загрузка кода ESP8266

  3. Создание потока Node-RED

На следующем изображении показан общий обзор проекта, который мы будем создавать.

Обзор проекта ESP8266 PIR-датчик движения HLK-PM03

Датчик движения

Мы взломаем коммерческий датчик движения, внутри которого достаточно места для размещения ESP-01 и модуля AC/DC преобразователя HLK-PM03. Мы купили наш датчик движения за $5 в местном магазине.

PIR-датчик движения

Когда PIR-датчик обнаруживает движение, из красного фазного провода поступает питание, которое может включить лампу или устройство. Ваш датчик движения должен иметь аналогичную схему подключения на крышке или в инструкции по эксплуатации.

Схема подключения PIR-датчика движения

В нашем проекте выходной нагрузкой датчика движения является модуль AC/DC преобразователя HLK-PM03, который будет питать ESP8266.

Hi-Link HLK-PM03

Связанная статья: Питание ESP8266 от сетевого напряжения переменного тока с помощью преобразователя HLK-PM03

Модуль AC/DC преобразователя HLK-PM03 обеспечивает напряжение 3.3В от 110В или 220В переменного тока. Это делает его идеальным для питания ESP8266 от сетевого напряжения.

Таким образом, при обнаружении движения питание поступает на ESP8266. ESP8266 может выполнять задачи в течение всего времени, пока датчик движения активирован.

Возможно, вам потребуется отрегулировать длительность срабатывания датчика, чтобы у ESP8266 было достаточно времени для выполнения своих задач. На датчике должна быть ручка для регулировки времени (и еще одна для регулировки чувствительности к освещенности).

Регулировка освещенности и таймера датчика движения

В нашем примере, каждый раз когда ESP8266 включается, он запускает скетч, который отправляет информацию в Node-RED через MQTT для записи даты и времени обнаружения движения.

Вместо отправки информации в Node-RED вы можете выполнять другие задачи, такие как:

Эти задачи можно легко выполнить с помощью IFTTT.

1. Сборка схемы

На следующей принципиальной схеме показана цепь для данного проекта.

Принципиальная схема ESP8266 PIR Arduino IDE MQTT HLK-PM03

Снимите крышку PIR-датчика движения. Внутри должно быть три провода: фаза вход, нейтраль и фаза выход. Выполните следующие шаги:

  • Подключите фазу вход (коричневый) и нейтраль (синий) к датчику движения

  • Подключите нейтраль (синий) и фазу выход (красный) ко входу HLK-PM03

Подключение проводов датчика движения

Рекомендуется добавить предохранитель с медленным срабатыванием непосредственно перед преобразователем HLK-PM03 и конденсатор на выходе.

Примечание

Если вы используете ESP8266, который постоянно запитан от HLK-PM03, мы рекомендуем использовать эту схему защиты.

HLK-PM03 выдает 3.3В и GND. Они подключаются к выводам VCC и GND ESP8266 для его питания.

Схема HLK-PM03 и 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 на GitHub

Далее, в окне Node-RED в правом верхнем углу выберите меню и перейдите в Import > Clipboard.

Импорт узлов в Node-RED

Затем вставьте предоставленный код и нажмите Import.

Импорт потока в Node-RED

Вот импортированный поток. Он принимает MQTT-сообщения от ESP8266 и записывает время каждого обнаружения движения.

Поток Node-RED ESP8266 HLK PIR

Мы также добавили две кнопки для очистки и обновления журнала.

Панель управления Node-RED

После внесения всех необходимых изменений нажмите кнопку Deploy, чтобы сохранить все изменения.

Кнопка Deploy в Node-RED

Теперь ваше приложение Node-RED готово. Чтобы получить доступ к панели управления Node-RED и увидеть, как выглядит ваше приложение, откройте любой браузер в вашей локальной сети и введите:

http://Your_RPi_IP_address:1880/ui

Демонстрация

Теперь вы можете протестировать свой проект. При каждом обнаружении движения ESP8266 включается и отправляет сообщение через MQTT в Node-RED.

Если вы перейдете на панель управления Node-RED, вы увидите все записи о том, когда было обнаружено движение. Ваше приложение должно выглядеть как на следующем изображении.

Журнал обнаружения движения в Node-RED

Панель управления показывает последнее время обнаружения движения и все предыдущие записи журнала. У вас также есть возможность обновить журнал и очистить журнал. Обратите внимание, что очистка журнала необратима.

Заключение

В этом проекте было показано, как можно взломать коммерческий датчик движения с помощью ESP8266, чтобы сделать его умнее. Вы можете легко запитать ESP8266 с помощью HLK-PM03 от сетевого напряжения и создать компактную схему, которая поместится в датчик движения.

При каждом обнаружении движения ESP8266 включается и выполняет задачу. В данном случае он публикует MQTT-сообщение для записи времени обнаружения движения, но вы можете легко написать код для выполнения любой другой задачи.

Надеемся, что этот проект оказался для вас полезным. Если вам понравился этот проект, вас также могут заинтересовать следующие ресурсы: