ESP32で照度センサTSL25721を使ってみた
ESP32で照度センサTSL25721を使ってみました。TSL25721チップ搭載の照度センサは、人間の感覚に近いルクス(Lux)を測定できます。センサはI2C接続となっており、秋月電子通商さんからライブラリが配布されてますのでそれを使えば簡単です。
つかうもの
この記事でつかうものをご紹介いたします。
照度センサ TSL25721
TSL25721を使用した照度センサを、秋月電子通商さんから購入しました。ピンは各自でハンダ付する必要があります。
TSL25721使用 照度センサーモジュール: センサ一般 秋月電子通商-電子部品・ネット通販
スペック・主な仕様
項目 | 値 |
---|---|
電源電圧 | 2.4-5.0V |
ダイナミックレンジ | 8M:1 |
最大照度 | 60000Lx |
通信方式 | I2C(スレーブアドレス0x39) |
通信速度 | 400kHz(最大) |
基板寸法 | 19.0mm×9.5mm |
ESP32
WayinTopさんから販売されているESP32を使用しました。技適マークも刻印されてますので、安心して国内で使えます。GPIOの役割図は 商品ページ に詳しく掲載されてます。
▼ WiFiやBluetooth接続が必要なければ、他のArduinoでも構いません。こちらの記事で色々な種類のArduinoをご紹介してます。
その他
また、ブレッドボードやジャンプワイヤもあると便利です。
ライブラリのインストール
秋月電子通商さんの下記ページ「サンプルソース」から、ライブラリとサンプルプログラムをダウンロードできます。 TSL25721使用 照度センサーモジュール: センサ一般 秋月電子通商-電子部品・ネット通販
私はPlatformIOでArduino開発してますので、次のようなディレクトリ構造で配置しました。
.
├── include
│ └── README
├── lib
│ ├── AE_TSL2572
│ │ ├── AE_TSL2572.cpp
│ │ ├── AE_TSL2572.h
│ │ └── examples
│ │ └── demo
│ │ └── demo.ino
│ └── README
├── platformio.ini
├── src
│ └── main.cpp
└── test
└── README
TSL25721とESP32を使って照度(Lux)を測る
それではTSL25721とESP32を使って、照度(Lux)を測る例をご紹介いたします。
TSL25721とESP32の配線
TSL25721とESP32は下図のように配線しました。Arduinoの場合は、TSL25721のジャンパピン(J1)をハンダ付してショートさせ、5Vにプルアップさせて使うようですが、ESP32ではプルアップの必要はありませんでした。I2Cに使うGPIO21(SDA)、GPIO22(SCL)は通常内蔵でプルアップされます。
AE-TSL2572 | ESP32 |
---|---|
Vin | 3V3 |
GND | GND |
3V3 | 3V3 |
SCL | IO22 |
SDA | IO21 |
実際の配線は写真のようになりました。
デモプログラム(ソースコード)
照度(Lux)をシリアルモニタに表示させるプログラムです。サンプルプログラムを元に、ESP32用に少し改変してあります。いとも簡単に照度を取得できてしまいました。
/**
* @date 2022-11-23
* @author Toshihiko Arai
* @copyright https://101010.fun
*/
#include <Arduino.h>
#include <Wire.h>
#include "AE_TSL2572.h"
/**
* @brief AE-TSL2572 <-> ESP32 配線
* Vin <-> 3V3
* GND <-> GND
* 3V3 <-> 3V3
* SCL <-> IO22
* SDA <-> IO21
*/
AE_TSL2572 TSL2572;
/**
* @brief ゲイン 0~5 (x0.167 , x1.0 , x1.33 , x8 , x16 , x120)
*/
byte gain_step = 1;
/**
* @brief 積分時間のカウンタ(0xFFから減るごとに+2.73ms)
* 0xFF: 1サイクル(約 2.73ms)
* 0xDB: 37サイクル(約 101ms)
* 0xC0: 64サイクル(約 175ms)
* 0x00:256サイクル(約 699ms)
*/
byte atime_cnt = 0xC0;
void setup() {
Serial.begin(115200);
Wire.begin();
if (TSL2572.CheckID()) {
TSL2572.SetGain(gain_step);
TSL2572.SetIntegralTime(atime_cnt);
TSL2572.Reset(); // 計測開始
delay(100);
} else {
Serial.println("Failed TSL2572 connection !");
while (1) {
}
}
}
void loop() {
int lux = TSL2572.GetLux16();
Serial.println(lux); // 照度 [lx]
TSL2572.SetGainAuto(); // 自動ゲイン調整
delay(500);
}
晴天時の太陽光は100,000[lx]にもなるそうです。室内だと1000[lx]以下でしょうか。ルクスはルーメンとは違い、光源そのものの明るさを測るものではありません。光源から出た光が、直接または壁などに反射して対象物に届いた明るさを数値化したものです。ですから、光源をセンサに近づければルクスの値は高くなります。