树莓派之超声波报警器

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 == 1时,while不再等待,开始执行下一条语句 
        gettimeofday(&tv1,NULL); // 获取当前时间,开始接收到返回信号的时候(波开始发送的时刻)

        while(!(digitalRead(Echo) == 0)); //刚开始 Trig == 1 while等待中 当 Trig == 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;
}
                                                                                 

实验结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_50620305/article/details/109056504
今日推荐