第十七篇、基于Arduino uno,获取cp2d12红外测距传感器的原始值和距离值——结果导向

0、结果

说明:先来看看串口调试助手显示的结果,第一个值是原始的模拟电压值,第二个值是距离值,如果是你想要的,可以接着往下看。


1、外观

 说明:虽然红外测距传感器形态各异,但是原理和代码都是适用的,只是测量范围可能不一样。


2、连线

 说明:只需要连接三根线。

  • uno————红外测距传感器
  •     5V--------------VCC
  • GND--------------GND
  •     A0--------------SIG

3、源程序

说明:采用非阻塞方式编写,一定时间检测一次距离值,并进行了简单滤波,又将对应功能进行函数化,方便移植。

/****************************************红外测距 part****************************************/
/*
  接线:
  VCC------VCC
  GND------GND
  A0------SIG
*/
#define cp2d12Pin A0                                                        //定义一个引脚  
#define cp2d12timeInterval 150                                              //检测一次的时间间隔 
unsigned long cp2d12Times = 0;                                              //记录设备运行时间
double distance = 0;                                                        //距离值
int beforeVal = 0;                                                          //前一个距离值
int presentVal = 0;                                                         //当前距离值
int averageVal = 0;                                                         //前一个后一个距离的平均值
/****************************************set up and loop part*********************************/
void setup () {
  Serial.begin (9600);                                                      //设置串口波特率为9600
  pinMode(cp2d12Pin, INPUT);                                                //引脚设置成输出

  Serial.println("设备上线!");
}
void loop () {
  getDistanceData();                                                        //获取距离数据并且打印
}
/*获取距离数据并且打印*/
void getDistanceData() {
  if (millis() - cp2d12Times >= cp2d12timeInterval) {                       //一定时间执行一次
    cp2d12Times = millis();
    int value1 = analogRead (cp2d12Pin);
    distance = getIr(value1);                                 
    filterData();                                                           //进行一次简单的滤波

    Serial.print("原始值:");                                                //串口打印对应的值 
    Serial.print(value1);
    Serial.print(" ,距离值:");                                              //串口打印对应的值 
    Serial.print(averageVal);                                               //串口打印对应的值 
    Serial.println (" cm");                                                 //串口打印对应的值
  }
}
/*当距离值不够设为定值最小值*/
double getIr(uint16_t value1) {
  if (value1 < 16)  {
    value1 = 16;
  }
  return (6762 / (value1 - 9)) - 4;                                         //转换公式
}

/*滤波*/
void filterData() {
  beforeVal = averageVal;                                                   //平均值给前一个值
  presentVal = distance;                                                    //距离值给当前值
  averageVal = beforeVal + (presentVal - beforeVal) / 2;                    //求出当前距离值
}

4、注意事项

说明:首先需要看一下模块能够检测到的一个距离值。如果检测到的距离值不是准确的,那就需要改一下转换公式的部分值 (6762 / (value1 - 9)) - 4,可以查自己模块对应的转换公式,因为每个型号传感器可能不一样。

5、基本原理

        红外测距传感器是一种常用的非接触式距离测量传感器,可以用于测量物体与传感器之间的距离。
        红外测距传感器的工作原理基于红外线反射原理。传感器通过内置的红外发射管发射红外线,并接收红外线反射回来的光信号。当红外光线照射到物体上时,一部分红外光被物体吸收,一部分红外光被物体反射回来。传感器接收到反射回来的红外光信号后,经过处理后可以计算出物体和传感器之间的距离。
        在Arduino中使用红外测距传感器,我们需要先将其正确连接到Arduino板上,并编写相应的程序进行控制。通常,可以通过数字输入输出端口发送控制信号,使红外传感器发射红外线,并通过模拟输入输出端口读取传感器返回的距离值。具体地,在程序中需要使用Arduino提供的相应函数来对数字输入输出端口和模拟输入输出端口进行操作,从而实现红外测距传感器的控制。
        需要注意的是,红外测距传感器的距离测量精度和稳定性受到多种因素的影响,如环境光线、物体表面特性等,因此在使用时还需要进行相应的校准和优化,以提高测量数据的准确性和可靠性。同时,在实际应用中,我们也需要考虑不同情况下采用不同类型和参数的红外测距传感器,并将其合理地组合和应用,以实现更加智能和高效的控制系统。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值