TOPに戻る

ラズパイ5 pythonの仮想環境 ⑥ 温湿度センサSHT45<その3>

 前回、温湿度センサをsmbus2ライブラリを利用してアクセスするのを失敗しましたが、ラズパイに用意されているデバイス・ドライバを利用して測定データを読み出せました。ここでは、 sensirion社のSHT4x用pythonライブラリを利用します。

  Python I2C Driver for Sensirion SHT4X

 仮想環境に入り、pipで、上記のライブラリをインストールします。

 $ source env/bin/activate

(env) yoshi@ras05:~ $ pip install sensirion_i2c_sht4x
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting sensirion_i2c_sht4x
  Downloading sensirion_i2c_sht4x-1.0.0-py3-none-any.whl (8.3 kB)
Collecting sensirion-driver-adapters<3.0,>=2.1.8
  Downloading https://www.piwheels.org/simple/sensirion-driver-adapters/sensirion_driver_adapters-2.1.9-py3-none-any.whl (28 kB)
Collecting sensirion-driver-support-types~=0.2.0
  Downloading https://www.piwheels.org/simple/sensirion-driver-support-types/sensirion_driver_support_types-0.2.0-py3-none-any.whl (4.8 kB)
Collecting sensirion-i2c-driver<2.0,>=1.0.0
  Downloading https://www.piwheels.org/simple/sensirion-i2c-driver/sensirion_i2c_driver-1.0.0-py3-none-any.whl (16 kB)
Collecting sensirion-shdlc-sensorbridge~=0.1.1
  Downloading https://www.piwheels.org/simple/sensirion-shdlc-sensorbridge/sensirion_shdlc_sensorbridge-0.1.1-py3-none-any.whl (38 kB)
Collecting sensirion-shdlc-driver
  Downloading https://www.piwheels.org/simple/sensirion-shdlc-driver/sensirion_shdlc_driver-0.1.5-py3-none-any.whl (33 kB)
Collecting pyserial~=3.0
  Downloading https://www.piwheels.org/simple/pyserial/pyserial-3.5-py2.py3-none-any.whl (90 kB)
     笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤 90.6/90.6 kB 319.6 kB/s eta 0:00:00
Collecting intelhex~=2.0
  Downloading https://www.piwheels.org/simple/intelhex/intelhex-2.3.0-py2.py3-none-any.whl (50 kB)
     笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤笏≫煤 50.9/50.9 kB 164.7 kB/s eta 0:00:00
Installing collected packages: pyserial, intelhex, sensirion-shdlc-driver, sensirion-i2c-driver, sensirion-driver-support-types, sensirion-shdlc-sensorbridge, sensirion-driver-adapters, sensirion_i2c_sht4x
Successfully installed intelhex-2.3.0 pyserial-3.5 sensirion-driver-adapters-2.1.9 sensirion-driver-support-types-0.2.0 sensirion-i2c-driver-1.0.0 sensirion-shdlc-driver-0.1.5 sensirion-shdlc-sensorbridge-0.1.1 sensirion_i2c_sht4x-1.0.0

 GitHubにあるソースをテキスト・エディタにコピペします。保存名はsht45b.pyにしました。

  python-i2c-sht4x/examples/example_usage_linux_sht4x.py

 実行します。必要なライブラリは全部インストールされたようです。


(env) yoshi@ras05:~ $ python sht45b.py

serial_number: 241073070; 
a_temperature: 21.83; a_humidity: 43.02; 
a_temperature: 21.88; a_humidity: 42.98; 
a_temperature: 21.83; a_humidity: 43.02; 
a_temperature: 21.84; a_humidity: 43.03; 
a_temperature: 21.84; a_humidity: 43.03; 
a_temperature: 21.82; a_humidity: 43.02; 
a_temperature: 21.87; a_humidity: 42.97;

...

 測定データの読み出し部分を関数readTempHumi()にしました。

import argparse
import time
from sensirion_i2c_driver import LinuxI2cTransceiver, I2cConnection, CrcCalculator
from sensirion_driver_adapters.i2c_adapter.i2c_channel import I2cChannel
from sensirion_i2c_sht4x.device import Sht4xDevice

parser = argparse.ArgumentParser()
parser.add_argument('--i2c-port', '-p', default='/dev/i2c-1')
args = parser.parse_args()

def readTempHumi():
    with LinuxI2cTransceiver(args.i2c_port) as i2c_transceiver:
        channel = I2cChannel(I2cConnection(i2c_transceiver),
                             slave_address=0x44,
                             crc=CrcCalculator(8, 0x31, 0xff, 0x0))
        sensor = Sht4xDevice(channel)
        try:
            sensor.soft_reset()
            time.sleep(0.01)
        except BaseException:
            ...
        try:
            (a_temperature, a_humidity
             ) = sensor.measure_lowest_precision()
        except BaseException:
            pass
    return a_temperature, a_humidity

temperature, humidity = readTempHumi()
print(temperature, humidity)

環境

  • ハードウェア Raspberry Pi 5(4GBモデル)
  • OS Raspberry Pi OS (64ビット)、リリース日December 5th 2023
  • Windows10 22H2にて、ssh(OpenSSH_9.2p1 Debian-2+deb12u2, OpenSSL 3.0.11 19 Sep 2023)および、VNC Viewerを動作させている

7segLED表示器に表示

 I2Cバスに白色の7segLED表示器を接続しました。これ1個だと温度と湿度を交互に表示するなどしなければならないので、アマゾンで購入した同じコントローラを使った赤色の7segLED表示器をI2Cバスにつなぎました。

 赤色の7segLED表示器は、小数点の表示が出ません。

  第3回の、

  ラズパイ5 pythonの仮想環境 ③ 温度センサTMP117の測定結果を4桁7セグメントLED表示器に

 温度と湿度の表示部分を、2個の表示器に対応させ、右詰の表示に変更しました。赤色は湿度を整数値で表示するようにしました。

import argparse
import time
import smbus2
from sensirion_i2c_driver import LinuxI2cTransceiver, I2cConnection, CrcCalculator
from sensirion_driver_adapters.i2c_adapter.i2c_channel import I2cChannel
from sensirion_i2c_sht4x.device import Sht4xDevice

i2c_address0 = 0x70
i2c_address1 = 0x71
i2c=smbus2.SMBus(1)

HT16K33_GENERIC_SYSTEM_ON  = 0x21
HT16K33_GENERIC_DISPLAY_ON = 0x81
i2c.write_byte_data(i2c_address0, HT16K33_GENERIC_SYSTEM_ON,  0)
i2c.write_byte_data(i2c_address1, HT16K33_GENERIC_SYSTEM_ON,  0)
i2c.write_byte_data(i2c_address0, HT16K33_GENERIC_DISPLAY_ON, 0)
i2c.write_byte_data(i2c_address1, HT16K33_GENERIC_DISPLAY_ON, 0)

HT16K33_GENERIC_CMD_BRIGHTNESS = 0xe0
i2c.write_byte_data(i2c_address0, HT16K33_GENERIC_CMD_BRIGHTNESS, 8)
i2c.write_byte_data(i2c_address1, HT16K33_GENERIC_CMD_BRIGHTNESS, 8)

num={'0':0x3f,'1':0x06,'2':0x5b,'3':0x4f,'4':0x66,'5':0x6d,'6':0x7d,
        '7':0x07,'8':0x7f,'9':0x67, '-':0x40, '.':0x80}
seg={0:8,1:6,2:2,3:0}

def clear7segLED(addr):  # i2c_address0 , i2c_address1
    i2c.write_i2c_block_data(addr, 0, [0x00] * 10)

def disp7segLED(data,addr):
    dataString = str(data)
    dataLength = len(dataString)
    buf = ([0]*dataLength)
    for i in range(dataLength):
        buf[i] = dataString[-1*(i+1)]
        buf[i] = num[buf[i]]
    for k in range(dataLength-1 if 128 in buf else dataLength):
        if buf[k] == 128:  # '.'
            buf[k+1] = buf[k+1] + 128  # LED dot
            del buf[k]
    for i in range(len(buf)):
        i2c.write_byte_data(addr, seg[i], buf[i])

parser = argparse.ArgumentParser()
parser.add_argument('--i2c-port', '-p', default='/dev/i2c-1')
args = parser.parse_args()

def readTempHumi():
    with LinuxI2cTransceiver(args.i2c_port) as i2c_transceiver:
        channel = I2cChannel(I2cConnection(i2c_transceiver),
                             slave_address=0x44,
                             crc=CrcCalculator(8, 0x31, 0xff, 0x0))
        sensor = Sht4xDevice(channel)
        try:
            sensor.soft_reset()
            time.sleep(0.01)
        except BaseException:
            ...
        try:
            (a_temperature, a_humidity
             ) = sensor.measure_lowest_precision()
        except BaseException:
            pass
    return float(str(a_temperature)), float(str(a_humidity))

# main
print("test start")

while 1:
    clear7segLED(i2c_address0)
    clear7segLED(i2c_address1)
    temperature, humidity = readTempHumi()
    print(temperature, humidity)
    disp7segLED(round(temperature,1),i2c_address1)
    disp7segLED(int(humidity),i2c_address0)
    time.sleep(3)

 実行例です。

-