【ESP32开发 传感器】| 使用HC-SR04超声波传感器, 读取测量距离

本次试验使用Arduino ESP32-S 开发板

使用HC-SR04超声波传感器

注意事项/前要

HC-SR04是一款广泛使用的非接触式超声波传感器,它能够测量一个物体的距离而无需物理接触。其工作原理是发射一个超声波脉冲,然后听取该脉冲的回声。通过计算声波被发射和接收的时间差,可以计算出距离。

以下是HC-SR04超声波传感器的一些关键特性:

  • 工作电压:一般为5V直流电。
  • 工作频率:大约40kHz。
  • 测量范围:从2cm到400cm,有较好的准确性。
  • 接口:四个引脚(VCC, TRIG, ECHO, GND)。
  • 分辨率:约0.3cm。

在使用HC-SR04时,首先向TRIG引脚发送至少10微秒的高电平脉冲,以启动超声波脉冲的发射。然后模块自动发射8个40kHz的超声波,并检测是否有回声。如果回声被检测到,ECHO引脚输出一个高电平脉冲,脉冲的持续时间与声波往返传感器与物体的时间成正比。通过测量这个时间,可以根据声速计算出传感器到物体的距离。

HC-SR04在机器人、障碍物避让系统、自动化工程等领域有很多应用。它因成本低、易于使用和相对准确而受到许多开发者和爱好者的青睐。

模块与开发板接线

首先,将HC-SR04超声波传感器与ESP32连接。HC-SR04模块通常有四个引脚:VCC、Trig(触发器)、Echo(回声)、和GND。

请注意,HC-SR04的Echo引脚输出的是5V信号。如果ESP32无法直接输入5V,你可能需要使用电平转换器,以避免损坏ESP32。

超声波传感器 模块引脚Arduino ESP32 引脚
VCC3.3V or 5V
TrigPinGPIO 5
EchoPinGPIO 18
GNDGND

以下是模拟接线图

完整代码/实际执行

  • 代码中delay(1000);用于控制测量的频率,避免过于频繁地测量。
  • pulseIn()函数用于测量Echo引脚高电平的持续时间,即超声波发射后反射回来的时间。这个时间乘以声速(以厘米/微秒为单位),再除以2,就得到了从传感器到障碍物再返回传感器的距离。
  • 在实际应用中,可能需要添加错误检查,比如检查pulseIn()的返回值是否为0(超时),以处理超出测量范围的情况。
// 定义Trig和Echo引脚
const int trigPin = 5;
const int echoPin = 18;

// 定义声速 cm/us
const float speedOfSound = 0.0343;

void setup() {
  // 初始化串口通信
  Serial.begin(115200);
  // 设置Trig引脚为输出,Echo引脚为输入
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  // 清除Trig引脚状态
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // 产生一个10微秒的高电平脉冲到Trig引脚
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  // 读取Echo引脚,返回声波往返时间(微秒)
  long duration = pulseIn(echoPin, HIGH);
  
  // 计算距离
  float distance = duration * speedOfSound / 2; // 距离=时间*声速/2
  
  // 打印距离
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");
  
  // 每秒测量一次
  delay(1000);
}

 

<think>好的,用户想了解如何将ESP32HC-SR04超声波模块、YD-A1雨滴传感器、SEN0193火焰传感器以及MQ-135空气质量传感器联合使用,并提供示例代码。首先,我需要整理每个传感器的工作原理、连接方式以及数据读取方法。 首先,HC-SR04超声波模块通常使用Trig和Echo引脚,通过发送超声波并计算回波时间测量距离。YD-A1雨滴传感器一般是模拟输出,检测雨滴的存在。SEN0193火焰传感器可能输出数字或模拟信号,用于检测火焰或红外光源。MQ-135空气质量传感器需要模拟输入来检测气体浓度,可能需要预热时间。 接下来,硬件连接部分需要确定ESP32的GPIO引脚分配。确保每个传感器的VCC和GND正确连接,注意电压是否匹配,可能需要使用3.3V或5V。例如,HC-SR04的Trig和Echo连接到GPIO 5和18,YD-A1接到GPIO 34(模拟输入),SEN0193接到GPIO 35,MQ-135接到GPIO 36。 然后是代码部分,需要初始化各个引脚,设置串口通信,并在主循环中循环读取各个传感器的数据。对于HC-SR04,需要发送脉冲并测量高电平时间来计算距离。雨滴、火焰和空气质量传感器可能需要读取模拟值或数字值,并进行相应的处理。注意MQ-135可能需要校准和预热,代码中可能需要加入延时或平均值计算以提高稳定性。 还需要考虑用户可能的后续问题,例如传感器校准、数据融合、电源管理或无线通信等。示例代码应该简洁明了,注释清晰,方便用户理解。同时,提醒用户注意传感器的电压兼容性,避免损坏ESP32。 最后,生成相关问题,帮助用户深入理解,例如传感器校准方法、多任务处理优化、数据可视化等。确保回答结构清晰,步骤明确,引用相关资源。</think># ESP32传感器联合应用教程 ## 一、硬件连接配置 1. **引脚分配表** | 传感器 | ESP32引脚 | 接口类型 | |---------------|-----------|----------| | HC-SR04 Trig | GPIO5 | 数字输出 | | HC-SR04 Echo | GPIO18 | 数字输入 | | YD-A1雨滴 | GPIO34 | 模拟输入 | | SEN0193火焰 | GPIO35 | 模拟输入 | | MQ-135空气质量 | GPIO36 | 模拟输入 | 2. **连接注意事项** - 所有传感器VCC接3.3V或5V(需确认传感器规格) - 共地连接至关重要 - 建议使用独立电源供电时做好电平转换 ## 二、示例代码实现 ```cpp #include <Arduino.h> // 超声波引脚定义 #define TRIG_PIN 5 #define ECHO_PIN 18 // 传感器模拟输入引脚 #define RAIN_PIN 34 #define FLAME_PIN 35 #define AIR_PIN 36 void setup() { Serial.begin(115200); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); } float getDistance() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); long duration = pulseIn(ECHO_PIN, HIGH); return duration * 0.034 / 2; // 计算距离(cm) } void loop() { // 读取超声波数据 float distance = getDistance(); // 读取雨量数据(模拟值0-4095) int rainValue = analogRead(RAIN_PIN); // 读取火焰强度(值越小表示火焰越强) int flameValue = analogRead(FLAME_PIN); // 读取空气质量(需校准) int airQuality = analogRead(AIR_PIN); // 输出数据 Serial.print("Distance: "); Serial.print(distance); Serial.print(" cm | "); Serial.print("Rain: "); Serial.print(rainValue); Serial.print(" | "); Serial.print("Flame: "); Serial.print(flameValue); Serial.print(" | "); Serial.print("Air: "); Serial.println(airQuality); delay(1000); } ``` ## 三、传感器校准说明 1. **MQ-135校准**: - 预热时间至少24小时 - 计算公式参考: $$ R_{s} = \frac{V_{c} - V_{rl}}{V_{rl}} \times R_{l} $$ 其中$V_{c}$为传感器电压,$V_{rl}$为负载电压,$R_{l}$为负载电阻[^1] 2. **雨量传感器标定**: - 完全干燥时记录最大值 - 喷水测试建立对应关系表 ## 四、数据处理建议 1. 采用滑动窗口滤波: ```cpp #define SAMPLE_SIZE 10 int smoothData(int pin) { int total = 0; for(int i=0; i<SAMPLE_SIZE; i++){ total += analogRead(pin); delay(10); } return total/SAMPLE_SIZE; } ``` 2. 多任务处理建议使用FreeRTOS任务调度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值