超声波模块工作原理:
通过原理图,我们首先要让Trig工作至少10us发出超声波,根据初中物理知识,dis = v(声)* t / 2 即可知距离
在库中有一个timeval的结构体:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
实现代码:
#include <stdio.h>
#include <sys/time.h>
#include <wiringPi.h>
#define Trig 4
#define Echo 5
void Init(){
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
}
float Distance(){
struct timeval start_time,end_time;
long start,end;
float dis;
digitalWrite(Trig,LOW);
delayMicroseconds(2);
digitalWrite(Trig,HIGH);
delayMicroseconds(10);
digitalWrite(Trig,LOW);
while(digitalRead(Echo) != HIGH);
gettimeofday(&start_time,NULL);
while(digitalRead(Echo) != LOW);
gettimeofday(&end_time,NULL);
start = start_time.tv_sec * 1000000 + start_time.tv_usec;
end = end_time.tv_sec * 1000000 + end_time.tv_usec;
dis = (float)(end - start) / 1000000 * 34000 / 2;
return dis;
}
int main(){
if(wiringPiSetup() == -1){
printf("WiringPi starts failure!\n");
return -1;
}
Init();
while(1){
printf("Distance = %.2fcm\n",Distance());
delay(500);
}
return 0;
}
运行结果:
用手遮挡和不用手遮挡的测距