完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一.材料清单
1.uno/nano都可以,只是nano更小巧。 2.HC-SR04,就是市面上的超声波模块(可用可不用)。 3.HC-SR501,重点的人体检测模块!!!!!!!!!! 4.0.96寸OLED,就是为了看数方便。 5.无源蜂鸣器,就是检测到人报警 我用的uno,因为我手里只有uno了,芯片价格飞涨,单片机也水涨船高。一).模块介绍 1).HC-SR501 我上网查阅了相关资料,找到一个pdf文件:https://docs.particle.io/assets/ 这个介绍的比较详细,我就简单说一下,里面是两个传感器,就是加强版。检测到人体时输出一个高电平,波会受各种因素影响,通过调节距离,延时,以达到好的效果。但是有个缺点,就是光线太强会不灵敏,所以给你提供了两个焊接光敏电阻的地方,建议不要焊,挺不方便的。所以增加了HC-SR04。 2).HC-SR04 超声波传感器,通过高电平触发,当检测到物体时,会反馈一个高电平,这时将高电平的波的延时时间就可以得出距离,有个公式X=(高电平的时间x340)/2;因为波是一个往返的时间。 我买的是自带晶振的,因为我觉得自带晶振时间能准,不然只能靠板子模拟,偏差会较大 二).实物展示 视频由于没上传到B站等平台,不能上传。1).工作流程 首先人体检测模块启动,当将测到动物体时,OLED显示体温、超声波模块启动,开始计算距离,显示在OLED上,当动物体距离超声波模块50cm时,蜂鸣器启动,开始报警,警示有人来了。 2).连线 所有的电源接线就不重复了,都是5V,GND。超声波模块 : Trig是触发口,Echo是接收口。随便接线,但建议都接在PWM口上。 Trig--D9 Echo--D8 人体检测模块:中间的是数据反馈口,打开菲涅尔透镜就能看到。 out--D7 蜂鸣器模块: I/O口--D5 二.代码 1.代码展示 #include #include #include #include #include #include #include #include #include #define respons 7 //人体检测模块的数据反馈口 #define Buzzer 5 //蜂鸣器 #define LED 3 //LED,我没加入到实物中 int inputPin = 8; //超声模块接收口 int outputPin = 9; //超声模块输出口 int val ; Adafruit_SSD1306 display(128, 64, &Wire, 13); //定义OLED void setup() { Serial.begin(9600); //串口打开,没啥用 pinMode(inputPin, INPUT); pinMode(outputPin, OUTPUT); //定义串口工作状态 display.begin(SSD1306_SWITCHCAPVCC,0X3c); //定义OLED地址 analogWrite(5,0); //初始给蜂鸣器置零,不然吵死了 } void loop() { for (int i;; i++) //使循环一直进行 { int distance; //定义距离 val = analogRead(respons); //读取人体检测模块反馈的数值 display.setTextColor(WHITE); display.clearDisplay(); display.display(); display.setTextSize(4); display.setCursor(0,8); display.print(val); display.println("~"); display.display(); //OLED显示读取的数值 delay(1000); if (val != 0) //如果检测到动物体,我写的不准,因为有空气温度光线的影响 { digitalWrite(outputPin, LOW); //先置为高电平 delayMicroseconds(2); //函数是延时微秒级别的 digitalWrite(outputPin, HIGH);//超声波开始工作 delayMicroseconds(10); //因为必须大于10us的高电平才会开始工作 digitalWrite(outputPin, LOW);//置低,因为要等待反馈回来的高电平 distance = pulseIn(inputPin, HIGH); //检测高电平的时延 distance = distance / 58; //计算距离,不要问为什么不按公式写,我用示波器测过 display.setTextColor(WHITE); display.clearDisplay(); display.display(); display.setTextSize(4); display.setCursor(0,8); display.print(distance); display.println("cm"); display.display(); // OLED显示距离 delay(500); } int remainder; //定义余量,计算是否是人体,因为人比动物距离模块近 remainder = distance / 100; switch (remainder) //大于100为1,小于100为0 { case 0: digitalWrite(3, HIGH); analogWrite(5, 200); delay(3000); analogWrite(5,0); break; case 1: break; } } } 2.代码的理解 其实代码很简单,就是通过读取串口的PWM波,来反馈一些数据,当然了一些函数的精准使用才是关键,比如说delayMicroseconds,延时微秒。还有pulseIn,这个函数有三种写法。 pulseln:1)pulseIn(); 检测脉冲宽度 2)pulseIn(pin,value);某引脚的状态时间 3)pulseIn(pin,value,timeout);某引脚状态的超出时间 三.写在后面 其实,我想通过蓝牙模块交互实现两块板子的互通,但是还在学习中。 后续会有改进版的,在此基础上进行增加其功能。 正在学习51单片机,寄存器好难啊,以后会增加51单片机的小玩儿意。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 09:59 , Processed in 1.356165 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号