# TSL2561
###### tags: `raspberry pi` `hardware` `python` `pigpio`
## Wiring
address : 0x39
| TSL2561 | Raspberry Pi |
| ------- | ------------ |
| VCC | 3.3V |
| GND | 0V |
| SCL | GPIO03 SCL1 |
| SDA | GPIO02 SDA1 |
| INT | None |
## Program
### smbus
```python=
import smbus
# initialize
print("initialize")
bus = smbus.SMBus(1) # bus number 1
address = 0x39 # tsl2561 address
bus.write_byte_data(address, 0x80, 0x03) # power on
bus.write_byte_data(address, 0x81, 0x12) # initialize flag (0b00010010)
# read
data0 = bus.read_i2c_block_data(address , 0x8c, 2) #ch0
data1 = bus.read_i2c_block_data(address , 0x8e, 2) #ch1
ch0 = data0[1] << 8 | data0[0]
ch1 = data1[1] << 8 | data1[0]
print(f"channel 0 : {ch0}")
print(f"channel 1 : {ch1}")
result = 1.0 * ch1 / ch0
print(f"result : {result}")
if 0 < result <= 0.5:
lux = 0.0304 * ch0 - 0.062 * ch0 * (result ** 1.4)
elif 0.5 < result <= 0.61:
lux = 0.0224 * ch0 - 0.031 * ch1
elif 0.61 < result <= 0.8:
lux = 0.0128 * ch0 - 0.0153 * ch1
elif 0.8 < result <= 1.3:
lux = 0.0146 * ch0 - 0.00112 * ch1
else:
lux = 0
print(f"lux : {round(lux, 2)}")
```
### pigpio
```python=
"""
TSL2561を制御するモジュール
"""
from enum import Flag, auto
from time import sleep
import pigpio
class TSL2561Gain(Flag):
"""
TSL2561の利得を表す型
"""
high = auto()
low = auto()
class TSL2561Integral(Flag):
"""
TSL2561の積層時間を表す型
"""
high = auto()
medium = auto()
low = auto()
class TSL2561:
"""
デジタル温度センサTSL2561を扱うためのクラス
Attributes
----------
address: int, default 0x39
TSL2561のI2Cアドレス
flag: int, default 0
I2C通信のフラグ
gain: TSL2561Gain, default TSL2561Gain.high
TSL2561の利得
integral: TSL2561Integral, default TSL2561Integral.high
TSL2561の積分時間
"""
def __init__(self, pi: pigpio.pi) -> None:
"""
Parameters
----------
pi: pigpio.pi
pigpioデーモンと通信するためのオブジェクト
"""
self.address: int = 0x39
self.flag: int = 0
self.gain: TSL2561Gain = TSL2561Gain.high
self.integral: TSL2561Integral = TSL2561Integral.high
if not pi.connected:
raise pigpio.error(pigpio.error_text(-1))
self._hndl: int
self._pi: pigpio.pi = pi
def _get_gain(self) -> int:
"""
TSL2561IntegralからI2Cで送る利得の値を取得する関数
Returns
-------
integral: int
I2Cで送る利得の値
"""
if self.gain == TSL2561Gain.low:
gain = 0b0
elif self.gain == TSL2561Gain.high:
gain = 0b1
return gain << 4
def _get_integral(self) -> int:
"""
TSL2561IntegralからI2Cで送る積分時間の値を取得する関数
Returns
-------
integral: int
I2Cで送る積分時間の値
"""
if self.integral == TSL2561Integral.low:
integral = 0b00
elif self.integral == TSL2561Integral.medium:
integral = 0b01
elif self.integral == TSL2561Integral.high:
integral = 0b10
return integral
def initialize(self, bus: int) -> None:
"""
TSL2561の初期化
Parameters
----------
bus: int
使用するI2Cバス
"""
self._hndl = self._pi.i2c_open(bus, self.address, self.flag)
self._pi.i2c_write_byte_data(self._hndl, 0x80, 0x03)
mode = self._get_gain() | self._get_integral()
self._pi.i2c_write_byte_data(self._hndl, 0x81, mode)
sleep(1)
_ = self.read_illuminance()
def finalize(self) -> None:
"""TSL2561の後処理"""
self._pi.i2c_close(self._hndl)
del self._hndl
def read_illuminance(self) -> float:
"""
照度を取得
Returns
-------
lux: float
取得した照度
"""
count, adc = self._pi.i2c_read_i2c_block_data(self._hndl, 0x8C, 4)
if count < 0:
raise pigpio.error(pigpio.error_text(count))
ch0 = (adc[1] << 8) + adc[0]
ch1 = (adc[3] << 8) + adc[2]
try:
result = 1.0 * ch1 / ch0
except ZeroDivisionError:
result = 0.0
if result <= 0:
lux = 0.0
elif result <= 0.5:
lux = 0.0304 * ch0 - 0.062 * ch0 * (result ** 1.4)
elif result <= 0.61:
lux = 0.0224 * ch0 - 0.031 * ch1
elif result <= 0.8:
lux = 0.0128 * ch0 - 0.0153 * ch1
elif result <= 1.3:
lux = 0.0146 * ch0 - 0.00112 * ch1
else:
lux = 0.0
if self.gain == TSL2561Gain.low:
lux *= 16
if self.integral == TSL2561Integral.low:
lux *= 29.343
elif self.integral == TSL2561Integral.medium:
lux *= 3.98
return lux
def main():
"""
main function for test
"""
pi_daemon = pigpio.pi()
tsl2561 = TSL2561(pi_daemon)
tsl2561.initialize(1)
lux = tsl2561.read_illuminance()
print(f"Illuminance : {lux}")
tsl2561.finalize()
pi_daemon.stop()
if __name__ == "__main__":
main()
```
## Refarence
[datasheet](https://cdn-shop.adafruit.com/datasheets/TSL2561.pdf)
[qiita](https://qiita.com/aike@github/items/1c27438846f31670d38f)
[5\$](https://www.denshi.club/pc/raspi/5raspberry-pi-zeroiot27-1-i2c-tls2561.html)