物联那点事儿之红外人体探测,居家安保必备!防人防狼防入室!(arduino+点灯科技篇)

前言

    前些天,有其他同学跟我诉苦学习计算机类很难,给我的感觉也是很难,学什么也是有难度的,学习计算机类的同学还是要多实践,不断出错,不断改正,这样才能进步,回到当初写博客的初衷,并不是为了成为技术大佬,初衷很简单,借此平台督促学习,也是喜欢上了写博客的感觉,喜欢上了文字。
    这篇贴子的主要内容是用模拟量的传感器->人体红外探测传感器做出在手机app端显示屋内是否有人的例程,这篇帖子的内容不是很难,主要就是对模拟量传感器的使用,结合点灯科技app进行文本数据的传递。
物联那点事儿专栏往期回顾:


正文

一、准备

软件:arduino IDE, 点灯科技app。
硬件(某宝有卖):
1.nodemcu开发板;这个nodemcu开发板也是esp8266的一种,和esp01一样都起wifi模块的作用,而esp01只有两个io口,最多只能连接两个外部设备,而这个nodumcu有很多引脚,可以连接多个外部设备。
注:使用nodemcu上传程序需要在工具里面的开发板选择NodeMCU1.0(ESP-12E Modue)。
2人体感应模块DYP-ME003
这个是模拟量传感器,与DHT11温湿度传感器数字传感器不同的是,模拟量传感器需要连接nodemcu开发板的ADC数模转画引脚,也就是A0引脚。
在这里插入图片描述
                                         图1-1 nodeMCU

在这里插入图片描述

                                                           图1-2 人体感应模块

二、设备连线

Nodemcu 人体感应模块
AO OUT输出口
GND 负极-
VCC(3v3) 正极+

注:一定不要把正负极接反,否则会烧坏人体感应模块!


三、硬件概述

关于人体感应模块的资料,某宝卖家会给,如果没有可参考->人体感应模块资料
(1)只有人或者动物运动时,人体感应模块才能感应的到,这是因为感应模块感应的是人体或者动物运动时产生的红外线,所以当人体静止不动时,感应模块并不能感应到。
(2)当有人或者动物运动时,感应模块输出高电平,反之,输出低电平。这也是写代码的关键部分,我们就是利用这个电压值来判断是否有人进入。
(3)关于感应距离以及调节灵敏度等其他原理,可自行查阅上面给出的资料,这里我们会用就好,不深究其原理。


四、代码部分详解

代码总思路:
通过loop()函数读取A0口读取到的电压值,根据电压值的大小判断是否有人进入,再将此信息传回我们的手机app端。


因为要让传感器不停地去读取人体感应模块给的电压值,所以要用把读取电压值的代码放在loop()函数中。
analogRead()函数是arduino给出的用来读取引脚的模拟电压值,其参数就是获取模拟量的引脚,返回值是int型的电压值。
(1)首先定义一个全局变量bodySensorData用来表示是否有人进入,有人进入则赋值给1,没人就赋值给0.

int bodySensorData=0;

(2)loop函数中,电压值高于512表示高电平有人进入,低于512表示低电平没人进入。

void loop() 
{
  Blinker.run();//运行Blinker
  int  BodySensor_value=analogRead(A0);//读取模拟A口电压值
  //串口打印
  Serial.print("模拟电压值:");
  Serial.print(BodySensor_value);
  Serial.print("\n");
  //
  if(BodySensor_value>512) 
  { 
    bodySensorData=1;
    Serial.print("有人进入");
  }else{
    bodySensorData=0;
    Serial.print("无人进入");
    }
    Blinker.delay(1000);//1秒延时
}

(3)将文本数据回传给手机端。

//新建文本类型组件对象,
//作用:将文本数据传输到手机blinker app
BlinkerText BODY("body");    //定义文本键名
//将人体红外传感器的数据回传给Blinker_APP   
void heartbeat()
{
  if(bodySensorData==0)
  {
    BODY.print("无人进入");//传输文本给组件
  }else{
    BODY.print("有人进入");
  }
}

(4)setup主函数中初始化并调用heartbeat函数。

void setup() {
    //初始化串口
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
    Blinker.begin(auth, ssid, pswd); // // 初始化blinker 
    Blinker.attachHeartbeat(heartbeat);//将传感器获取的数据传给blinker app上  
}

问题

因为人体探测模块是模拟量传感器,再就是感应人体红外的时候会有误差,这个误差是避免不了的,并没有更好的方案,我有一种思路,(仅供参考!),把每次读取到数据放到数组里面,取十次为为一组,这十次数据中如果有超过一次高电平,就说明有人进来,否则的话视为无人,这样的话也会带来另一个问题,如果我们的延时函数是一秒,那么十次就是十秒,十秒才会发送消息,那不就等同于把延时函数改成了延时10秒?十秒读取一次数据。保留这个问题,我个人觉得他是在感应电压的时候不稳定,不简简单单是因为读取数据的问题,如果直接改成十秒的话并不能解决这个问题,十秒读取一次,仍然会时而高时而低。应该是人体感应模块每次感应的时候不稳定,造成明明有人在运动,但是仍然会输出低电平的现象,既然硬件的问题解决不了,就在软件上想办法,就想到了用取十次做判断的方法。
这里给出参考代码:
(1)首先定义全局变量。

int BobySensor_values[10];
int i=0;//BobySensor_values[10]数组的下标值
int count=0;//记录数组中数据超过512的数据的个数

(2)在loop函数中对感应的数据进行处理。

//因为loop函数就是一个循环,可以直接用来进行数据的赋值
 BobySensor_values[i]=BobySensor_value;
  i++;
  //i=9,数组中数据存满
  if(i==10)
  {
    //判断数组中的数据是否有大于512的
    for(int j=0;j<10;j++)
    {
      if(BobySensor_values[j]>512)count++;
    }
    //如果数组中存在大于512的值,即为有人通过
   if(count>0) 
   { 
    digitalWrite(LED,LOW);//点亮led灯 
    Serial.print("有人进入!\n");
   } 
   //否则即为没人通过
   else
   {
      digitalWrite(LED,HIGH);//熄灭led灯 
      Serial.print("无人进入!\n");
   
   }
   //清除数组中的全部数据
   for(int m=0;m<10;m++)
   {
    BobySensor_values[m]=0;
   }
   //数组中下标值和统计次数重新置为0
    i=0;
    count=0;
    delay(2000);
  }

逆水行舟不进则退,有问题在下方评论或者私聊我一直在,一起进步!

原创文章 21 获赞 40 访问量 1万+

猜你喜欢

转载自blog.csdn.net/JIANGYINGH/article/details/105923011