用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电平置高,剩下的置低。用这个方法依次读传感器的数据。分别遮挡传感器,串口读数如下:
#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();
}