CircuitPython 10行プログラミング STEP7 (2) 気圧センサLPS22HB
前回、気圧センサLPS22HBをI2Cバスにつなぎ、スレーブ・アドレス0x5dを検出しました。
●プログラムで気圧と温度を表示
LPS22HBのデータシートを読むと、パワーオン後Power downモードになっています。CTRL_REG1 (10h)に0x10を書き込んで、1Hzでデータを変換するようにします。
また、CTRL_REG2 (11h)では、ONE_SHOTの変換がディセーブルになっているので、読み出す前には毎回イネーブルに設定します。CTRL_REG2 (11h)は、デフォルトが0x10でRegister address automatically incremented during a multiple byte access with a serial interface (I2C or SPI).がイネーブルになってるので、これはそのまま生かします。したがって、0x11を書き込みます。
気圧データは0x28から3バイト、温度データは0x2bから2バイトで保存されているのを読み出します。どちらも2の補数形式ですが、気圧は負の値はないので無視します。今回、温度は正の値だけを対象にします。
気圧データは4096で割るとhPaの値が得られます。温度データは100で割ると摂氏の値が得られます。
どちらも、読み出しの時、最上位ビットはマスク(| 0x80)をしておきます。
import board
import busio
import time
LPS22HB_adr=0x5d
i2c = busio.I2C(board.SCL, board.SDA)
while not i2c.try_lock():
pass
i2c.writeto(LPS22HB_adr, bytearray([0x10,0x10]))
time.sleep(1)
while 1:
i2c.writeto(LPS22HB_adr, bytearray([0x11,0x11]))
i2c.writeto(LPS22HB_adr, bytes([0x28 | 0x80]))
result = bytearray(3)
i2c.readfrom_into(LPS22HB_adr, result)
print(result)
press = (result[2]<<16 | result[1]<<8 | result[0]) / 4096.0
print(str(press) + 'hPa')
i2c.writeto(LPS22HB_adr, bytes([0x2b | 0x80]))
result = bytearray(2)
i2c.readfrom_into(LPS22HB_adr, result)
print(result)
press = (result[1]<<8 | result[0]) / 100.0
print(str(press) + '`C')
time.sleep(2)
i2c.unlock()
実行時の様子です。
●ライブラリを利用して気圧と温度を読み出す
Adafruitのライブラリを利用します。CIRCUITPYドライブのlibへ、にダウンロードしたadafruit-circuitpython-bundle-7.x-mpy-20220119の中のlibからadafruit_lps2x.mpyファイルとadafruit_registerフォルダをコピーします。examplesの中からlps2x_simpletest.pyをエディタMuへコピーしてします。
デフォルトがLPS25HBなのでコメントアウトし、lps = adafruit_lps2x.LPS22(i2c)を生かして実行します。
●14セグメントLEDに表示
アマゾンで入手した4桁の14セグメントLEDをI2Cバスにつなぎます。
CIRCUITPYドライブのlibへ、にダウンロードしたadafruit-circuitpython-bundle-7.x-mpy-20220119の中のlibからadafruit_ht16k33フォルダをコピーします。examplesの中からht16k33_segments_simpletest.pyをエディタMuへコピーしてします。
display = segments.Seg14x4(i2c)を有効にしてから実行します。問題なくデモが動き、数字やアルファベットが表示されます。
LPS22HBの測定データを14セグメントLEDに表示できるように修正します。
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
# Author: Tony DiCola
import time
import board
import busio
import adafruit_lps2x
from adafruit_ht16k33 import segments
# Create the I2C interface.
i2c = busio.I2C(board.SCL, board.SDA)
lps = adafruit_lps2x.LPS22(i2c)
display = segments.Seg14x4(i2c)
# Clear the display.
display.fill(0)
while True:
print("Pressure: %.2f hPa" % lps.pressure)
display.print(str(int(lps.pressure)))
time.sleep(2)
print("Temperature: %.2f C" % lps.temperature)
display.print(str(float(lps.temperature)))
time.sleep(2)
連載 CircuitPython 10行プログラミング Step8 release8.0.0 Alpha1
(4) I2Cで温度センサTMP117
(5) アナログ入力 ジョイスティック
連載 CircuitPython 10行プログラミング Step7 release7.2.0-alpha.1
(2) 気圧センサLPS22HB
連載 CircuitPython 10行プログラミング Step6 release7.0.0
(1) Nano RP2040 Connectの準備と動作確認
(2) Nano RP2040 Connectの搭載センサIMU LSM6DSOX
(3) Nano RP2040 ConnectにI2CでIMUセンサLSM9DS1
(5) Nano RP2040 Connectで確度0.1℃の温度計TMP117+ht16k33
連載 CircuitPython 10行プログラミング Step5
(1) Raspberry Pi Picoの準備と動作確認 (2) digitalio (3) Raspberry Pi Picoのmicrocontroller (4) アナログ入力 (5) PWM出力 (6) I2S出力 (7) I2C ① OLEDディスプレイ (8) I2C ② 温湿度センサ (9) I2C ③ 気圧センサ (10) Raspberry Pi PicoのSPI ① TFTディスプレイ
連載 CircuitPython 10行プログラミング Step4
(1) Adafruit Feather nRF52840 Senseの準備 (2) Lチカ (3) 搭載センサ (4) BLE①ペリフェラル (5) BLE②セントラル
連載 CircuitPython 10行プログラミング Step3
(1) Metro M4 Express AirLift (WiFi)の準備 (2) ロータリ・エンコーダ (3) eInk/ePaper (4) Wi-Fi その1 接続 (5) Wi-Fi その2 ソケット (6) Wi-Fi その3 電圧測定 (7) 気圧センサLPS25HB (8) サーミスタ
連載 CircuitPython 10行プログラミング Step2
(1) Grand Central M4 Expressの準備 (2) グラフィック・ディスプレイOLED (3) RTC DS3231 (4) モジュール/SDメモリ (5) 複合センサ BME680 (6) ロードセル+ADS1220 (7) サーボ・モータ① (8) サーボ・モータ② (9) I2S UDA1334A (10) D-Aコンバータ
連載 CircuitPython 10行プログラミング
(1) Trinket M0の準備 (2) ディジタルI/O (3) アナログ入出力 (4) I2C 温湿度センサSi7021 (5) SPI 熱電対+MAX31855 (6) UART 距離センサTFMini (7) 1-Wire 温度DS18B20 (8) ロータリ・エンコーダ (9) 7セグメントLED (10) FANコントロール (11) UART GPS (12) I2C Lチカ MCP23017