树莓派之超声波报警器

1.模块:超声波(HC-SR04)、蜂鸣器

在这里插入图片描述
HC-SR04 模块可以测量 3cm - 4m 的距离,精确度可以达到 3mm。它包含了超声波发射器、接收器和控制电路三部分。

2.接线方式

一共两个电源引脚和两个控制引脚。
Vcc 接 5V ,Gnd 接0 V ,但不推荐用独立电源给它供电,应使用树莓派或单片机的 GPIO 口输出 5v 和 Gnd 给它供电。不然会影响这个模块的运行。
Trig 引脚用来接收树莓派的控制信号。接任意 GPIO 口。
Echo 引脚用来向树莓派返回测距信息。接任意 GPIO 口。
(注意 Echo 返回的是 5v信号,而树莓派的 GPIO 接收超过 3.3v 的信号可能会被烧毁,因此需要加一个分压电路,博主没有加,直接用杜邦线连的)。
蜂鸣器: VCC 接3.3V ,Gnd接0V I,O接GPIO.0口

3.工作原理

(1)树莓派向 Trig 脚发送一个 10us 的脉冲信号。
(2) HC-SR04 接收到信号,开始发送超声波,并把 Echo置为高电平,然后准备接收返回的超声波。
(3) HC-SR04 接收到返回的超声波,把 Echo 置为低电平。
(4)Echo 高电平持续的时间就是超声波从发射到返回的时间间隔。
(5)计算距离:
距离(单位:m) = (start - end) * 声波速度 / 2
声波速度取 343m/s 。
然后再把测得的距离转换为 cm。
距离(单位:cm) = (start - end) * 声波速度 / 2 * 100
= (start - end) * 17150

4.代码

#include <wiringPi.h>
#include <stdio.h>
#include <sys/time.h>
#define Trig 4
#define Echo 5
#define VOICE 0

void ultraInit(void){            // 超声波相关设置引脚
        pinMode(Echo,INPUT);    //  设置Echo  为输入引脚
        pinMode(Trig,OUTPUT);  //   设置Trig  为输出引脚
        pinMode(VOICE,OUTPUT);//    设置VOICE 为输出引脚
}

float disMeasure(void){
        struct timeval tv1;
        /*
           struct timeval{
           time_t tv_sec;
           suseconds_t tv_usec;
           }
           
        */

        struct timeval tv2;
        long start=0,stop=0;

        digitalWrite(VOICE,HIGH); // 初始化引脚
        digitalWrite(Trig,LOW);
        delayMicroseconds(2);
        digitalWrite(Trig,HIGH);
        delayMicroseconds(10);   // 发出超声波脉冲 
        digitalWrite(Trig,LOW);

        while(!(digitalRead(Echo) == 1)); 
        //Trig接受到树莓派发送的10us的脉冲信号,开始发送超声波,并将Echo拉至高电平,while不再等待,开始执行下一条语句 
        gettimeofday(&tv1,NULL); // 获取当前时间,波开始发送的时刻

        while(!(digitalRead(Echo) == 0)); 
        //while等待中,当Echo收到超声波返回信号时,Echo被拉至低电平,
        //当 Echo == 0 也就是波回来的时候 不再等待,执行下一条语句
        gettimeofday(&tv2,NULL); // 获取当前时间,波回来的时刻

        start = tv1.tv_sec * 1000000 + tv1.tv_usec;
        stop  = tv2.tv_sec * 1000000 + tv2.tv_usec;

        return (float)(stop - start) / 1000000*34000 / 2; //测距
}
void doVoice(void)
{
        for(int i=1;i<=6;i++){
                digitalWrite(VOICE,HIGH);
                delay(500);
                digitalWrite(VOICE,LOW);
                delay(1000);
        }
}

int main(){
        float dis;

        if(wiringPiSetup() == -1){
                printf("setup wiringPi failed!");
                return -1;
        }

        ultraInit();//超声波相关初始化

        while(1){
                dis = disMeasure();
                printf("测得距离 = %0.2f cm\n",dis);
                if(dis < 10){
                        printf("有物体靠近 警报响起\n");
                        doVoice();
                }else{
                        printf("一切正常\n");
                }
                delay(1000);
        }
        return 0;
}
                                                                                 

实验结果

在这里插入图片描述

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值