用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(); }