- 超声波测距原理,原理可以查看下面的文章,这里就不赘述了
[51单片机超声波测距](http://t.csdn.cn/eYbod)
- 在Linux中使用超声波测距会用到的时间相关的API和结构体
包含的头文件以及函数原型和时间结构体timveal原型
#include<sys/time.h>
int gettimeofday(struct timeval *tv,struct timezone *tz )
使用 gettimeofday() 函数可以获取当前时间,并将其存储在 timeval 结构体中。然后,通过访问 tv_sec 和 tv_usec 成员,可以分别获取秒和微秒的值
gettimeofday() 函数的第一个参数是 timeval 结构体指针,用于存储获取到的时间信息。第二个参数是一个时区信息,通常设置为 NULL,表示使用系统默认的时区
struct timeval {
time_t tv_sec; // 秒数
suseconds_t tv_usec; // 微秒数
};
tv_sec 表示时间点的秒数,tv_usec 表示时间点的微秒数。在 Linux 中,timeval 结构体常用于计算时间差、定时器或事件处理等操作。
使用的例子:
#include <stdio.h>
#include <sys/time.h>
int main() {
struct timeval tv;
int result;
result = gettimeofday(&tv, NULL);
if (result == 0) {
printf("Seconds: %ld\n Microseconds: %ld\n", tv.tv_sec, tv.tv_usec);
} else {
printf("Error with gettimeofday()\n");
}
return 0;
}
在上述示例中,创建了一个 struct timeval 变量 tv,然后调用 gettimeofday() 函数来获取当前时间,如果调用成功,将打印输出秒数和微秒数;如果出现错误,将打印相应的错误信息。
- 超声波测距的代码
#include <stdio.h>
#include <sys/time.h>
#include <wiringPi.h>
#include <stdlib.h>
#include <unistd.h>
#define Trig 0
#define Echo 1
double getDistance()
{
double dis;
struct timeval start;
struct timeval stop;
pinMode(Trig, OUTPUT);//设置Trig为输出引脚
pinMode(Echo, INPUT);//设置Echo为输入引脚
digitalWrite(Trig ,LOW);
usleep(5);
digitalWrite(Trig ,HIGH);
usleep(10);
digitalWrite(Trig ,LOW);
/*让超声波发波*/
while(!digitalRead(Echo));//等待其发送波
gettimeofday(&start,NULL);//波发送出去的时候的时间
while(digitalRead(Echo));//等待波回来
gettimeofday(&stop,NULL);//波回来的时候的时间
long diffTime = 1000000*(stop.tv_sec-start.tv_sec)+(stop.tv_usec -start.tv_usec);//计算距离
printf("diffTime = %ld\n",diffTime);
dis = (double)diffTime/1000000 * 34000 / 2;
return dis;
}
int main()
{
double dis;
if(wiringPiSetup() == -1){
fprintf(stderr,"%s","initWringPi error");
exit(-1);
}
while(1){
dis = getDistance();
printf("dis = %lfcm\n",dis);
usleep(500000);
}
return 0;
}
运行结果: