【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);
}

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Arduino编写的水位超限设定代码,使用HC-SR04传感器检测水位,当水位超过设定值时,通过ESP8266 WiFi模块将信息发送到OneNet平台: ```arduino #include <SoftwareSerial.h> #include <ESP8266WiFi.h> #include <OneNet.h> const char* ssid = "YOUR_SSID"; const char* password = "YOUR_PASSWORD"; const char* apiKey = "YOUR_API_KEY"; const char* deviceId = "YOUR_DEVICE_ID"; const int trigPin = 2; const int echoPin = 3; const int threshold = 10; // 水位超限设定值,单位为厘米 SoftwareSerial esp8266(7, 8); // RX, TX void setup() { Serial.begin(9600); esp8266.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } OneNet.begin(apiKey); } void loop() { float duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = duration * 0.034 / 2; Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); if (distance > threshold) { Serial.println("Water level exceeded!"); String data = "{\"water_level\":\"exceeded\"}"; if (OneNet.sendData(deviceId, data)) { Serial.println("Data sent to OneNet!"); } else { Serial.println("Failed to send data to OneNet!"); } } delay(1000); } ``` 在此代码中,首先定义了WiFi网络和OneNet平台的连接信息,以及使用HC-SR04传感器的引脚和水位超限设定值。在`setup()`函数中,初始化串口和WiFi连接,以及OneNet库的连接。在`loop()`函数中,使用HC-SR04传感器检测水位,如果水位超过设定值,则通过ESP8266 WiFi模块将信息发送到OneNet平台。发送的数据格式为JSON格式,其中包括一个键值对`"water_level":"exceeded"`,表示水位已经超过设定值。 需要注意的是,使用ESP8266 WiFi模块发送数据时,需要在OneNet平台上创建一个设备,并获取设备ID和API Key。在此代码中,设备ID和API Key需要替换为自己的信息。另外,还需要在OneNet平台上创建一个数据流,用于接收水位超限信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值