一、硬件设计

1. 硬件选型

主控:使用NodeMCU开发板。

人体感应器:使用PIR红外热释电人体感应模块,静态功耗小于0.1mA 。

2. 原理图设计

esp8266红外接收发射 esp8266 红外_#define

二、软件设计

        1. ESP8266程序设计

        1.1 ESP8266程序编写可以使用安信可提供的开发工具,也可以使用Arduino IDE来编写,

我使用的Arduino IDE来编写编写程序。

        1.2 人体感应模块程序:PIR红外热释电人体感应模块是感应到人时输出高电平,人离开后输出低电平,因此在程序中检测人体感应模块OUT引脚的高低电平即可知道是否有人。

// 如果人体感应模块感应到人
  if (digitalRead(PIR_SENSOR) == HIGH)
  {
    // 感应到人时的操作
    // ...
    
    // 蜂鸣器报警
    digitalWrite(beep, HIGH);
  } 
  // 如果人体感应模块没有感应到人
  else 
  {
    // 没有感应到人时的操作
    // ...
    
    // 关闭蜂鸣器
    digitalWrite(beep, LOW);
  }

        1.3 OLED模块程序:本设计使用的是4 PIN的OLED模块,IIC通讯。使用OLED来显示是否有人闯入的信息。

// 引入库文件
#include <Adafruit_ssd1306syp.h>
// 定义引脚
#define SCL D5                                            // OLED SCL
#define SDA D6                                            // OLED SDA

Adafruit_ssd1306syp display(SDA, SCL);

void setup() {
  // 初始化OLED
  display.initialize();     
  // ...
}

void loop() {
  // 如果人体感应模块感应到人
  if (digitalRead(PIR_SENSOR) == HIGH)
  {
      // OLED显示信息
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.print("isPerson YES");
  } 
  // 如果人体感应模块没有感应到人
  else 
  {
      // OLED显示信息
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.setCursor(0,0);
      display.print("isPerson NO");
  }

  // ...

}

        1.4 蜂鸣器驱动程序:高电平时,三极管导通,蜂鸣器响;低电平时,三极管截止,蜂鸣器不响。

// 打开蜂鸣器
digitalWrite(beep, HIGH);
// 关闭蜂鸣器
digitalWrite(beep, LOW);

        1.5 智能配网:本设计使用微信配网来实现ESP8266的智能配网。

// 引入头文件
#include <ESP8266WiFi.h>

static WiFiClient espClient;

// 智能配网
void smartConfig()
{
  // 设置WIFI模块为STA模式
  WiFi.mode(WIFI_STA); 
  // smartconfig进行初始化
  WiFi.beginSmartConfig();
  // 等待连接成功
  while (1)
  {
    digitalWrite(LED, LOW);
    delay(500);
    digitalWrite(LED, HIGH);
    delay(500);
    //如果连接成功
    if (WiFi.smartConfigDone())
    {
      // 设置自动连接
      WiFi.setAutoConnect(true);  
      break;
    }
    delay(1000);
  }
}

// 自动配置
bool autoConfig()
{
  WiFi.begin();
  for (int i = 0; i < 20; i++)
  {
    int wstatus = WiFi.status();
    if (wstatus == WL_CONNECTED)
    {

      WiFi.printDiag(Serial);
      return true;
    }
    else
    {
      delay(1000);
    }
  }
  Serial.println("自动配置失败" );
  return false;
}

void setup() {
  Serial.begin(9600);   

  if (!autoConfig())
  {
      // 进入智能配网模式
      smartConfig();
  }
}

        1.6 连接阿里云物联网:本设计使用阿里云物联网平台实现数据上传云端,首先在阿里云物联网平台创建一个设备,获取到ProductKey,DeviceName,DeviceSecret后填写到代码中。

// 引入阿里云 IoT SDK
#include <AliyunIoTSDK.h>

// 设置产品和设备的信息,从阿里云设备信息里查看
#define PRODUCT_KEY "XXXXXXXXXXX"                         // ProductKey
#define DEVICE_NAME "XXXXXXX"                             // DeviceName
#define DEVICE_SECRET "XXXXXXXXXXXXXX"                    // DeviceSecret
#define REGION_ID "cn-shanghai"                           // 地区

void setup() {
  // 初始化 iot,需传入 wifi 的 client,和设备产品信息
  AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);
}

void loop() {
  // 如果人体感应模块感应到人
  if (digitalRead(PIR_SENSOR) == HIGH)
  {
    // 将信息上传阿里云物联网平台
    AliyunIoTSDK::send("isPerson", YES);
    // ...

  } 
  // 如果人体感应模块没有感应到人
  else 
  {
     // 将信息上传阿里云物联网平台
    AliyunIoTSDK::send("isPerson", NO);
  }


  AliyunIoTSDK::loop();
}

PIR红外热释电人体感应模块感应到人时,阿里云平台显示有人闯入;无人时显示无人。

esp8266红外接收发射 esp8266 红外_上传_02

esp8266红外接收发射 esp8266 红外_微信小程序_03

        1.7 微信小程序编写

esp8266红外接收发射 esp8266 红外_上传_04