用ARDUINO讀取四塊G-302(BH1750FVI)的光照強度

2020-10-08 12:01:09

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