HC-SR004型号超声波
超声波传感器模块上面通常有两个超声波期间,一个发射,一个用于接收,电路板上有四个引脚,vcc,gnd,trig,echo.
主要参数:
- 工作电压和电流:5V,15mA
- 感测角度:不大于15°
- 被测物的面积不要小于50cm²并且要平整
- 具备温度补偿电路
原理:给Trig一个10us的TTL(高电斌),这是Trig会在空气中发一个方形波。
这时Echo会产生高电频且所持续时间就是,超声波在空气中所持续时间。
其中的函数讲解:
1.strcut timeval结构体,gettimeofday()函数
(1) struct timeval是在linux中的一个关于时间的定义,在time.h中进行定义,原型是:
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
tv_sec | 代表着秒 |
---|---|
tv_usec | 代表着微妙 |
(2)原型为int gettimeofday(struct timeval *tv, struct timezone *tz)
用法:得到当前的时间
头文件是#include <sys/time.h>
struct timeval *tv | 存放着上面时间结构体的地址 |
---|---|
struct timezone *tz | 得到当前的时区,一般就是NULL |
2.延时函数
delay(ms) | 毫秒级延时函数 |
---|---|
delayMicroseconds(us) | 微妙级延时函数 |
3.int digitalRead(int pin)函数
pin是引脚号:
作用:就是将当前引脚的电平返回HIGH/LOW,HIGH为1,LOW为0,如果当前引脚没有设置的话随机返回一个值
4.其中while();就是while(){ ;}
编程示例
#include<stdio.h>
#include<wiringPi.h>
#include<sys/time.h>
#define Trig 28
#define Echo 29
void ultraInit()
{
pinMode(28,OUTPUT);//给Trig一个输出定义
pinMode(29,INPUT);//给Echo一个输入用于接收
}
int disMeasure()
{
struct timeval val1;
struct timeval val2;
long start,stop;
float dis;
digitalWrite(Trig,LOW);//给Trig一个低电斌
delayMicroseconds(2);//延时2秒低电平
digitalWrite(Trig,HIGH);
delayMicroseconds(10); //创造一个方形波
digitalWrite(Trig,LOW);
while(!(digitalRead(Echo)==1));//当电平为低时,以上代码循环,到高时退出
gettimeofday(&val1,NULL);//得到高电平开始时间
while(!(digitalRead(Echo)==0));
gettimeofday(&val2,NULL);
start=val1.tv_sec*1000000+val1.tv_usec;
stop=val2.tv_sec*1000000+val2.tv_usec;
dis=(float)(stop-start)*34000/2000000;
return dis;
}
int main()
{
float dis;
if(wiringPiSetup()==-1){
printf("硬件初始化错误\n");
}
ultraInit();
while(1){
dis=disMeasure();
printf("距离是%0.2fcm\n",dis);
delay(1000);
}
return 0;
}