用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();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/163912.html
標籤:其他
