ESP32で照度センサTSL25721を使ってみた

はじめに
ESP32で照度センサTSL25721を使ってみました。TSL25721チップ搭載の照度センサは、人間の感覚に近いルクス(Lux)を測定できます。センサはI2C接続となっており、秋月電子通商さんからライブラリが配布されてますのでそれを使えば簡単です。
つかうもの
この記事でつかうものをご紹介いたします。
照度センサ TSL25721
TSL25721を使用した照度センサを、秋月電子通商さんから購入しました。ピンは各自でハンダ付する必要があります。
https://akizukidenshi.com/catalog/g/gK-15536/
スペック・主な仕様
項目 | 値 |
---|---|
電源電圧 | 2.4-5.0V |
ダイナミックレンジ | 8M:1 |
最大照度 | 60000Lx |
通信方式 | I2C(スレーブアドレス0x39) |
通信速度 | 400kHz(最大) |
基板寸法 | 19.0mm×9.5mm |
ライブラリのインストール
秋月電子通商さんの下記ページ「サンプルソース」から、ライブラリとサンプルプログラムをダウンロードできます。 https://akizukidenshi.com/catalog/g/gK-15536/
私は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)
*/
= 1;
byte gain_step
/**
* @brief 積分時間のカウンタ(0xFFから減るごとに+2.73ms)
* 0xFF: 1サイクル(約 2.73ms)
* 0xDB: 37サイクル(約 101ms)
* 0xC0: 64サイクル(約 175ms)
* 0x00:256サイクル(約 699ms)
*/
= 0xC0;
byte atime_cnt
void setup() {
.begin(115200);
Serial
.begin();
Wireif (TSL2572.CheckID()) {
.SetGain(gain_step);
TSL2572.SetIntegralTime(atime_cnt);
TSL2572.Reset(); // 計測開始
TSL2572(100);
delay} else {
.println("Failed TSL2572 connection !");
Serialwhile (1) {
}
}
}
void loop() {
int lux = TSL2572.GetLux16();
.println(lux); // 照度 [lx]
Serial
.SetGainAuto(); // 自動ゲイン調整
TSL2572
(500);
delay}
晴天時の太陽光は100,000[lx]にもなるそうです。室内だと1000[lx]以下でしょうか。ルクスはルーメンとは違い、光源そのものの明るさを測るものではありません。光源から出た光が、直接または壁などに反射して対象物に届いた明るさを数値化したものです。ですから、光源をセンサに近づければルクスの値は高くなります。
関連記事
- DS18B20の使い方|Arduino・ESP32・Raspberry Pi
- ESP32でST7735 TFT LCD液晶ディスプレイを使ってみる
- 【Raspberry Pi】Ambientへセンサデータを送信してグラフ化
- ESP32(Arduino)で擬似マルチスレッド可能な「PollingTimer」ライブラリ開発のリリースノート
- ESP32でWiFi接続を簡単にする「WiFiHelper」ライブラリ開発のリリースノート