Arduino+STM32+超声波模块RCWL-1605、HC-SR04

超声波模块有很多型号,如 HC-SR04、HY-SRF05、RCWL-1605 等,但基本上都用到四根引脚:VCC、GND、Trigger 触发引脚、Echo 回声引脚。

工作原理:给 Trigger 引脚一个 10 微秒以上的高电平,然后监听 Echo 引脚发出的的高电平脉冲宽度 t,这个时间 t 就是声音从发出到返回的耗时,再乘以声音的速度就得到距离(是来回的距离所以还要除以 2)。

本程序基于 STM32F103 芯片,但用的是 Arduino 开发框架。主程序很简单:

const int EchoPin = PA6;    //超声波模块Echo引脚
const int TriggerPin = PA7; //超声波模块Trigger引脚
const int LED = PA1;        //用于显示距离太近的LED灯
HardwareSerial Serial1(PA10, PA9);  //串口输出用于调试

float distance;   //检测到的距离

//通过Trigger引脚发送高电平信号,再检测Echo引脚的高电平时间,得到距离(厘米)
float getDistance() {
  digitalWrite(TriggerPin, HIGH);
  delayMicroseconds(10);  //高电平保持10微秒以上再拉低
  digitalWrite(TriggerPin, LOW);
  float duration = (float)pulseIn(EchoPin, HIGH);  //获取Echo引脚高电平保持时间,单位是微秒(1us=0.000001s)
  return duration * 0.017;  //声速340m/s,来回要除以2得170,还要转换微秒、厘米
}

void setup() {
  pinMode(EchoPin, INPUT);
  pinMode(TriggerPin, OUTPUT);
  pinMode(LED, OUTPUT);
  Serial1.begin(115200);
}

void loop() {
  distance = getDistance();
  analogWrite(LED, (distance < 30) ? 200 : 255);  //懒得加限流电阻,直接改电压,小于30厘米就亮
  // Serial1.print(distance);
  // Serial1.println(" cm");
  delay(200); //延时至少30毫秒以防上次回波的干扰
}

如果不用 pulseIn(),可以手动判断:

// 不用pulseIn的写法(效果同上,可忽略)
float getDistance2(){
  digitalWrite(TriggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TriggerPin, LOW);
  unsigned long duration = millis();
  while(!digitalRead(EchoPin)){}
  duration = micros();
  while(digitalRead(EchoPin)){}
  duration = micros() - duration;
  return ((float)duration) * 0.017;
}
posted @ 2025-04-29 20:38  Hemmelfort  阅读(158)  评论(0)    收藏  举报