14.3. BH1750搭載 光センサーによる照度計測
プロジェクトの概要
AdafruitのロームBH1750 16 ビット光センサーを搭載したブレイクアウトボードを使用したプロジェクトです。BH1750 は、SI 単位であるルクスで 16 ビットの光測定を提供し、 0 ~ 65,000 ルクスまで測定できます。BH1750 には、電圧レギュレータとレベルシフト回路が統合されており、3.3V デバイスPico、またはArduinoなどの5Vデバイスでも使用できます。
VIN 電源ピン3 ~ 5VDC。マイクロコントローラーのロジック レベルと同じ電力を与 えます。たとえば、Arduino のような 5V マイクロコントローラーの場合は、5V を使用します。
GND 電源とロジックの共通グランド
SCL マイクロコントローラーの I2C クロック ラインに接続します。
このピンはレベルシフトされているため、3 ~ 5V ロジックを使用でき、このピンには10K プルアップがあります。
SDA マイクロコントローラーの I2C データ ラインに接続します。このピンはレベルシフトされているため、3 ~ 5V ロジックを使用でき、このピンには10K プルアップがあります。
ADDR/AD0
ジャンパ - I2C アドレス ピン。このピンを High に引き上げるか、背面のはんだジャンパーをブリッジすると、I2C アドレスが 0x23から0x5C に 変更されます。
部品リスト
Adafruit BH1750 Light Sensor 1 スイッチサイエンス
GROVEの16 x 2 LCD 1 スイッチサイエンス
配線図

ソースリスト
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "hardware/rtc.h"
//#define PICO_DEFAULT_LED_PIN 25
#define LED_PIN PICO_DEFAULT_LED_PIN
#define I2C_PORT i2c0
#define I2C_SDA 8
#define I2C_SCL 9
//set up --------------------
//rtc -----------------------------------
//lcd -------------------------------
//BH1750-----------------------------
#define BH1750_ADDR 0x23
int InitBH1750()
{
uint8_t sendBuf[8];
sendBuf[0] = 0x01; //Power On Command
i2c_write_blocking(I2C_PORT, BH1750_ADDR, sendBuf, 1, false);
sleep_us(10);
sendBuf[0] = 0x07; //Reset Command
i2c_write_blocking(I2C_PORT, BH1750_ADDR, sendBuf, 1, false);
sleep_us(10);
}
int ReadBH1750(float *lux)
{
uint8_t sendBuf[8];
sendBuf[0] = 0x10; //Continuously H-Resolution Mode
i2c_write_blocking(I2C_PORT, BH1750_ADDR, sendBuf, 1, false);
sleep_ms(180);
uint8_t reciveBuf[8];
i2c_read_blocking(I2C_PORT, BH1750_ADDR, reciveBuf, 2, false);
uint16_t lx = (reciveBuf[0] << 8 ) | reciveBuf[1];
*lux = (float)lx;
return(0);
}
int main()
{
stdio_init_all();
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 0);
i2c_init(I2C_PORT, 400*1000);
gpio_set_function(I2C_SDA, GPIO_FUNC_I2C);
gpio_set_function(I2C_SCL, GPIO_FUNC_I2C);
gpio_pull_up(I2C_SDA);
gpio_pull_up(I2C_SCL);
WaitTerminalStartup(30*1000);
printf("\nTerminal connected\n");
ScanI2CBus();
printf("I2C Scan completed\n");
lcd_init();
InitRtc();
InitBH1750();
char buf[128];
datetime_t nowdt;
int presec = -1;
float lux;
while (1) {
rtc_get_datetime(&nowdt);
if(presec != nowdt.sec)
{
ReadBH1750(&lux);
sprintf(buf, "%02d/%02d %02d:%02d:%02d",
nowdt.month, nowdt.day, nowdt.hour,nowdt.min, nowdt.sec);
lcd_set_cursor(0, 0);
lcd_string(buf);
sprintf(buf, " Light:%5.1flx", lux);
lcd_set_cursor(1, 0);
lcd_string(buf);
printf("%4d/%02d/%02d %02d:%02d:%02d Light:%5.1flx\n",
nowdt.year, nowdt.month, nowdt.day,
nowdt.hour,nowdt.min, nowdt.sec, lux);
}
presec = nowdt.sec;
sleep_ms(200);
}
return 0;
}

コメントをお書きください