目录

前言

程序

1.无滤波程序

2.低通滤波器滤波程序

3.低通滤波器滤波程序(弃掉高幅噪声)

4.中位值滤波

5.中位值平均滤波

总结


前言

传感器的接线非常简单,一共四根线

vcc和gnd按照要求接线即可。TRIG接数字引脚8号口,ECHO接数字引脚9号口。

程序

1.无滤波程序

#define TRIGGER 8
#define ECHO 9
long duration;
float distance;#define LONGEST_DISTANCE 200 // 200 cm = 2 meters
float farTime =  LONGEST_DISTANCE*2/0.034;void setup() {pinMode(TRIGGER, OUTPUT); // Sets the trigPin as an OutputpinMode(ECHO, INPUT); // Sets the echoPin as an InputSerial.begin(57600); // Starts the serial communication
}long counter=0;
void loop() {// Clears the trigPindigitalWrite(TRIGGER, LOW);delayMicroseconds(2);// Sets the trigPin on HIGH state for 10 micro secondsdigitalWrite(TRIGGER, HIGH);delayMicroseconds(10);digitalWrite(TRIGGER, LOW);// Reads the echoPin, returns the sound wave travel time in microsecondsduration = pulseIn(ECHO, HIGH, farTime);//计算距离(厘米)distance = duration * 0.034 / 2; // 10^-6 * 34000 cm/sSerial.println(distance);delay(10);
}

可以看到,当前方障碍物距离变化时,会产生尖峰,这是噪声,我们需要去掉。

2.低通滤波器滤波程序

我们通过低通滤波器进行滤波,再看看效果。

#define TRIGGER 8
#define ECHO 9
long duration;
float distance;#define LONGEST_DISTANCE 200 // 200 cm = 2 meters
float farTime =  LONGEST_DISTANCE*2/0.034;class LowPassFilte{public:LowPassFilte(float Tf);//低通滤波器时间常量~LowPassFilte() = default;float operator() (float x);float Tf; //!< 低通滤波器时间常量protected:unsigned long timestamp_prev;  //!< 上次执行时间戳float y_prev; //!< 经过上次执行后过滤到的值
};LowPassFilte::LowPassFilte(float time_constant): Tf(time_constant), y_prev(0.0f)
{timestamp_prev = micros();
}float LowPassFilte::operator() (float x)
{unsigned long timestamp = micros();float dt = (timestamp - timestamp_prev)*1e-6f;if (dt < 0.0f || dt > 0.5f)dt = 1e-3f;float alpha = Tf/(Tf + dt);float y = alpha*y_prev + (1.0f - alpha)*x;y_prev = y;timestamp_prev = timestamp;return y;
}LowPassFilte us_filter(0.1);void setup() {pinMode(TRIGGER, OUTPUT); // Sets the trigPin as an OutputpinMode(ECHO, INPUT); // Sets the echoPin as an InputSerial.begin(57600); // Starts the serial communication
}long counter=0;
void loop() {// Clears the trigPindigitalWrite(TRIGGER, LOW);delayMicroseconds(2);// Sets the trigPin on HIGH state for 10 micro secondsdigitalWrite(TRIGGER, HIGH);delayMicroseconds(10);digitalWrite(TRIGGER, LOW);// Reads the echoPin, returns the sound wave travel time in microsecondsduration = pulseIn(ECHO, HIGH, farTime);//计算距离(厘米)distance = duration * 0.034 / 2; // 10^-6 * 34000 cm/s//摒弃突变值Serial.print(distance);Serial.print(",");Serial.println(us_filter(distance));delay(10);
}

可以看到,红色的波形是经过滤波之后的结果,已经变得平滑许多了,但是由于蓝色波形(原始数据)有时会有较大突变,还是会影响我们获取到的结果,我们下一步,将这个突变较大的突变值给弃掉。

3.低通滤波器滤波程序(弃掉高幅噪声)

由于正常情况下,自然界或者传感器的噪声是高频低幅的,因此高幅噪声主要是传感器内部造成的,这些垃圾数据,我们将其摒弃。

#define TRIGGER 8
#define ECHO 9
long duration;
float distance_last;
float distance;#define LONGEST_DISTANCE 200 // 200 cm = 2 meters
float farTime =  LONGEST_DISTANCE*2/0.034;class LowPassFilte{public:LowPassFilte(float Tf);//低通滤波器时间常量~LowPassFilte() = default;float operator() (float x);float Tf; //!< 低通滤波器时间常量protected:unsigned long timestamp_prev;  //!< 上次执行时间戳float y_prev; //!< 经过上次执行后过滤到的值
};LowPassFilte::LowPassFilte(float time_constant): Tf(time_constant), y_prev(0.0f)
{timestamp_prev = micros();
}float LowPassFilte::operator() (float x)
{unsigned long timestamp = micros();float dt = (timestamp - timestamp_prev)*1e-6f;if (dt < 0.0f || dt > 0.5f)dt = 1e-3f;float alpha = Tf/(Tf + dt);float y = alpha*y_prev + (1.0f - alpha)*x;y_prev = y;timestamp_prev = timestamp;return y;
}LowPassFilte us_filter(0.1);
LowPassFilte us_filter1(0.001);long time_last=0;void setup() {pinMode(TRIGGER, OUTPUT); // Sets the trigPin as an OutputpinMode(ECHO, INPUT); // Sets the echoPin as an InputSerial.begin(57600); // Starts the serial communicationdigitalWrite(TRIGGER, LOW);delayMicroseconds(2);// Sets the trigPin on HIGH state for 10 micro secondsdigitalWrite(TRIGGER, HIGH);delayMicroseconds(10);digitalWrite(TRIGGER, LOW);// Reads the echoPin, returns the sound wave travel time in microsecondsduration = pulseIn(ECHO, HIGH, farTime);//计算距离(厘米)distance_last = distance = duration * 0.034 / 2; // 10^-6 * 34000 cm/stime_last=millis();
}
long counter=0;
byte lvbo=0;
void loop() {// Clears the trigPindigitalWrite(TRIGGER, LOW);delayMicroseconds(2);// Sets the trigPin on HIGH state for 10 micro secondsdigitalWrite(TRIGGER, HIGH);delayMicroseconds(10);digitalWrite(TRIGGER, LOW);// Reads the echoPin, returns the sound wave travel time in microsecondsduration = pulseIn(ECHO, HIGH, farTime);//计算距离(厘米)distance = duration * 0.034 / 2; // 10^-6 * 34000 cm/sSerial.print(distance);//摒弃高幅数据if((abs(distance-distance_last))>10){if(lvbo<10){distance = distance_last;lvbo++;}elselvbo=0;}Serial.print(",");Serial.println(us_filter(distance));distance_last = distance;delay(10);
}

可以看到滤波效果非常好, 首先,我们去除了高频低幅噪声,同时也去掉了高频高幅噪声,只剩下了我们的目标值(低频低幅数据),因为正常情况下,障碍物距离我们传感器的位置是均匀低俗变化的。

红色为滤波之后的效果,蓝色为原始数据。

4.中位值滤波

连续采样N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。我这里采样11次。

#define TRIGGER 8
#define ECHO 9
long duration;
float distance;#define LONGEST_DISTANCE 200 // 200 cm = 2 meters
float farTime =  LONGEST_DISTANCE*2/0.034;//中值滤波器
class MidFilter{public:int Sum;MidFilter(int Sum);//数据总数float operator() (float Num[11]);
};MidFilter::MidFilter(int Sum){this->Sum=Sum;
}float MidFilter::operator() (float Num[11]){for(int i=0;i<Sum-1;i++){for(int j=i+1;j<Sum;j++){if((Num[i])>(Num[j])){float t=Num[i];Num[i]=Num[j];Num[j]=t;}}}return Num[(int(Sum/2))];
}//实例化中值滤波器
MidFilter mid5(11);void setup() {pinMode(TRIGGER, OUTPUT); // Sets the trigPin as an OutputpinMode(ECHO, INPUT); // Sets the echoPin as an InputSerial.begin(57600); // Starts the serial communication
}long counter=0;
void loop() {float distance_s[11]={0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};// Clears the trigPinfor(int i=0;i<=10;i++){digitalWrite(TRIGGER, LOW);delayMicroseconds(2);// Sets the trigPin on HIGH state for 10 micro secondsdigitalWrite(TRIGGER, HIGH);delayMicroseconds(10);digitalWrite(TRIGGER, LOW);// Reads the echoPin, returns the sound wave travel time in microsecondsduration = pulseIn(ECHO, HIGH, farTime);//计算距离(厘米)distance_s[i] = duration * 0.034 / 2; // 10^-6 * 34000 cm/s//    Serial.println(distance_s[i]);}
//  Serial.println();
//  Serial.print(distance_s[0]);
//  Serial.print(",");Serial.println(mid5(distance_s));delay(10);
}

滤波效果发现不是很好,还是会出现尖峰和低谷这种情况。不知是否我的代码有问题?

5.中位值平均滤波

总结

我们通过上述第三个程序,可以获得比较理想的滤波后的传感器数据。

但是,从上图中可以看到,我们观察滤波之后的红色波形,相比蓝色波形有一定的滞后性,这个我们如何解决呢?

Arduino读取HC-SR04超声波测距传感器数据附带滤波相关推荐

  1. Arduino与Processing交互-超声波测距传感器的读取与显示

    公众号:STCode 1-超声波测距传感器简介 超声波测距传感器是利用频率高于20kHz的声波在空气中传播,遇到障碍物反射回来,通过计算发射和接收时间差,可以计算出发射点与障碍物间的距离. 超声波测距 ...

  2. Arduino的光敏传感器和超声波测距传感器测试代码

    光敏传感器测试代码 使用的是一个未知名4pin模块, 4pin依次为Vcc, Gnd, DO, AO, 板载一个可调电阻以及一个LED, 调节电阻大小, 可以控制LED亮灭和DO输出变化对光亮的灵敏度 ...

  3. 基于STM32和超声波测距传感器的测距功能设计

    基于STM32和超声波测距传感器的测距功能设计(使用陌生传感器的流程介绍) 引言 项目设计 项目简介 开发工具 硬件设计 软件设计 开发流程 阅读手册 配置并测试传感器相关设置 软件开发 总结 后续 ...

  4. 超声波测距传感器认知

    目录 一.超声波测距传感器认知 二.从零编程实现超声波测距 三.项目--感应开关盖垃圾桶 1.开发步骤 2.感应开关盖垃圾桶代码测试 一.超声波测距传感器认知 超声波测距模块是用来测量距离的一种产品, ...

  5. 超声波测距传感器模块在畜牧业的应用

    我国现代养殖是一种"高投入.高产出.高效益"的产业.资本密集型和劳动集约化是其基本特征.这种集约化的产业耗费了大量的人力和自然资源,并在某种程度上对环境造成负面影响.如今物联网应用 ...

  6. 超声波测距传感器模HG-C40U工作程序图文详解

    超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离. 超声波测距模块有好多种类型,目前比较常用的有URM37超声波传感器默认是232接口 ...

  7. [博创智联]创新创客智能硬件平台——超声波测距传感器

    [博创智联]创新创客智能硬件平台--超声波测距传感器 准备工作 测试环节 编译驱动和测试代码 加载驱动并执行代码 准备工作 烧录原版系统,供电.连接串口线,配置网络,挂载NFS共享,拷贝超声波测距传感 ...

  8. 【HaaS Python硬件积木】HCSR04超声波测距传感器

    来这里发现更多拿来即用的传感器 HaaS开发框架HaaS积木方案,赋能生态开发者,让您快速找到自己需要的解决方案,硬件主板与外设,以及各种应用组件.https://haas.iot.aliyun.co ...

  9. 【STM32】标准库与HAL库对照学习教程外设篇--超声波测距传感器

    [STM32]标准库与HAL库对照学习教程外设篇--超声波测距传感器 一.前言 二.准备工作 三.超声波测距传感器 1.原理说明 2.使用说明 四.标准库使用传感器 1.实验程序 2.实验效果 五.H ...

最新文章

  1. java oracle分页_oracle 分页存储过程和java代码
  2. [改善Java代码]在接口中不要存在实现代码
  3. php tp5 redis的使用(亲测)
  4. PWN-PRACTICE-BUUCTF-13
  5. 这些学霸的作息表“曝光”,太震撼了,快来找差距!
  6. FreeRTOS任务挂起与解除
  7. 解决vue-cli使用组件报错
  8. java 保存的代码怎么写_java实现写入并保存txt文件的示例代码
  9. MSP430学习笔记2---两个LED同时亮灭和顺闪
  10. JUnit测试框架使用介绍
  11. js 获取iframe页面元素
  12. Java Matcher源码学习记录
  13. Duilib使用---颜色配置
  14. 登陆模块邮箱用例设计_邮箱注册模块测试用例.doc
  15. json对象数组转数组方法
  16. windows电脑常见问题故障解决办法
  17. 知道创宇区块链安全实验室|Deus Finance预言机攻击事件分析
  18. JavaScript监听键盘事件,组合键事件
  19. 使用Python库valuequant和利润表历史数据计算股权价值
  20. 为什么很多公司都在招测试开发?

热门文章

  1. 文储研习社第14期 | 区块链骗局避坑指南
  2. 最近朋友民间借贷起诉,聊天记录内容过多,聊天长截图需要处理成A4纸上,方便打印
  3. 结构光-----激光散斑图像评测算法
  4. 电脑连不上手机热点了
  5. 微信体育馆运动场地预约小程序系统设计与实现
  6. window10安装深度linux双系统,转:【史上最详细】win10下的Deepin双系统安装小白教程-论坛-深度科技...
  7. 上层点云分割(C++PCL)
  8. HTML 正则表达式 输入框数字+字母、数字 四位数
  9. [工具]嵌入式开发工作流常用工具箱
  10. 2021年10月TIOBE排行 榜首 Python yyds