基于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
分享
二维码
< <上一篇
下一篇>>