树莓派超声波测距

 

一.需要只用的标准库是wiringPi库需要自己去下载

二、超声波原理图

1.VCC:连接5v电源

2.GND:连接电源负极

3.Tring:超声波发射引脚

4.Echo: 超声波接收引脚

超声波工作原理解析:超声波触发的方式是Trig产生大约10us的方波,需要进行严格的延时处理,当发射超声波以后,ECHO引脚电平将会被拉为高电平,

等待超声波的返回,当ECHO接收到返回的超声波时,将会自动的被拉为低电平。通过测定ECHO的高电平的时间,再乘以声音在空气中传播的速度从而计算距离。

5:这里使用wiring PI库索引使用的引脚是WPI对应的引脚。也就是 ,

直接上代码:

#include<wiringPi.h>
#include <sys/time.h>
#include<stdio.hnclude<wiringPi.h>
#include <sys/time.h>
#include<stdio.h>
#define Trig 5
#define Echo 4
void chaoShengBoInit(){
pinMode(Trig,OUTPUT);// 超声波得引脚的配置,发射波输出引脚
pinMode(Echo,INPUT); // 接受波输入引脚

 

}
float dismeasure(){
struct timeval tv1; // 定义获取当前时间的结构体,注意这是库函数中固有的结构体。
struct timeval tv2; // 定义获取当前时间的结构体
long start, stop;
float dis;

 

digitalWrite(Trig,LOW); // 将发射波的引脚配置成低电平,确保后面具有完整的方波
delayMicroseconds(2); //短暂的延时
digitalWrite(Trig,HIGH);
delayMicroseconds(10); //形成10微妙高电平的方波
digitalWrite(Trig,LOW);// 将发射波的引脚设置成高电平,此后将会发射波
//并且在发射波的同时模块会制动的将Echo引脚拉为高电平
while(!(digitalRead(Echo)==1)); // 等待波是否发出
//while(digitalRead(Echo)!=1);
gettimeofday(&tv1,NULL); // 获取当前的时间
while(!(digitalRead(Echo)==0));//等待波是否接收
//while(digitalRead(Echo)!=0);
gettimeofday(&tv2,NULL); // 获取当前的时间
stop=tv2.tv_sec*1000000+tv2.tv_usec; // 将时间全部转化成微秒处理
start=tv1.tv_sec*1000000+tv1.tv_usec;
dis=(float)(stop-start)/1000000*34000/2; // 获取距离,注意这里注意需要将获取的结果进行强制的数据类型转换处理。
return dis;
}
int main(){
float dis;
if(wiringPiSetup()==-1){
printf("初始化串口失败\n");
return -1;

 

}else{
printf("初始化串口成功\n");

 

}
chaoShengBoInit();
while(1){
dis=dismeasure();
printf("当前泳池水深为:%0.2fCM\n",dis);
delay(500); // 延时
}
}

 

编译: gcc mode.c -lwiringPi

运行: ./a.out

效果:

 

posted @ 2022-04-17 11:06  LInguistic-零点  阅读(267)  评论(0)    收藏  举报