Arduino基础实验11,用I2C连接光照传感器

基础实验10中的UART串口通信只能用在设备一对一的场合,每个连接总线只能负责单一的数据传输方向,在单片机和大量外围设备同时通信的场合就会有局限性,这个时候,I2C总线的通信被提出来,并发挥一对多通信的作用。本文中,创客行就用Arduino的I2C总线来做个实验给大家看看。

I2C总线

I2C设备连接图1 I2C设备连接

I2C通信设备由一个主设备和若干从设备组成,共用三根连接线,SDA是数据线,SCL是时钟线,GND是公共地线。I2C总线支持7位和10位地址空间,因此它支持最大从设备数目是128或1024个,从设备依靠自己的逻辑地址来进行通信区分。

SDA传递具体的数据,SCL的任务是使得数据有序传输,它会使用高低电平变化来构成一些列传输信令,确保数据信道的独占性和数据传输完整性,具体的信令和对应电平方式本文将不去详述,请参考文档【1】

 Arduino使用I2C连接光照传感器

文档【2】可知,如图2,这里将要使用的光照传感器是基于人眼感光修正的光敏二极管来构成,测量数据经过量化和I2C接口处理,会以I2C通信的方式向所连接的主设备传递测得的光照数据。

光照传感器硬件结构图图2 光照传感器硬件结构图

同样从文档【2】中可以看到ADD对逻辑地址的设置方法,假如我们将ADD引脚悬空,它的适用于低电平状态,0x23是光照传感器模块此时的I2C逻辑地址。

光照传感器图3 光照传感器

Arduino连接光照传感器图4 Arduino连接光照传感器

在Arduino Nano开发板上,A4和A5引脚会被复用为SDA和SCL接口,因此如图4把开发板和光照传感器连接起来,连接关系是:Vcc接电源正极,GND接电源负极,SDA接A4,SCL连接A5。两者连接起来后,就可以写代码了:

/*
 I2C Ambient light sensor experiment
 source by: www.i-makers.info
*/

#include <Wire.h>   //Arduino的I2C库
 
int BH1750_address = 0x23; // 光照传感器i2c地址
byte buff[2];
 
void setup(){
  
  Wire.begin();  //初始化I2C,无参数说明此设备为主设备,定义从设备时需要将逻辑地址作为参数传入
  BH1750_Init(BH1750_address);
  
  delay(200);
  Serial.begin(9600);
}
 
void loop(){
  
  float valf=0;
 
  if(BH1750_Read(BH1750_address)==2){//根据文档【2】第七页流程和公式,计算获得的光照数据
    
    valf=((buff[0]<<8)|buff[1])/1.2;
    
    //打印数值
    if(valf<0)
      Serial.print("> 65535");
    else 
      Serial.print((int)valf,DEC); 
    
    Serial.println(" lx"); 
  }
  delay(1000);
}
 
void BH1750_Init(int address){
  
  Wire.beginTransmission(address);//Arduino将向0x23地址的设备做I2C连接
  Wire.write(0x10); // 根据文档【2】传送工作命令,这里是联系进行高精度测试,精度为1流明(Lx)
  Wire.endTransmission();
}
 
byte BH1750_Read(int address){
  
  byte i=0;
  Wire.beginTransmission(address);
  Wire.requestFrom(address, 2);//从返回数据中取出2 byte的数值
  while(Wire.available()){
    buff[i] = Wire.read(); 
    i++;
  }
  Wire.endTransmission();  
  return i;
}

代码1 Arduino光强度测试代码

代码加上了必要的中文注释,它示例了Arduino的I2C支持库<Wire.h>的基本用法。将代码烧录到图4的开发板中,连接PC,在Arduino IDE的串口监视器上,就可以获得I2C传输过来的当前测量值。

总结

光照传感器是一个有趣的传感器模块,它给出了测量区域的准确光强度数值,在摄影曝光时间设置的应用中,这是十分重要的参数。同时在我们日常生活中,它也能发挥重要的作用,例如在我们的读书学习环境,晚上的灯光需要在50-100lx之间,使用本传感器的测试,就可以让自己有一个适宜健康的学习环境,看看自己的周边,想想光照传感器还能帮我们什么忙吧。

I2c是单片机在一对多场合的重要传输方式,它同样也是串口通信的基本方式之一,我们可以找到许多使用该协议的传感器模块,需要提示的是,Arduino的I2C工作电压是5V,如果其它连接设备工作电压是3.3V,请一定别忘记实用逻辑电平转换模块做中转,以避免模块过载而损坏。

更多的精彩内容,请查看全站目录

优秀科技原创内容源,欢迎添加微信公众号。

创客行淘宝店提供本网站电子制作的全部套件

创客行淘宝店地址:https://shop125908459.taobao.com/

参考文档

  1. http://www.arduino.cn/thread-18135-1-1.html
  2. BH1750FVI.pdf
  3. 全站目录

发表评论