宜昌老张

夏普GP2D12红外线测距传感器与LCD1602液晶

0
阅读(14016)

 

   这个实验任务是:把GP2D12红外线测距传感器采集的数据,通过Arduino控制器的算式转换为实际距离值,再显示在集成了I2C接口的LCD1602液晶面板上。

    夏普GP2D12红外线测距传感器,是一种性价比较高的模拟量传感器。如何把这个传感器所测的模拟量数据,采集和算式处理,最终获取实际距离呢?我下面就会讲。

  上图就是GP2D12红外线测距传感器的电压值与距离值的关系曲线,从这个曲线可以看出,电压输出与距离成反比,而且是非线性关系。

   根据上图关系曲线,大约关系为10cm距离时有2.55V输出,80cm距离时有0.42V输出。可以通过该曲线拟合出电压值与距离值的数学关系式,但是这个关系式里的距离是参考距离值,实际距离值=(参考距离值-0.42)cm,另外由于Arduino的模拟量采样命令analogRead(),采样的数据范围是0至1023,对应的电压范围是0至5V,每格数据代表0.0049V,于是读取的有效数据应该由86(0.42V)至520(2.548V)。所以最终可以推导出实际距离与采样数据之间的关系式为:

    实际距离=2547.8/((float)采样数据*0.49-10.41)-0.42

    这个实际距离与采样数据之间的关系式,您会在下面程序中再次看到,我用红色字体标注出来了。

    Arduino 328控制器端口实在是有限,加几个传感器、SD卡啥的,就没有端口了,还想接个1602液晶显示,怎么办?DFRobot公司开发的集成了I2C接口的1602LCD就解决了上述问题,利用I2C通讯,只需SDA、SCL、GND和VCC四根线就可以实现数据显示,还可以挂其他I2C设备。

     用四根杜邦线,把1602LCD后面的I2C接口四个引脚与Xbee传感器扩展板V5的I2C专用端口连接起来,就可以实现Arduino控制器与LCD1602液晶的I2C硬件联系,如文章的第一张图所示。这个集成了I2C接口的1602LCD好用,不仅体现在硬件连线方便,而且您使用专门为这个LCD液晶写的库文件LiquidCrystal_I2C,编写程序也特别简单。

LiquidCrystal_I2库文件的RAR文件请下载:12834371515832.rar

您可以将RAR文件下载并解压缩后,复制到您的Arduino安装目录下的libraries文件夹里面,如图。

  把GP2D12传感器连接到Arduino传感器扩展板的模拟量端口0、LCD1602的I2C引脚连接到传感器扩展板的I2C专用端口,在安装好和LiquidCrystal_I2库文件,那就可以编写GP2D12传感器距离值采集和LCD1602液晶显示的程序了。

程序如下:

 // 声明集成了I2C接口的LCD1602编程所需库文件
 
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

//设置LCD1602的I2C地址为0x27,LCD1602为两行,每行16个字符的液晶显示器
  LiquidCrystal_I2C lcd(0x27,16,2); 
  int GP2D12 = 0;//把夏普GP2D12红外测距传感器连接在模拟量端口0
  int val;   //存储从GP2D12红外测距传感器读到的值     
  float temp;//存储由传感器读取值,通过算式处理后的浮点型距离值
  int distance;//存储由传感器读取值,通过算式处理后的整数型距离值

//初始化程序        
void setup() {
  //LCD的I2C通讯初始化需要执行两次
  lcd.init(); // 给LCD的I2C通讯初始化
  delay(20);
  lcd.init(); // 给LCD的I2C通讯初始化
   delay(20);
   lcd.backlight();//点亮LCD背光灯   
}

//主程序
void loop() {
  //读取GP2D12红外测距传感器模拟量数据
  val = analogRead(GP2D12); 
  //通过以下算式,把传感器读取值处理成浮点型距离值
  temp=2547.8/((float)val*0.49-10.41)-0.42;
  lcd.clear();//LCD清屏
  // 定位光标在LCD第0行、第0列
  lcd.setCursor(0, 0);
  //在LCD第0行第0列开始显示"Distance:"
  lcd.print("Distance:");
  // 定位光标在LCD第1行、第7列
  lcd.setCursor(7, 1);
  //如果传感器读取值大于80或者小于10,
  if(temp>80||temp<10)
        {
      //则在LCD第1行、第7列开始显示"OverRange"
         lcd.print("OverRange");      
    }
   //如果传感器读取值在10到80之间,
  else
        {        
        //把浮点型距离值取整
        distance=int(temp);
        //则在LCD第1行、第7列开始显示距离值
        lcd.print(distance);
        //在距离值后显示单位"cm"
        lcd.print("cm");
    }        
  delay(500);//延时500ms
}