这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 低功耗超声波液位测距仪(ESP32S3)

共4条 1/1 1 跳转至

低功耗超声波液位测距仪(ESP32S3)

助工
2026-08-11 22:26:54     打赏

摘要:本项目主要基于XIAO ESP32S3主控,通过扩展板以及超声波测距模块,实现对液位距离的采集、OLED屏幕数据显示、按键启停控制与深度休眠低功耗待机等功能;


一、硬件介绍

1、主控开发板

使用的是XIAO ESP32S3开发板,集成ESP32S3 32位双核处理器芯片,最高运行频率240MHz,板载8MB PSRAM和8MB FLASH;


1786456858577556.png


功能引脚示意图

1786456928453703.png


2、扩展底板

一款支持XIAO系列的功能扩展板,具有丰富的外设:包括OLED、RTC、可扩展内存、无源蜂鸣器、RESET/用户按钮、5V舵机连接器等;


1786457069152546.png


主要特性


1786457112315708.png


3、超声波测距模块

Unit Ultrasonic-IO是一款GPIO接口的超声波测距传感器,硬件采用RCWL-9620超声波测距单芯片搭配16mm探头,能够实现2cm-450cm范围内的测距;

1786457251105125.png


主要特性

1786457291922753.png



二、功能实现

1、硬件搭建

将XIAO ESP32S3开发板放置在扩展板上,以及将超声波测距模块通过Grove接口连接到扩展板上,同时将外部锂电池通过扩展板的板载锂电池接口进行连接,用于供电;



实物搭建效果

1786457348371117.png


image-20260811210416488.png

 

2、功能效果

开发板上电默认处于测距模式,通过板载USER按键,可实现深度休眠低功耗待机;


测距模式:将超声波测距模块检测到的数据,实时显示在扩展板的OLED屏幕上;

休眠模式:在测距模式下,通过按下板载的USER按键,开发板进入深度休眠状态(降低整体功耗);

唤醒状态:在休眠状态下,通过按下板载的USER按键,开发板重新进入测距模式;




三、代码编写

上电启动:runState=1,OLED测距显示;

第一次按下USER按键:runState=0,关闭OLED,进入深度休眠;

休眠状态下,按下USER按键 芯片唤醒,重新开始测距;


主要相关代码

#include <U8x8lib.h>		// 屏幕驱动库
#include <Wire.h>
#include <Unit_Sonic.h>		// 超声波模块库
#include "esp_sleep.h"
#include "driver/rtc_io.h"

SONIC_IO sensor;
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA );

static float Distance = 0;
char buf[16];

#define USER_BTN        GPIO_NUM_2
int runState = 1;        // 1=测距  0=深度休眠

// 测距
void getDistance(){
  Distance = sensor.getDistance();  //单位 mm
  if ((Distance < 4500) && (Distance > 20)) {
    Distance = Distance / 10.00; // mm → cm
    Distance = round(Distance*100)/100.0f; //四舍五入 
    u8x8.setCursor(2,1);  
    sprintf(buf,"%.2f",Distance);
    u8x8.print(buf);
    u8x8.print("  "); 
    u8x8.setCursor(10,4); 
    u8x8.print("cm");
    Serial.print("距离:");
    Serial.println(Distance);
  } 
   delay(300);
}

// 进入深度休眠
void enterDeepSleep(void)
{
  u8x8.clear();
  u8x8.noDisplay();
  // 深度休眠期间保持内部上拉
  rtc_gpio_init(USER_BTN);
  rtc_gpio_pullup_en(USER_BTN);
  rtc_gpio_pulldown_dis(USER_BTN);

  // EXT1唤醒
  uint64_t wake_mask = 1ULL << USER_BTN;
  esp_sleep_enable_ext1_wakeup(wake_mask, ESP_EXT1_WAKEUP_ANY_LOW);
  Serial.println("====进入深度休眠  按USER按键唤醒====");
  Serial.flush();
  esp_deep_sleep_start();   //进入休眠
}

void setup(void) {
  Serial.begin(115200);
  u8x8.begin();
  u8x8.setFlipMode(0);
  u8x8.setFont(u8x8_font_courB18_2x3_r);
  sensor.begin(D6, D7);  // TRIG:D6  ECHO:D7
  pinMode(USER_BTN, INPUT_PULLUP);
    
  esp_sleep_wakeup_cause_t wake_cause = esp_sleep_get_wakeup_cause();
  if(wake_cause == ESP_SLEEP_WAKEUP_EXT1){
    Serial.println("按键唤醒,开启测距模式");
    runState = 1;
  }
}

void loop(void) {
  int buttonState = digitalRead(USER_BTN);
  // 按键按下检测
  if (buttonState == LOW)
  {
    delay(20);
    if(digitalRead(USER_BTN) == LOW)
    {
      while(digitalRead(USER_BTN) == LOW){
        delay(10);
      }
      runState = !runState;
      if(runState == 0){
        enterDeepSleep();
      }
    }
  }

  if(runState == 1){
    getDistance();
  }
}




四、程序烧录

1、连接USB数据线至开发板;

2、选择端口号对应的开发板;

3、点击 上传 烧录程序到开发板上;


image-20260805224812467.png




五、效果演示

1、测距模式 / 休眠模式;

通过板载USER按键进行切换;

休眠模式.gif


2、液位测距效果

通过往容器中加入液体,并测得当前液位的高度;


初始容器(无液)高度:8.06 cm

image-20260811172431724.png


加入液位高度 ≈ 2.8cm

理论测得距离 = 8.06 − 2.8 = 5.26 cm


稳定后实际测得:5.66 cm

测量偏差约:5.66 − 5.26 = 0.4 cm


演示效果


image-20260811165554508.png












关键词: 超声波测距     ESP32S3    

专家
2026-08-12 07:24:05     打赏
2楼

谢谢分享


助工
2026-08-12 10:01:54     打赏
3楼

超声波测距也可以测量液位高度了啊?


院士
2026-08-12 14:33:46     打赏
4楼

这就是传说中的超声波液位仪的实现原理吧!


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]