樹莓派超聲波測距
<div align="center">
<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=100% height=86 src="//music.163.com/outchain/player?type=2&id=1430429719&auto=1&height=66"></iframe>
</div>
一.需要只用的標準庫是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
效果: