M5Stack + Grove Sunlight センサの動作テスト

2025.2.12 Coskx Lab  

1 はじめに

M5Stack Basic V2.7にGrove SI1145 Sunlight Sensor(光センサ)を接続して周囲の明るさを測定します。

Grove SI1145 Sunlight Sensorはフォトダイオードを使用していて,Groveインターフェイスを使用してマイコンに接続できるようになっています。(I2Cインターフェイス(クロック信号SCLと、データ信号SDA)+ +V + GNDの4線ケーブル使用)
M5Stackとは付属の4線ケーブルで接続するだけで配線完了となります。



2 使用環境

3 接続

M5Stack Basic V2.7にはPort.A.I2Cコネクタに付属ケーブルで接続します。




4 テストプログラム

https://github.com/Seeed-Studio/Grove_Sunlight_Sensor
を参考にさせていただきました。

  動作テスト用プログラム本体

//sunlightsensorSI1145.ino

#include <M5Stack.h>
#include <Wire.h>

#include "Arduino.h"
#include "SI114X.h"

SI114X SI1145 = SI114X();

void setup() {

    Serial.begin(115200);
    Serial.println("Beginning Si1145!");
    while (!SI1145.Begin()) {
        Serial.println("Si1145 is not ready!");
        delay(1000);
    }
    Serial.println("Si1145 is ready!");

    M5.begin();
    M5.Power.begin();
    M5.Lcd.setTextSize(3);
}

void loop() {
    Serial.println("//-------sunlightsensorSI1145---------//");
    Serial.print("Vis: "); Serial.println(SI1145.ReadVisible());
    Serial.print("IR: "); Serial.println(SI1145.ReadIR());
    Serial.print("UV: ");  Serial.println((float)SI1145.ReadUV() / 100);
    
    M5.Lcd.clear(TFT_BLACK);
    M5.Lcd.setTextColor(WHITE, BLACK);
    M5.Lcd.setCursor(0,0);
    M5.Lcd.println("/sunlightsensor/");
    M5.Lcd.println("/    SI1145    /");
    M5.Lcd.print("Vis: "); M5.Lcd.println(SI1145.ReadVisible());
    M5.Lcd.print("IR: "); M5.Lcd.println(SI1145.ReadIR());
    //The actual UV value is obtained by dividing the register value by 100.
    M5.Lcd.print("UV: ");  M5.Lcd.println((float)SI1145.ReadUV() / 100);
   
    delay(1000);
}

5 実行の様子と考察

シリアルモニタで連続データを取得してみました。最初は室内の環境光下での測定でしたが,途中でガラス越しの太陽光を当ててみました。
値が途中で増加しているので,照度が上昇しているのがわかります。 Vis(Visible light)は環境光(Ambient light),IR(Infrared)は赤外線,UV(Ultraviolet )は紫外線を表しています。

12:30:26.163 -> //-------sunlightsensorSI1145---------//
12:30:26.163 -> Vis: 262
12:30:26.163 -> IR: 269
12:30:26.163 -> UV: 0.03
12:30:27.132 -> //-------sunlightsensorSI1145---------//
12:30:27.132 -> Vis: 262
12:30:27.132 -> IR: 270
12:30:27.132 -> UV: 0.03
12:30:28.177 -> //-------sunlightsensorSI1145---------//
12:30:28.177 -> Vis: 283
12:30:28.177 -> IR: 479
12:30:28.177 -> UV: 0.14
12:30:29.162 -> //-------sunlightsensorSI1145---------//
12:30:29.162 -> Vis: 681
12:30:29.162 -> IR: 3850
12:30:29.162 -> UV: 2.27
12:30:30.147 -> //-------sunlightsensorSI1145---------//
12:30:30.147 -> Vis: 707
12:30:30.147 -> IR: 4059
12:30:30.147 -> UV: 2.41
12:30:31.180 -> //-------sunlightsensorSI1145---------//
12:30:31.180 -> Vis: 882
12:30:31.180 -> IR: 5659
12:30:31.180 -> UV: 3.35

途中から太陽光に当てたので,3つの値が増加しているのがわかります。

M5Stack単体での実行の様子は次のようになります。



値は見えているものの,よくわからなかったので,スマートフォンの照度計アプリの表示(ルックス)とVisの値を比べてみました。

Si1145のVis値は,スマートフォンの照度計アプリの表示に対して3倍強の値になっています。

表示値がどのような値なのかを,データシートとライブラリプログラムのソースを眺めながら,調べてみました。

(1)環境光(Vis)
環境光(Vis)の測定にはフォトダイオードが使用されています。
ただしフォトダイオードは光に関する感度特性をもっていて,次のように書かれています。
 Sunlight 0.282 [ADCcounts/lx]
 2500K incandescent bulb(白熱電球) 0.319 [ADCcounts/lx]
 "Cool white" fluorescent(白色蛍光灯) 0.146 [ADCcounts/lx]
 Infrared LED (875 nm) 8.277  0.146 [ADCcounts/(W/m2)]

環境光(Vis)の値はフォトダイオードの出力の14.5倍をADC変換した値です。
そうすると(Vis)の値を,(感度 x 14.5(=およそ3))で割るとlxの単位での値が得られることになって,スマホの照度計の値に近い値になります。

lx(ルックス)の単位は人間の目の波長特性を加味しているので,その測定はもうすこし複雑なようです。波長555nmでは,1[lx]=1.46[mW/m2]=0.00146[W/m2]ということになっています。

(2)赤外光(IR)
赤外光(IR)の測定には赤外フォトダイオードが使用されています。
赤外フォトダイオードは大小二つ組み込まれているけれど。大きい方がライブラリ関数では使われています。 ただし大きいほうの赤外フォトダイオードは光に関する感度特性をもっていて,次のように書かれています。

 Sunlight 17.07 [ADCcounts/lx]
 2500K incandescent bulb(白熱電球) 50.47 [ADCcounts/lx]
 "Cool white" fluorescent(白色蛍光灯) 3.97 [ADCcounts/lx]
 Infrared LED (875 nm) 8.277  2734 [ADCcounts/(W/m2)]

赤外光(IR)の値は赤外フォトダイオードの出力の14.5倍をADC変換した値です。

(3)紫外線(UV)
紫外線(UV)の測定に関してはデータシートに記述がないのですが,「紫外線Index」の値の100倍の値がライブラリ関数で得られるようになているとのことです。そのため,プログラムでは1/100倍して,「紫外線Index」の値として表示しています。

6 まとめ

SI1145 Sunlight Sensor(光センサ)での測定値を表示することができました。
SI1145用のライブラリがあるため,テストプログラムの作成は難しくはありませんでした。
ただし,波長特性を持ったフォトダイオードの出力値が得られているため,使いやすいlx(ルックス)単位での表示にするためには,一工夫が必要です。
赤外線の測定値も[w/m2]単位で照度が得られますが,波長特性を持った赤外フォトダイオードの出力値が得られているため,使用には一工夫が必要です。
紫外線の測定は紫外線Indexの値が得られました。