#include <stdio.h>
#include <wiringPi.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdlib.h>
#include <softPwm.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#define Trig 2
#define Echo 3
float disFront;
void IO_UltraInit()
{
pinMode(Trig, OUTPUT); // output Raspberry Pi
pinMode(Echo, INPUT); // input Raspberry Pi
}
float disMeasure() // on doit mettre disMeasure à l'autre varial, donc utiliser float
{
struct timeval tv1, tv2;
long start, stop;
digitalWrite(Trig, LOW); // 保险起见,先给低电平,以确保我们得到一个干净的高脉冲。
delayMicroseconds(2); // 随便设的值(可更改)。
digitalWrite(Trig, HIGH); // 给Trig一个至少10us的高电平信号,系统便可发出8个40kHz的超声波脉冲,然后检测回波信号。
delayMicroseconds(10); // 保持10us高电平
digitalWrite(Trig, LOW);
while(!(digitalRead(Echo) == 1)); // wait to high
gettimeofday(&tv1, NULL); // 获取Echo高电平时的时间
while(!(digitalRead(Echo) == 0)); // wait to low
gettimeofday(&tv2, NULL); // get time of day获取Echo低电平时的时间
start = tv1.tv_sec * 1000000 + tv1.tv_usec; // (秒.微妙) 1us = 10^(-6)s,把秒换算成微秒+微秒
stop = tv2.tv_sec * 1000000 + tv2.tv_usec; // (2019.hh.min.sec.usec也就是2019年x点x分x秒x微秒)
// 换算成sec.usec的格式。所以sec和usec是一个整体。
disFront = (((float)(stop - start) / 1000000) * 34000) / 2; // us换算成s,m/s换算成cm/s,然后求出距离
//disFront = (pulseIn(Echo, HIGH) / 2) * 0.0344; // 距离 =(传播时间/2)x 声速
// 声速为:344 m/s = 0.0344 cm/us = 1/29.07 cm/us
// 距离 = 传播时间/58.15
//disFront = (disFront * 100.0) / 100.0; // 保留两位小数。
return disFront;
}
int main(void)
{
wiringPiSetup();
if (-1 == wiringPiSetup())
{
printf("Setup wiringPi failed!");
return 1;
}
IO_UltraInit();
while(1)
{
disFront = disMeasure();
printf("disFront = %0.2f cm...\n",disFront);
delay(1000);
}
return 0;
}