树莓派之超声波模块测距

在使用超声波模块测距之前,需要了解一下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;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值