Experimento Orange Pi Zero2 basado en la biblioteca periférica WiringPi (rango ultrasónico)

1. El principio de la medición de distancias ultrasónicas. Puede consultar el principio en el siguiente artículo. No entraré en detalles aquí.

Rango ultrasónico de 51 microcontroladores.

2. API y estructuras relacionadas con el tiempo utilizadas en alcance ultrasónico en Linux

包含的头文件以及函数原型和时间结构体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 结构体常用于计算时间差、定时器或事件处理等操作。

Ejemplos de uso:

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

En el ejemplo anterior, se crea una variable de estructura timeval tv y luego se llama a la función gettimeofday() para obtener la hora actual. Si la llamada tiene éxito, se imprimirá el número de segundos y microsegundos; si ocurre un error, el Se imprimirá el mensaje de error correspondiente.

3. Código para alcance ultrasónico

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

resultado de la operación:
Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_68038554/article/details/131905073
Recomendado
Clasificación