arduino-超声波测距

  

       Arduino是一款便捷灵活、方便上手的开源电子原型平台。如果玩过51或者stm32的同学肯定会认为arduino是一款非常非常简单的开发入门单片机。非常适合没有系统学过编程和电气知识的人群作为单片机入门的一个法宝,可以说是能够0基础上手。大笑


arduino不同于51或者stm32,它可以完全不需要了解其内部硬件结构和寄存器设置,仅仅知道它的端口作用即可,可以不懂硬件知识,只要会简单的C语言,就可用Arduino 单片机编写程序。


比如51单片机要设置一个寄存器要设置好多管脚,但是arduino全都给我们包装好了,我们只要知道端口作用即可,往往51单片机要写几十行甚至上百行的代码,arduino一句语句就搞定了。


但是正是arduino的简便性,内部硬件结构和寄存器设置都不需要自己来设置,大大限制了它的能力。大哭也注定了它的功能和效率是和其他单片机没办法比的。  很多工程师不喜欢arduino,因为它简单,很多功能都不能达到最优化。   生气 个人认为:arduino适合没有单片机基础的人用于学习51,stm32之前的入门和兴趣培养是非常非常好的一个平台,也是对于一些非本专业的人士自己DIY一些创意电子产品的最佳选择!!!


言归正传,今天来分享一个arduino超声波测

### 使用 Arduino HC-SR04 进行超声波测距 HC-SR04 是一种常用的超声波传感器,能够测量物体的距离。通过连接到 Arduino 的数字引脚,可以实现精确的测距功能。 #### 硬件连接 为了使 HC-SR04 正常工作,需将其 VCC 接入 5V 或者 Arduino 的电源端子,GND 接地;TRIG 引脚用于触发信号发送,应接入 Arduino 的一个数字输出引脚(通常为 D8),而 ECHO 引脚则接收返回信号,建议连接至另一个数字输入引脚(通常是 D9)。这种配置允许 Arduino 控制并读取来自传感器的数据[^1]。 #### 示例代码:基本测距程序 以下是未加入任何滤波处理的基础版本代码: ```cpp #define TRIGGER 8 // 定义触发引脚 #define ECHO 9 // 定义回响引脚 long duration; // 存储脉冲时间变量 float distance; // 记录实际距离 // 设定最大探测范围 (单位: 厘米) const float MAX_DISTANCE = 200; const unsigned long TIMEOUT_MICROSECONDS = static_cast<unsigned long>(MAX_DISTANCE * 2 / 0.034); void setup() { pinMode(TRIGGER, OUTPUT); // 设置触发引脚为输出模式 pinMode(ECHO, INPUT); // 设置回响引脚为输入模式 Serial.begin(9600); // 初始化串口通信波特率设为 9600bps } void loop() { digitalWrite(TRIGGER, LOW); delayMicroseconds(2); // 将触发引脚置低电平持续至少 2 微秒 digitalWrite(TRIGGER, HIGH); delayMicroseconds(10); // 发送高电平脉冲保持约 10 微秒激活超声发射器 digitalWrite(TRIGGER, LOW); duration = pulseIn(ECHO, HIGH, TIMEOUT_MICROSECONDS); // 测量回响时间为多少微秒 distance = duration * 0.034 / 2; // 转化成厘米数 if (distance > 0 && distance <= MAX_DISTANCE) { // 如果检测有效,则打印数值 Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); } else { Serial.println("Out of range or error"); // 否则提示超出范围或者错误情况发生 } delay(100); // 每次循环间隔 100ms 避免频繁操作影响精度 } ``` 此段代码实现了基础的功能需求,即利用 HC-SR04 对目标物进行连续不断的距离测定,并把结果经由串口传输显示出来[^1]。 #### 数据过滤改进方案 对于更复杂的应用场景来说,仅依靠原始采集值可能不够稳定可靠,因此引入简单的平均法或其他高级算法来提升最终输出质量是非常必要的。下面给出了一种基于滑动窗口均值的方法作为参考实例之一: ```cpp #include <SimpleKalmanFilter.h> #define TRIGGER_PIN 8 #define ECHO_PIN 9 int sampleSize = 5; float samples[sampleSize]; unsigned int timeout_us = ((long)(200 * 2 * 29)) ; SimpleKalmanFilter kalmanFilter(1., .01f , .1f ); void setup(){ ... } void loop(){ ... for(int i=0;i<sampleSize;i++)samples[i]=getFilteredValue(); float avg=sum(samples)/sampleSize; Serial.println(avg); delay(100); } float getFilteredValue(){ long dur=pulseIn(ECHO,HIGH,timeout_us ); double dist=dur*.034/2.; return kalmanFilter.updateEstimate(dist); } ``` 该部分扩展了原生逻辑,增加了卡尔曼滤波器以减少噪声干扰的影响,从而获得更加平稳的结果表现[^1]。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值