香橙派使用外设驱动库wiringOP 配合时间函数来驱动测距模块

模块认识和硬件接线

回顾之前关于超声波测距模块的学习:

使用HC-SR04实现超声波测距_hcsr04测距范围_mjmmm的博客-CSDN博客

并再次回顾香橙派的物理引脚对应:

 所以这里,将VCC接到 2,GND接到 9,Trig接到 16,Echo接到 18 这里都是物理引脚编号

时间函数

测距的基本原理就是算时间,根据时间来推出距离,所以时间的计算尤为重要。

在以前使用52或32单片机开发时,时间的计算由定时器来完成,但是香橙派的定时器我现在还没有学到,所以可以使用Linux自带的时间函数来解决这个问题

需要添加的库:

#include<sys/time.h>

函数原型:

int gettimeofday(struct timeval *tv,struct timezone *tz )

函数参数:

  • tv:一个指向 名为timeval的结构体 的指针
  • tz:一个指向 名为timezone的结构体 的指针,如果不关心时区信息就写NULL

gettimeofday函数会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中

struct timeval{
    long tv_sec;/*秒*/
    long tv_usec;/*微妙*/
};

代码验证:

time_test.c:

 //计算程序在当前环境中数数10万次耗时多少
#include <sys/time.h>
#include <stdio.h>
//int gettimeofday(struct timeval *tv,struct timezone *tz )

void mydelay() //数10W次的函数
{
    int i,j;
    for(i=0;i<100;i++){
         for(j=0;j<1000;j++);
    }
 }
 
int main()
{
     struct timeval startTime;
     struct timeval stopTime;
     gettimeofday(&startTime,NULL); //获取开始数时的时间
     mydelay(); //数10W次
     gettimeofday(&stopTime,NULL); //获取数完时的时间

     long diffTime = 1000000*(stopTime.tv_sec - startTime.tv_sec) + (stopTime.tv_usec - startTime.tv_usec); //秒之所以要乘以1000000是因为后面加了微妙,所以要将秒转化为微秒

     printf("全志H6的Linux数100000耗时%ldus\n",diffTime);
     return 0;
}

在以后的学习中,Linux的这个自带的时间函数还可以用来比较程序运行的效率!

代码编写

小插曲:delay 和 sleep的区别

延时函数名称sleep和delay的区别_delay和sleep_曾经我是菜的博客-CSDN博客

dist_test.c: 

#include <stdio.h>
#include <wiringPi.h>
#include <sys/time.h>

#define BEEP 2
#define Trig 9
#define Echo 10

void startHC() //先要给Trig一个至少10us的高电平方波
{
	digitalWrite (Trig, LOW) ;
	delay(5); //5us
	digitalWrite (Trig, HIGH) ;
	delay(5);
	delay(5);
	digitalWrite (Trig, LOW) ;
}

int main (void)
{
	double diffTime;
	double dist;
	struct timeval startTime;
	struct timeval stopTime;

	wiringPiSetup () ; 
	pinMode (Trig, OUTPUT); 
	pinMode (Echo, INPUT);
	pinMode (BEEP, OUTPUT);

	digitalWrite (Trig, LOW) ;
	digitalWrite (Echo, LOW) ;

	while(1){
		startHC();
		while(digitalRead(Echo) == 0);//程序会卡在这里直到Echo变高的一瞬间
		gettimeofday(&startTime,NULL);
		while(digitalRead(Echo) == 1); //程序会卡在这里直到Echo变低的一瞬间
		gettimeofday(&stopTime,NULL);

		diffTime = 1000000*(stopTime.tv_sec - startTime.tv_sec) + (stopTime.tv_usec - startTime.tv_usec);
		dist = 0.034 * diffTime * 0.5;

//		printf("time = %f us\n",diffTime);
//		printf("dist = %f\n",dist);

		if(dist < 10){
			digitalWrite (BEEP, LOW) ;
			delay(100);
			digitalWrite (BEEP, HIGH) ;
		}else{
			digitalWrite (BEEP, HIGH) ;
		}

	}


	return 0;

运行效果:

当测距模块检测到距离小于10cm时,蜂鸣器就会开始报警

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值