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

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

ESP32で照度センサーTSL25721を使ってみました。TSL25721チップ搭載の照度センサは、人間の感覚に近いルクス(Lux)を測定できます。センサはI2C接続となっており、秋月電子通商さんからライブラリが配布されていますのでそれを使えばカンタンです。ぜひご参考ください。

つかうもの

この記事でつかうものをご紹介いたします。

照度センサ TSL25721

TSL25721を使用した照度センサを、秋月電子通商さんから購入しました。ピンは各自でハンダ付する必要があります。

スペック・主な仕様

項目
電源電圧 2.4-5.0V
ダイナミックレンジ 8M:1
最大照度 60000Lx
通信方式 I2C(スレーブアドレス0x39)
通信速度 400kHz(最大)
基板寸法 19.0mm×9.5mm

ESP32

WayinTopさんから販売されているESP32を使用しました。技適マークも刻印されていますので、安心して国内で使えます。GPIOの役割図は 商品ページ に詳しく掲載されていますのでご参考ください。

▼ WiFiやBluetooth接続が必要なければ、他のArduinoでも構いません。こちらの記事で色々な種類のArduinoをご紹介していますので、ご参考になさってみてください。

その他

また、ブレッドボードやジャンプワイヤもあると便利です。

ライブラリのインストール

秋月電子通商さんの下記ページ「サンプルソース」から、ライブラリとサンプルプログラムをダウンロードできます。

私は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)は内蔵でプルアップされているようです。

TSL25721とESP32の配線図
TSL25721とESP32の配線図

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]以下でしょうか。ルクスはルーメンとは違い、光源そのものの明るさを測るものではありません。光源から出た光が、直接または壁などに反射して対象物に届いた明るさを数値化したものです。ですから、光源をセンサに近づければルクスの値は高くなります。

「キッチンノート.fun」という料理サイトを立ち上げました!このサイトで紹介していた料理記事は、そちらへ移動しました。
記事に関するご質問などがあれば、
Twitter または お問い合わせ までご連絡ください。
関連記事