在使用超声波模块测距之前,需要了解一下Linux 的时间函数
//头文件
#include <sys/time.h>
//结构
struct timeval
{
time_t tv_sec; //秒 [long int]
suseconds_t tv_usec; //微秒 [long int]
};
关联函数:gettimeofday()
#include <sys/time.h>
int gettimeofday(
struct timeval *tv,
struct timezone *tz
);
第一个参数结合上面的例子可以知道它的意思,下面剖析第二个参数的意思,首先它是一个结构体。
struct timezone
{
int tz_minuteswest; /* 和Greenwich 时间差了多少分钟 */
int tz_dsttime; /* 日光节约时间的状态 */
};
接下来再了解一下 int digitalRead(int pin) 函数
pin是引脚号:
作用:就是将当前引脚的电平返回HIGH/LOW,HIGH为1,LOW为0,如果当前引脚没有设置的话随机返回一个值
delayMicroseconds(us) 函数:
delay(1) 是指延时1毫秒
delayMicroseconds(1) 是指延时1微秒
#include <stdio.h>
#include <sys/time.h>
#include <wiringPi.h>
#define Trig 5
#define Echo 6
void chaoShengBoInit()
{
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
}
float disMeasure()
{
float dis;
long first;
long second;
struct timeval t1;
struct timeval t2;
digitalWrite(Trig,LOW);
delayMicroseconds(2);
digitalWrite(Trig,HIGH);
delayMicroseconds(10);
digitalWrite(Trig,LOW);
while(digitalRead(Echo)!=1)
{
gettimeofday(&t1,NULL);
}
while(digitalRead(Echo)!=0)
{
gettimeofday(&t2,NULL);
}
first=t1.tv_sec*1000000+t1.tv_usec;
second=t2.tv_sec*1000000+t2.tv_usec;
dis=(float)(second-first)/1000000*34300/2;
return dis;
}
int main()
{
float dis;
if(wiringPiSetup()==-1)
{
printf("初始化失败!\n");
return -1;
}
chaoShengBoInit();
while(1)
{
dis=disMeasure();
printf("get dis= %f cm\n",dis);
delay(1000);
}
return 0;
}