基于ESP-IDF的ESP32使用HC-SR04超声波测距示例
本文使用的是ESP32 DEVKIT V1开发板
HC-SR04接线图
如下图,VCC直接接入5V,Trig接G4,Echo接G5,剩下接GND。
原理
在模块的Trig端给个10us以上的脉冲,模块内部会自己发出声波,只需要在Echo端检测高电平到来,记录高电平持续的时间,声波在空气传播的速度340m/s,路程=时间x速度。
流程图
代码部分
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#include "esp32/rom/ets_sys.h"
//定义引脚
#define Trig 4
#define Echo 5
int64_t star=0;
int64_t endTime=0;
esp_timer_handle_t ceju=0; //定时器句柄
void timer_once(void *arg); //回调函数
void app_main(void)
{
esp_timer_create_args_t once_test={ //定时器结构体初始化
.callback= &timer_once,
.arg=NULL,
.name="HC_SR04Timer"
};
//设置Trig引脚为输出模式 Echo引脚为输入模式//
gpio_pad_select_gpio(Trig);
gpio_pad_select_gpio(Echo);
gpio_set_direction(Trig,GPIO_MODE_OUTPUT);
gpio_set_direction(Echo,GPIO_MODE_INPUT);
while(1){
esp_timer_init(); //初始化
esp_timer_create(&once_test,&ceju); //创建定时器
//开始时Trig引脚先拉低20us,保证不被干扰
gpio_set_level(Trig,0);
ets_delay_us(20);
//然后拉高Trig至少10us以上
gpio_set_level(Trig,1);
ets_delay_us(10);
//再拉低Trig,完成一次声波发出信号
gpio_set_level(Trig,0);
//检测Echo引脚,一直为低电平就一直在等待
while(gpio_get_level(Echo)==0){
}
//Echo低电平结束后,定时器开始一个单个周期工作,到达1740us就回调函数
esp_timer_start_once(ceju,1740);
ets_delay_us(1);//延时1微秒
//获取当前时间 记录当前时间star为Echo引脚变高的开始时间
star=esp_timer_get_time();
while(gpio_get_level(Echo)==1){
endTime=esp_timer_get_time(); //记录Echo引脚变为低电平的结束时间
//注意,一定要把结束时间的代码放到循环里面,如果放到循环外面可能不能正常测距
}
//计算Echo引脚高电平持续的时间
endTime=endTime-star;
//计算距离,时间单位为us
double cm=((double)endTime/58.0);
printf("%lf cmn",cm);//输出数据
esp_timer_delete(ceju); //删除定时器,等下次循环再开启
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
//定时器回调函数,作为超时处理
void timer_once(void *arg)
{
int64_t tick=esp_timer_get_time();
printf("定时器开始时间已有=%lld rn",tick);
esp_timer_delete(ceju);
}
本文使用的代码可能存在一些缺陷,不一定正确,仅供参考,但是思路都是一样的,有51基础的同学能快速上手,希望能帮助一些想学习ESP32的同学。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码