照度モジュールは、秋月電子さんの以下の照度センサーモジュールを使用しました。i2cでESP32-DevkitCと通信します。
TSL25721使用 照度センサーモジュール
https://akizukidenshi.com/catalog/g/gK-15536/
開発手順
1. ピンのハンダ付けと、ESP32-DevkitCへの接続・ESP32-DevkitCとジャンパー線で接続した照度センサーモジュール
ESP32-DevkitCと照度センサーモジュールは以下の様に接続します(モジュールの裏面にピン略称が印刷されています)
ESP32-DevkitCの3V3ピン(USBを手前・ピン足を下にした時、左上のピン) -> TSL25721のVIN
ESP32-DevkitCのIO21ピン(USBを手前・ピン足を下にした時、右上から6番目のピン) -> TSL25721のSDA
ESP32-DevkitCのIO22ピン(USBを手前・ピン足を下にした時、右上から3番目のピン) -> TSL25721のSCL
ESP32-DevkitCのGNDピン(USBを手前・ピン足を下にした時、右上のピン) -> TSL25721のGND
2. プログラムの作成と実行
以下のプログラムをmain.pyファイルとしてESP32-DevkitCに保存して、実行します。
import time
from machine import Pin, I2C
i2c=I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
addr_tsl25721=0x39
#print(i2c.scan())
FIELD_COMMAND = 0x80 # Write
FIELD_TYPE = 0x20 # Auto-increment protocol transaction
REG_CONTROL = 0x0F # Control Register
VAL_CONTROL_RESET = 0x00 # Reset Value for Control Register
REG_CONFIG = 0x0D # Config Register
VAL_CONFIG_RESET = 0x00 # Reset Value for Config Register
REG_ATIME = 0x01 # ATIME(ALS time) Register
VAL_ATIME_C64 = 0xC0 # INTEG_CYCLE=64, Time=175ms
REG_ENABLE = 0x00 # Enable Register
VAL_ENABLE_PON = 0x01 # Power ON
VAL_ENABLE_AEN = 0x02 # ALS Enable
VAL_ENABLE = VAL_ENABLE_PON | VAL_ENABLE_AEN
REG_C0DATA = 0x14 # CH0 ADC low data register
# Initialize
# Reset Control Register
buf = bytearray(1)
buf[0] = VAL_CONTROL_RESET
i2c.writeto_mem(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONTROL, buf)
# Reset Config Register
buf[0] = VAL_CONFIG_RESET
i2c.writeto_mem(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONFIG, buf)
# Set ALS time
buf[0] = VAL_ATIME_C64
i2c.writeto_mem(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ATIME, buf)
# Power on and enable ALS
buf[0] = VAL_ENABLE
i2c.writeto_mem(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ENABLE, buf)
time.sleep(1)
def read_lux():
atime = 0xC0 # 192
gain = 1.0
dat = i2c.readfrom_mem(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_C0DATA, 4)
adc0 = (dat[1] << 8) | dat[0]
adc1 = (dat[3] << 8) | dat[2]
cpl = (2.73 * (256 - atime) * gain)/(60.0)
lux1 = ((adc0 * 1.00) - (adc1 * 1.87)) / cpl
lux2 = ((adc0 * 0.63) - (adc1 * 1.00)) / cpl
lux = 0
if ((lux1 <= 0) and (lux2 <= 0)) :
lux = 0
if (lux1 > lux2) :
lux = lux1
elif (lux1 < lux2) :
lux = lux2
return lux
while True:
lux= read_lux()
print("lux:{:.1f}".format(lux))
time.sleep(1)
0 件のコメント:
コメントを投稿