· 

20.センサープロジェクト(4)BH1750搭載光センサーRaspberry Pi Pico WindowsC言語入門

14.3. BH1750搭載 光センサーによる照度計測

プロジェクト名:LightSensorBH1750

プロジェクトの概要

AdafruitのロームBH1750 16 ビット光センサーを搭載したブレイクアウトボードを使用したプロジェクトです。BH1750 は、SI 単位であるルクスで 16 ビットの光測定を提供し、 065,000 ルクスまで測定できます。BH1750 には、電圧レギュレータとレベルシフト回路が統合されており、3.3V デバイスPico、またはArduinoなどの5Vデバイスでも使用できます。

VIN    電源ピン35VDC。マイクロコントローラーのロジック レベルと同じ電力を与 えます。たとえば、Arduino のような 5V マイクロコントローラーの場合は、5V を使用します。

GND  電源とロジックの共通グランド

SCL                  マイクロコントローラーの I2C クロック ラインに接続します。

このピンはレベルシフトされているため、35V ロジックを使用でき、このピンには10K プルアップがあります。

SDA   マイクロコントローラーの I2C データ ラインに接続します。このピンはレベルシフトされているため、35V ロジックを使用でき、このピンには10K プルアップがあります。

ADDR/AD0

ジャンパ - I2C アドレス ピン。このピンを High に引き上げるか、背面のはんだジャンパーをブリッジすると、I2C アドレスが 0x23から0x5C に 変更されます。

部品リスト

Adafruit BH1750 Light Sensor                                                         スイッチサイエンス

GROVE16 x 2 LCD                                                                            スイッチサイエンス

 

 

配線図

ソースリスト

#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;

 

}