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