1.综述
树莓派外设开发需要用的wiringPi()库函数
在调用时需要包含#include<wiringPi.h>文件
使用wiringPi()库函数时需要将其初始化,方法为:调用
int wiringPiSetup();函数
编译时需要连接 -lwiringPi库函数
2.Linux中的测时方法
2.1 Linux中的struct timeval的结构体
timeval是time.h中的预定义结构体 其中包含两个一个是秒,一个是微秒
struct timeval {
__kernel_time_t tv_sec; /* seconds /
__kernel_suseconds_t tv_usec; / microseconds */
};
2.2用 gettimeofday(&tv1, NULL);函数来获取当前的时刻
2.3 获取时间函数的具体用法
#include <stdio.h>
#include <sys/time.h>
int main()
{
struct timeval tv;
gettimeofday(&tv,NULL);//获取当前时间
printf("the sec is %ld ,the usec is %ld\n",tv.tv_sec,tv.tv_usec);
return 0;
}
获得当前时间相对于某一时刻(1970年1月1日到现在的时间)的时间的秒和微秒部分
3.超声波测距代码实现
#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#include <wiringPi.h>
#define echo 27
#define trig 28
void ultrasonicInit()
{
pinMode(echo,INPUT);
pinMode(trig,OUTPUT);
}
double getDistance()
{
double dis;
struct timeval start_tv;
struct timeval end_tv;
double start_time,end_time;
//1.trig端口发送至少10us的高电平
digitalWrite(trig,LOW);//先将trig引脚置低
usleep(5);
digitalWrite(trig,HIGH);//拉高
usleep(10);//延迟10us
digitalWrite(trig,LOW);
//2.echo 由低电平变为高电平表示开始发生
while(!digitalRead(echo));//等待echo由低电平变为高电平
gettimeofday(&start_tv,NULL);//获取开始发送的
start_time = start_tv.tv_sec*1000000+start_tv.tv_usec;
//3.echo由高电平变为低电平表示超声波遇障碍物反弹回来接收回来的时间
gettimeofday(&end_tv,NULL);
end_time = end_tv.tv_sec*1000000+end_tv.tv_usec;
//4.计算距离: 距离 = 速度 * 时间
dis = (end_time - start_time)/1000000*34000/2;
return dis;
return dis;
}
int int main(int argc, char const *argv[])
{
double distance;
//wiringPi库的初始化
if(wiringPiSetup() == -1){
printf("wiringPi库的初始化失败\n");
exit(-1);
}
//引脚初始化
ultrasonicInit();
//不断测量距离
while(1){
distance = getDistance();
printf("distance = %0.2f\n",distance );
delay(1000);
}
return 0;
}