arduino实战 2——利用arduino做一个人体传感器

本项目使用Arduino Uno/Nano实现人体检测及距离测量功能。通过HC-SR501模块检测人体,结合HC-SR04超声波模块测量距离,并通过OLED显示相关信息。当检测到人体且距离小于50厘米时,蜂鸣器启动报警。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

arduino是较为简单的单片机,易上手。所以利用arduino开始探索之旅吧。 

 目录

一.材料清单

一).模块介绍

      1).HC-SR501

      2).HC-SR04

二).实物展示

1).工作流程

2).连线

二.代码

     1.代码展示

     2.代码的理解

三.写在后面


一.材料清单

        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单片机的小玩儿意。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下一站是上岸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值