用ARDUINO读取四块G-302(BH1750FVI)的光照强度

用ARDUINO读取四块G-30(BH1750FVI)的光照强度

G-302是一款常见的光照强度传感器。核心芯片是BH1750FVI,这个芯片是3.3V供电的。但G-302模块带有TTL转换芯片,可以直接用5V供电,同时可以直接和arduino或者5V的单片机直接连接。
G-302引脚图[在这里插入图片描述](https://img-blog.
该模块的I2C通信指令在这里插入图片描述
G-302模块虽然有I2C总线,但它只支持两个地址如下图,ADDR接地,地址为0x23;ADDR接高电平,地址为0x5C。
在这里插入图片描述
如何只使用这两个地址,那么一条I2C总线只能接两个传感器。如果要在一条I2C总线上接4个传感器,我们可以把四个传感器ADDR分别接到arduino的I/O上。采用一个固定的地址。比如:选择地址为0x5C,我要想读取一个传感器的数据只需把该传感器的ADDR电平置高,剩下的置低。用这个方法依次读传感器的数据。分别遮挡传感器,串口读数如下:
在这里插入图片描述

/*
功能:多个g30读数,通过控制ADD口,轮序读取每一个BH1750的数据
注:G30 3.3v供电
   芯片地址为16位   0x23 -> GND 
                  0x5C ->  VCC
*/
#include <Wire.h>         //IIC库
#include <math.h> 

#define B1  7              //定义BH1750 ADD口的控制脚
#define B2  9
#define B3  10
#define B4  11

byte buff[2];                 //i2c读数数据缓存
uint16_t val=0;               //读数变量

void setup()
{
    
    
  pinMode(B1,OUTPUT);        //设置ADD口的控制脚为输出模式
  pinMode(B2,OUTPUT);
  pinMode(B3,OUTPUT);
  pinMode(B4,OUTPUT);
  
  Wire.begin();
  Serial.begin(9600);

  digitalWrite(B1, LOW);    //初始化ADD口的控制脚为低电平
  digitalWrite(B2, LOW);
  digitalWrite(B3, LOW);
  digitalWrite(B4, LOW);
}

void loop()
{
    
    
  uint16_t bh1,bh2,bh3,bh4;

  Start_B1();       //读B1的数
  BH1750_Start();   //开始读数
  bh1 = val;
  delay(150);
  Serial.print("B1:");Serial.print(bh1,DEC); Serial.println("LX"); 
  delay(1000);
//
  Start_B2();        //读B4的数
  BH1750_Start();
  bh2 = val;
  delay(150);
  Serial.print("B2:");Serial.print(bh2,DEC); Serial.println("LX"); 
  delay(150);
  delay(1000);

  Start_B3();       //读B3的数
  BH1750_Start();   //开始读数
  bh3 = val;
  Serial.print("B3:");Serial.print(bh3,DEC); Serial.println("LX"); 
  delay(150);
  delay(1000);
//
  Start_B4();       //读B4的数
  BH1750_Start();   //开始读数
  bh4 = val;
  Serial.print("B4:");Serial.print(bh4,DEC); Serial.println("LX"); 
  delay(1000);
}

void Start_B1()
{
    
    
  digitalWrite(B1, HIGH);
  digitalWrite(B2, LOW);
  digitalWrite(B3, LOW);
  digitalWrite(B4, LOW);
}

void Start_B2()
{
    
    
  digitalWrite(B1, LOW);
  digitalWrite(B2, HIGH);
  digitalWrite(B3, LOW);
  digitalWrite(B4, LOW);
}
void Start_B3()
{
    
    
  digitalWrite(B1, LOW);
  digitalWrite(B2, LOW);
  digitalWrite(B3, HIGH);
  digitalWrite(B4, LOW);
}

void Start_B4()
{
    
    
  digitalWrite(B1, LOW);
  digitalWrite(B2, LOW);
  digitalWrite(B3, LOW);
  digitalWrite(B4, HIGH);
}

void BH1750_Start()     //BH1750启动函数
{
    
    
  BH1750_Init(0x5C);
  delay(200);
  if(2==BH1750_Read(0x5C)) {
    
    
     val=((buff[0]<<8)|buff[1])/1.2;
  }
}

int BH1750_Read(int address)    //读数
{
    
    
  int i=0;
  Wire.beginTransmission(address);
  Wire.requestFrom(address, 2);
  while(Wire.available()) 

  {
    
    
    buff[i] = Wire.read();     //读一位数
    i++;
  }
  Wire.endTransmission();  
  return i;

}

void BH1750_Init(int address) {
    
         //配置传感器
  Wire.beginTransmission(address);
  Wire.write(0x10);//1lx reolution 120ms
  Wire.endTransmission();
}

猜你喜欢

转载自blog.csdn.net/weixin_41866783/article/details/108944125