前言
前些天,有其他同学跟我诉苦学习计算机类很难,给我的感觉也是很难,学什么也是有难度的,学习计算机类的同学还是要多实践,不断出错,不断改正,这样才能进步,回到当初写博客的初衷,并不是为了成为技术大佬,初衷很简单,借此平台督促学习,也是喜欢上了写博客的感觉,喜欢上了文字。
这篇贴子的主要内容是用模拟量的传感器->人体红外探测传感器做出在手机app端显示屋内是否有人的例程,这篇帖子的内容不是很难,主要就是对模拟量传感器的使用,结合点灯科技app进行文本数据的传递。
物联那点事儿专栏往期回顾:
- arduino+点灯科技+温湿度DHT11+esp01=自制网络温湿度计
- arduino+点灯科技+wifi继电器+esp01=网络远程控制开关机
- ardunio+点灯科技+温湿度+云存储=温湿度变化曲线
- arduino+点灯科技+DHT11+smartConfig=一键配网
正文
一、准备
软件: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);
}
逆水行舟不进则退,有问题在下方评论或者私聊我一直在,一起进步!