香橙派Zero2基于wiringPi外设库的实验(超声波测距)

1. 超声波测距原理,原理可以查看下面的文章,这里就不赘述了

51单片机超声波测距

2. 在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() 函数来获取当前时间,如果调用成功,将打印输出秒数和微秒数;如果出现错误,将打印相应的错误信息。

3. 超声波测距的代码

 #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;
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_68038554/article/details/131905073