参考:https://www.cnblogs.com/yuemo/p/8888342.html
用到的函数头文件:
#include
struct timeval
{
time_t tv_sec; //秒
suseconds_t tv_usec; //微妙 ,1秒等于10的6次方微妙
};
——————————————————————-
定义一个struct timeval t1;
gettimeofday()函数功能是得到当前时间和时区,分别写到tv和tz中
gettimeofday(t1,NULL);//获得当前系统时间
——————————————————
wiringPiSetup()
在使用wiringPi.h库时,在执行任何操作前都必须初始化树莓派,否则程序便无法正常运行。当初始化操作未完成时,函数返回值为-1
其他的树莓派初始化函数还有wiringPiSetupGpio(void),此函数使用方法与wiringPiSetup(void)类似,当函数无法正常运行时返回值也是-1.不同的地方在于,wiringPiSetup(void)初始化树莓派引脚时使用的是wiringPi 引脚编号表。引脚的编号为 0~16;wiringPiSetupGpio(void)初始化树莓派引脚时使用的是BCM GPIO 引脚编号表。
——————————————————————————
pinMode这个函数是用来确定引脚的功能的,如果在使用某个引脚之前没有确定这个引脚的功能或者引脚设置模式不正确,就会出现一些不可捉摸的错误。
这个函数有两个参数,第一个参数pin是一个正整数,用来指定引脚的编号(0-16),第二个参数是用来指定引脚的IO模式,可用的参数有INPUT , OUTPUT , OUTPUT_OPEN_DRAIN , INPUT_ANALOG , INPUT_PULLUP , INPUT_PULLDOWN , INPUT_FLOATING , PWMPWM_OPEN_DRAIN
如:
pinMode(Echo, INPUT); //确定输入
pinMode(Trig, OUTPUT);
——————————————————————————
digitalWrite(uint8 pin, uint8 value)
这又是一个在wiringPi.h中已经定义好的函数,它的作用是对一个已近配置为输出模式(OUTPUT或者OUTPUT_OPEN_DRAIN)的 引脚 输出指定的电平信号,其中pin是一个正整数,用来指定一个已经初始化过的引脚,value可以是数字或者参数,数字表示下:1代表高电平,0代表低电平;参数表示下:LOW代表低电平,HIGH代表高电平。ON高,OFF低。
——————————————————————————
delayMicroseconds (unsigned int howLong)
将线程暂停指定的微秒数(1000微妙=1毫秒=0.001s),因为Linux是多线程的,所以实际暂停的秒数可能比设置的更多一些
——————————————————————————
digitalRead (int pin)
读取一个引脚的电平值(LOW / HIGH),并且返回。其中pin是引脚的编号,该引脚的初始化类型必须为INPUT等输入类型。返回值也可以是1 / 0(当输入信号电压在0~1.16 V时该函数返回0,当输入信号在1.83~3.3 V时返回1。如果输入电压在1.16~1.83 V之间不确定会返回0还是1。)
————————————————————————————
超声波测距模块工作原理
(1)采用IO口TRIG触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
(4)本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,即可以达到你移动测量的值
——————————————————————–
代码解读:
#include
#include
#include
#define Trig 0
#define Echo 1
void ultraInit(void)
{
pinMode(Echo, INPUT);
pinMode(Trig, OUTPUT);
}
float disMeasure(void)
{
struct timeval tv1;
//timeval是time.h中的预定义结构体 其中包含两个一个是秒,一个是微秒
struct timeval tv2;
long start, stop;
float dis;
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(T rig, HIGH);
delayMicroseconds(10); //发出超声波脉冲
digitalWrite(Trig, LOW);
while(!(digitalRead(Echo) = 1));
gettimeofday(&tv1, NULL); //获取当前时间
while(!(digitalRead(Echo) == 0));
gettimeofday(&tv2, NULL); //获取当前时间
start = tv1.tv_sec * 1000000 + tv1.tv_usec; //微秒级的时间
stop = tv2.tv_sec * 1000000 + tv2.tv_usec;
dis = (float)(stop - start) / 1000000 * 34000 / 2; //求出距离
return dis;
}
int main(void)
{
float dis;
if(wiringPiSetup() == -1){ //when initialize wiring failed,print messageto screen
printf(“setup wiringPi failed !”);
return 1;
}
ultraInit();
while(1){
dis = disMeasure();
printf(“distance = %0.2f cm\n”,dis);
delay(1000);
}
return 0;
}
ps: