arduino使用光強度傳感器GY-30獲取當前環境下的光強度並通過串口輸出。
GY-30是一款采用了ROHM-BH1750FVI芯片的數字輸出的感光模塊,可以測量的光照度范圍為0~65535勒克斯,最小誤差變動為±20%,分辨度為1勒克斯。
GY-30是一個五針腳模塊,包含VCC、SCL、SDA、ADDR、GND五個引腳。其中VCC接電源正極,其電壓范圍在3~5V之間;GND接地;SCL為時鍾線;SDA為數據線;並且,SCL和SDA與單片機相連時接上一個5k阻值的上拉電阻;ADDR為寄存器的地址引腳,其接地時器件地址為0100011(默認接地,也就是說該引腳什么也不接的話,該模塊的地址為0100011),接電源正極時器件地址為1011100。
GY-30與STM32單片機之間的通訊采用IIC通訊協議,這里簡單復習一下IIC通訊。
上圖中,左邊是起始信號,拉高數據線,再拉高時鍾線,然后在時鍾線為高電平時將數據線拉低,產生起始信號,之后再將時鍾線拉低,等待發送數據。右邊是停止信號(數據傳遞結束時,時鍾線和數據線都為低電平),先拉高時鍾線,在時鍾線為高電平時將數據線拉高,產生停止信號。
數據的傳遞由數據線承載,保證時鍾線拉高時,數據線保持穩定。發送數據1,保持時鍾線為低電平,將數據線拉高;在數據線拉高過程中,將時鍾線拉高,等待幾us后,將時鍾線拉低。發送數據0與其同理,只需要將數據線保持為低電平即可。
IIC協議在每發送完一條指令之后都會由接受指令的設備產生一個應答;若應答則繼續,不應答則停止。
說完IIC同通訊,我們再來具體講解一下BH1750芯片的通訊流程。
測量流程為:單片機發送器地址(7位)和寫命令(1位)→傳感器應答→單片機發送測量指令→傳感器應答
其讀取測量結果流程位:單片機發送器地址和讀命令→傳感器應答→傳感器給單片機發送高8位數據→單片機應答→傳感器發送低8為數據→單片機不應答(通訊結束)
下面附上arduino代碼,使用的是UNO R3
#include <Wire.h>
// GY-30 // BH1750FVI // in ADDR 'L' mode 7bit addr
#define ADDR 0b0100011
// addr 'H' mode // #define ADDR 0b1011100
void setup() { // put your setup code here, to run once:
Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only
} Wire.begin(); Wire.beginTransmission(ADDR); Wire.write(0b00000001); Wire.endTransmission(); } void loop() { // put your main code here, to run repeatedly:
int val = 0; // reset
Wire.beginTransmission(ADDR); Wire.write(0b00000111); Wire.endTransmission(); Wire.beginTransmission(ADDR); Wire.write(0b00100000); Wire.endTransmission(); // typical read delay 120ms
delay(120); Wire.requestFrom(ADDR, 2); // 2byte every time
for (val = 0; Wire.available() >= 1; ) { char c = Wire.read(); //Serial.println(c, HEX);
val = (val << 8) + (c & 0xFF); } val = val / 1.2; Serial.print("BRIGHTNESS: "); Serial.print(val); Serial.println("lux"); delay(100); }