JUGEMテーマ:電子工作


照度センサーTSL2572をESP32のmicropythonで使う
 
秋月から照度センサーTSL2572が届いたので、ESP32に繋いで測定してみた。
 
秋月のページにサンプルとして掲載されている
プログラムにラズパイ用が有ったのでこれをベースにESP32のmicropythonで使えるようにしました。
 
■回路図
 

 
 

 
■ソース

 

ほぼそのままですが、ESP32のmicropythonに合わせて書き換えています。

 

#

#  ESP32 micro python system
#
# 接続(秋月の商品No=K-15536の場合)
#  TSL2572----------ESP32
#   VIN          3V3
#   3V3          3V3
#   GND          GND
#   SDA          21
#   SCL          22
#
# 仕様
#  
#  光の強さをルクス(LUX)単位で取得して表示する
#


import time
from machine import Pin, I2C
import sys

time.sleep(3.5)
print("TSL25721-get-LUX Build0.2")

i2c=I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)

addr_tsl25721=0x39
print(i2c.scan())

#TSL2572 Register Set
TSL2572_ADR      = 0x39
TSL2572_COMMAND  = 0x80
TSL2572_TYPE_REP = 0x00
TSL2572_TYPE_INC = 0x20
TSL2572_ALSIFC   = 0x66

TSL2572_SAI   = 0x40
TSL2572_AIEN  = 0x10
TSL2572_WEN   = 0x80
TSL2572_AEN   = 0x02
TSL2572_PON   = 0x01

TSL2572_ENABLE   = 0x00
TSL2572_ATIME    = 0x01
TSL2572_WTIME    = 0x03
TSL2572_AILTL    = 0x04
TSL2572_AILTH    = 0x05
TSL2572_AIHTL    = 0x06
TSL2572_AIHTH    = 0x07
TSL2572_PRES     = 0x0C
TSL2572_CONFIG   = 0x0D
TSL2572_CONTROL  = 0x0F
TSL2572_ID       = 0x12
TSL2572_STATUS   = 0x13
TSL2572_C0DATA   = 0x14
TSL2572_C0DATAH  = 0x15
TSL2572_C1DATA   = 0x16
TSL2572_C1DATAH  = 0x17

#TSL2572 setings
atime = 0xC0
gain = 1.0
buf = bytearray(1)

def initTSL2572() :
  if (getTSL2572reg(TSL2572_ID)!=0x34) :
    #check TSL2572 ID
    return -1
  setTSL2572reg(TSL2572_COMMAND | TSL2572_TYPE_INC | TSL2572_CONTROL, 0x00)
  setTSL2572reg(TSL2572_COMMAND | TSL2572_TYPE_INC | TSL2572_CONFIG,  0x00)
  setTSL2572reg(TSL2572_COMMAND | TSL2572_TYPE_INC | TSL2572_ATIME,   atime)
  setTSL2572reg(TSL2572_COMMAND | TSL2572_TYPE_INC | TSL2572_ENABLE,  TSL2572_AEN | TSL2572_PON)
  return 0


def getTSL2572reg(reg) :
  #dat = i2c.read_i2c_block_data(TSL2572_ADR,TSL2572_COMMAND | TSL2572_TYPE_INC | reg,1)
  dat = i2c.readfrom_mem(addr_tsl25721, TSL2572_COMMAND | TSL2572_TYPE_INC | reg, 1)
  
  print("dat="+str(dat[0]))
  return dat[0]


def setTSL2572reg(reg, dat) :
  #i2c.write_byte_data(TSL2572_ADR,reg,dat)
  buf[0]=dat
  i2c.writeto_mem(TSL2572_ADR, reg, buf)


def getTSL2572adc() :
  #dat = i2c.read_i2c_block_data(TSL2572_ADR,TSL2572_COMMAND | TSL2572_TYPE_INC | TSL2572_C0DATA,4)
  dat = i2c.readfrom_mem(addr_tsl25721, TSL2572_COMMAND | TSL2572_TYPE_INC | TSL2572_C0DATA, 4)
  adc0 = (dat[1] << 8) | dat[0]
  adc1 = (dat[3] << 8) | dat[2]
  return[adc0,adc1]


#main
print("init....")
if (initTSL2572()!=0) :
  print("Failed. Check connection!!")
  sys.exit()

while 1:
  adc = getTSL2572adc()

  cpl = 0.0
  lux1 = 0.0
  lux2 = 0.0
  cpl = (2.73 * (256 - atime) * gain)/(60.0)
  lux1 = ((adc[0] * 1.00) - (adc[1] * 1.87)) / cpl
  lux2 = ((adc[0] * 0.63) - (adc[1] * 1.00)) / cpl
  if ((lux1 <= 0) and (lux2 <= 0)) :
    print("0 Lx")
  elif (lux1 > lux2) :
    print("{:.1f} Lx".format(lux1))
  elif (lux1 < lux2) :
    print("{:.1f} Lx".format(lux2))
  time.sleep(1.0)