像手機(jī)、平板之類的電子設(shè)備,屏幕亮度都能隨環(huán)境光強(qiáng)度自動(dòng)調(diào)節(jié),其內(nèi)部使用的是小體積的數(shù)字光照傳感器。本篇我們使用GY-30光照傳感器模塊來控制OLED顯示屏的背光亮度,使其隨環(huán)境光自動(dòng)調(diào)節(jié)。
1. 實(shí)驗(yàn)材料
- Uno R3開發(fā)板
- 配套USB數(shù)據(jù)線
- 面包板及配套連接線
- OLED顯示屏
- 數(shù)字光強(qiáng)傳感器GY-30模塊
2. 實(shí)驗(yàn)步驟
1. 根據(jù)原理圖搭建電路圖。
OLED屏的VCC、GND、SDA、SCL與GY-30模塊的VCC、GND、SDA、SCL相對應(yīng)連接,然后連接到開發(fā)板的5V、GND、A4、A5。兩個(gè)模塊都使用了硬件IIC,由于各自地址不同,所以并不會(huì)相互影響,這也是IIC通訊協(xié)議的優(yōu)勢所在。
實(shí)驗(yàn)原理圖如下圖所示:
實(shí)驗(yàn)原理圖
2. 新建sketch,拷貝如下代碼替換自動(dòng)生成的代碼并進(jìn)行保存。
/*
OLED_BH1750
光照傳感器OLED背光控制
*/
#include < Arduino.h >
#include < U8g2lib.h >
#include < Wire.h >
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);//使用硬件IIC
int BH1750address = 0x23;
byte buff[2];
uint16_t val = 0;
char str[6];
void setup()
{
Wire.begin();
BH1750_Init(BH1750address);
u8g2.begin();
u8g2.setFont(u8g2_font_fur20_tf);
}
void loop()
{
if (2 == BH1750_Read(BH1750address))
{
if (buff[0] == 255 && buff[1] == 255)
{
val = 65535;
} else {
val = ((buff[0] < < 8) | buff[1]) / 1.2; //芯片手冊中規(guī)定的數(shù)值計(jì)算方式
}
}
strcpy(str, u8x8_u16toa(val, 5));
u8g2.firstPage();
do {
u8g2.drawStr(20, 20, "-Light-");
u8g2.drawStr(10, 60, str);
u8g2.drawStr(95, 60, "Lx");
u8g2.setContrast(255 - map(val, 0, 500, 0, 255)); //將光照數(shù)據(jù)進(jìn)行區(qū)間映射,控制OLED背光
} while ( u8g2.nextPage() );
}
int BH1750_Read(int address)
{
int i = 0;
Wire.beginTransmission(address);
Wire.requestFrom(address, 2);
while (Wire.available())
{
buff[i] = Wire.read(); // receive one byte
i++;
}
Wire.endTransmission();
return i;
}
void BH1750_Init(int address)
{
Wire.beginTransmission(address);
Wire.write(0x10);
Wire.endTransmission();
}