arduino是较为简单的单片机,易上手。所以利用arduino开始探索之旅吧。
目录
一.材料清单
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 <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_GrayOLED.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>
#include <Adafruit_SSD1306.h>
#include <splash.h>
#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单片机的小玩儿意。