摘要:本项目主要基于XIAO ESP32S3主控,通过扩展板以及超声波测距模块,实现对液位距离的采集、OLED屏幕数据显示、按键启停控制与深度休眠低功耗待机等功能;
一、硬件介绍
1、主控开发板
使用的是XIAO ESP32S3开发板,集成ESP32S3 32位双核处理器芯片,最高运行频率240MHz,板载8MB PSRAM和8MB FLASH;

功能引脚示意图

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

主要特性

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

主要特性

二、功能实现
1、硬件搭建
将XIAO ESP32S3开发板放置在扩展板上,以及将超声波测距模块通过Grove接口连接到扩展板上,同时将外部锂电池通过扩展板的板载锂电池接口进行连接,用于供电;
实物搭建效果


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、点击 上传 烧录程序到开发板上;

五、效果演示
1、测距模式 / 休眠模式;
通过板载USER按键进行切换;

2、液位测距效果
通过往容器中加入液体,并测得当前液位的高度;
初始容器(无液)高度:8.06 cm

加入液位高度 ≈ 2.8cm
理论测得距离 = 8.06 − 2.8 = 5.26 cm
稳定后实际测得:5.66 cm
测量偏差约:5.66 − 5.26 = 0.4 cm

我要赚赏金
