目录
一、HC-SR04简介
①:实物图
二、时序图
解读:时序图表明首先ECHO引脚需要提供一个10uS以上脉冲触发信号,然后该模块内部将自动发出8个40kHz周期电平并检测回波。TRIG引脚一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。通过发射信号到收到的回响信号时间间隔可以计算得到距离。
公式:uS/58=厘米或者uS/148=英寸;或是:距离=高电平时间*声速(340M/S)/2;
测量周期:60ms以上。
三、软件代码
/*
功能:树莓派超声波测距
*/
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
typedef unsigned long uint32;
int ECHO = 1;
int TRIG = 7;
/*********************
函数:超声波测距函数
阐述:根据超声波的时序图、编写超声波模块工作
return:计算的距离(测试距离=高电平时间*声速(340m/s)/2)
*********************************************/
uint32_t Wave_gave_diastance()
{
uint32_t t=0;
//1:通信开始
digitalWrite(ECHO, 1); //Pin29输出高电平
delayMicroseconds(20); //延时10us
digitalWrite(ECHO, 0); //Pin29输出低电平
//2.等待超声波模块测距完毕,标志性的动作就是回响信号引脚从输出低电平变为输出高电平
while(digitalRead(TRIG)==0)
{
delayMicroseconds(1);
t++;
//超时处理
if(t >= 1000000)
{
return -1;
}
}
//3.测量引脚的高电平时间,该高电平的持续时间就是超声波模块的传输时间
t=0;
while(digitalRead(TRIG))
{
delayMicroseconds(9); //9us == 3mm
t++;
//超时处理
if(t >= 1000000)
{
return -2;
}
}
//4.将时间转换为距离
return t*3/2;
}
int main(void)
{
uint32_t distance=0; //距离变量
if(wiringPiSetup()==-1)
{
return 1;
}
pinMode(ECHO,OUTPUT);
pinMode(TRIG,INPUT);
while(1)
{
distance=Wave_gave_diastance();//距离赋值
if(distance>20&&distance<4000)
{
printf("距离:%dmm\r\n",distance);
}
else
{
printf("distance error\n");
}
delay(1000);
}
return 0;
}