SaintStefan
12/21/2019 - 9:51 AM

基于树莓派的超声波测距

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