树莓派超声波测距
一.需要只用的标准库是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
效果:


浙公网安备 33010602011771号