安全使用PIR Sensor和ESP8266传感器教程

本教程演示了如何使用PIR传感器,ESP8266和Arduino IDE创建安全传感器,以指示高低运动。

安全传感器
安全传感器

本教程将指导您逐步使用ESP8266和PIR传感器(被动红外传感器)检测运动并使用Wia F向您发送通知的步骤

一、准备工作

  • 被动红外传感器(HC-SR501)
  • ESP8266
  • 跳线
  • USB电缆

二、硬件连接

根据图表连接电线:

PIR传感器 ESP8266
GND GND
OUT D7
VCC 3.3V
连接示意图
连接示意图

PIR传感器的工作电压范围为DC 4.5-20V。 但是,有一种方法可以通过3.3V电源为传感器供电。 传感器侧面的H引脚在上图中用VCC表示,并连接到可转换3.3V电源的稳压器。

三、安装库

在Arduino IDE中,转到Sketch > Include Libraries > Manage Libraries。 通过在模式内的搜索栏中搜索以下每个库的名称来安装它们。 一个按钮将出现在框的右下角,您可以通过该按钮安装库。

  • ArduinoJson
  • ESP8266WiFi
  • ArduinoHttpClient

由于库中的最新更改,请确保安装ArduinoJson 6.0,以便您保持最新状态。如果搜索时库未显示在结果中,则可能需要更新Arduino IDE版本。

四、代码

在Arduino IDE中,复制并粘贴以下代码:

#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <ArduinoHttpClient.h>
#include <Arduino.h>
const char* ssid     = "wifi-ssid"; // Your WiFi ssid
const char* password = "wifi-password"; //Your Wifi password

/* Get this secret key from the wia dashboard, in the configuration tab
    for your device. It should start with d_sk */
const char* device_secret_key = "your-device-secret-key";
// Wia API parameters
char server[] = "api.wia.io";
char path[] = "/v1/events";
char statePath[] = "/v1/devices/me";

int port = 80;

WiFiClient client;
int status = WL_IDLE_STATUS;

StaticJsonDocument<200> jsonBuffer;
HttpClient httpClient = HttpClient(client, server, port);
JsonObject& root = jsonBuffer.to<JsonObject>();

String response;
int statusCode = 0;

int BUTTON = 0;
int SENSOR = 13;
boolean buttonState = HIGH;
boolean buttonDown = false;
boolean stateAlarm = LOW;
long motion = LOW;

String dataStr = "";
String stateStr = "";

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(BUTTON, INPUT);
  pinMode(SENSOR, INPUT);
  digitalWrite(LED_BUILTIN, HIGH);

  // initialize serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  WiFi.begin(ssid, password);
  Serial.print("Attempting to connect to SSID: ");
  Serial.print(ssid);
  // attempt to connect to WiFi network:
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    // Connect to WPA/WPA2 network. Change this line if using open or WEP  network:
    // wait 5 seconds for connection:
    delay(5000);
  }
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println("Connected");
}
// Thing function runs continiously
void loop() {
  buttonState = digitalRead(BUTTON);
  if (buttonState == LOW && stateAlarm == LOW) {
    if (buttonDown == false) {
      buttonDown = true;
      Serial.println("Alarm on!");
      stateAlarm = HIGH;
      digitalWrite(LED_BUILTIN, LOW);
      updateStateWia(stateAlarm);
      delay(750);
    }
  }
  else if (buttonState == LOW && stateAlarm == HIGH) {
    if (buttonDown == false) {
      buttonDown = true;
      stateAlarm = LOW;
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.println("Alarm off!");
      updateStateWia(stateAlarm);
      delay(750);
    }
  }
  else {
    buttonDown = false;

  }
  if (stateAlarm == HIGH) {
    motion = digitalRead(SENSOR);
    //Serial.println(String(motion));
    if (motion == HIGH) {
      Serial.println("Motion Detected!");
      root["name"] = "motion";
      root["data"] = String(motion);
      sendToWia(root);
      delay(2000);
    }
  }
}

void updateStateWia(boolean& state) {
  if (state == HIGH) {
    stateStr = "{\"state\": {\"enabled\": true}}";
  }
  else {
    stateStr = "{\"state\": {\"enabled\": false}}";
  }
  Serial.println(stateStr);
  httpClient.beginRequest();
  httpClient.put(statePath);
  httpClient.sendHeader("Content-Type", "application/json");
  httpClient.sendHeader("Content-Length", stateStr.length());
  httpClient.sendHeader("Authorization", "Bearer "  + String(device_secret_key));
  httpClient.beginBody();
  httpClient.print(stateStr);
  httpClient.endRequest();
}

// Adds the correct headers for HTTP and sends Data to Wia
void sendToWia(JsonObject& data) {
  dataStr = "";
  serializeJson(data, dataStr);
  httpClient.beginRequest();
  httpClient.post(path);
  httpClient.sendHeader("Content-Type", "application/json");
  httpClient.sendHeader("Content-Length", dataStr.length());
  httpClient.sendHeader("Authorization", "Bearer "  + String(device_secret_key));
  httpClient.beginBody();
  httpClient.print(dataStr);
  httpClient.endRequest();
}

将您自己的值放在引号之间,以替换代码中的以下值:

  • your-WiFi-ssid (这是您wifi名称)
  • your-WiFi-password (这是您wifi密码)
  • your-device-secret-key ( 通过Wia Dashboard > Devices找到您的设备,device_secret_key在“Configuration”选项卡中)

上面的代码在每次检测到运动时都会向Wia发布事件,并带有运动的名称值(稍后将在构建Flow时使用)和一个等于运动传感器的读数的数据值。

确保选择了正确的板。 转到tools > board,然后选择NodeMCU 1.0(ESP-12E模块)。 确保选择了正确的端口:tools > port。

五、开启提醒

要打开警报,请按Esp 8266上的闪光灯按钮。蓝色LED应该亮起。 要关闭警报,请按住闪光灯按钮至少2秒钟,蓝色LED将会熄灭。

六、设置流程

1.创建流程

让我们设置一个流程,当PIR运动传感器检测到运动时,将向您的手机发送通知。

转到Wia信息中心,然后在左侧菜单中单击“Flows”。 使用您喜欢的任何名称创建一个新的流程。

2.添加事件触发节点

在Flow Studio中,从“触发器”部分中拖动“Event”节点,然后:

  • 输入运动作为事件名称
  • 添加您的设备
添加事件触发节点
添加事件触发节点

3.添加状态逻辑节点

现在,从“逻辑”部分添加一个“Check State”节点

  • 输入enabled作为键
  • 从“条件”下拉列表中选择“Equal to”
  • 输入true作为值
添加状态逻辑节点
添加状态逻辑节点

4.添加通知节点

接下来,将鼠标置于“操作”部分的“Notification”节点上。

  • 输入“Motion Detected”作为消息。
添加通知节点
添加通知节点

现在,当您的安全传感器检测到运动时,Wia可以向Wia移动应用发送消息。

5.添加小部件

接下来,转到设备的“Overview”标签。 点击“Add a Widget”。 给小部件命名为Motion Detected,然后选择小部件类型'text',然后输入事件的名称,即运动。

添加小部件
添加小部件

七、PIR传感器灵敏度测量

通过PIR传感器,您可以更改延迟时间和灵敏度级别。

PIR传感器是一种数字设备。 这意味着它将读取两个值:HIGH和LOW。 传感器检测到运动时,读数为HIGH。 否则,它显示为LOW。

延迟设置确定了PIR传感器检测到运动后将其读取为HIGH的时间。 灵敏度传感器确定PIR传感器记录运动的接近程度。 将该传感器设置为较低的接近度时,其精度更高。

您可以使用橙色的面板控制这些设置,该面板位于您用来连接设备的引脚的正对面。

示意图
示意图

八、故障排除

如果您找不到正确的板子,请参考ESP8266入门指南。

如果您的端口未显示USB选项,请尝试切换USB电缆并检查电缆是否不是“仅可充电”的。 如果这样做没有帮助,则可能需要安装驱动程序。 本教程包含一个部分,将引导您完成这些步骤。

如果收到错误StaticJsonDocument does not name a type,则归因于ArduinoJson库中引入的重大更改。 转到sketch > include library并管理库以更新到版本6+。

SO资源郑重声明:
1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!3187589@qq.com
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理,有奖励!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!

SO资源 » 安全使用PIR Sensor和ESP8266传感器教程