模块认识和硬件接线
回顾之前关于超声波测距模块的学习:
使用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时,蜂鸣器就会开始报警