LoginSignup
0
1

目次

1.前回のまとめ
2.温湿度センサ
3.Raspberry Pi Pico WとI2C通信する
4.コーディング
5.まとめ

1.前回のまとめ

houwouです。
前回の投稿でRaspberry Pi Pico Wと気圧センサMPL115A2のI2C通信が無事に成功しました。
今回は温湿度センサで遊んでみようと思います。

2.温湿度センサ

温湿度センサはDHT20を使用します。
仕様は秋月電子通商さんが掲載している取扱説明書で確認。
DHT2.jpg

3.Raspberry Pi Pico WとI2C通信する

毎度おなじみRaspberry Pi Pico Wのピンアサインを公式サイトで確認する。
Raspberry Pi Pico Wのピンアサイン
前回の気圧センサと同様、I2C0で接続するが、配線の関係上SDAはGP12、SCLはGP13を使用することにした。

次はDHT20のピンアサインを確認する。
ATH21B.jpg
VDDには3.3Vを供給、GNDはそのまま接地、SDAとSCLはそれぞれRaspberry Pi Pico WのSDAとSCL(今回はGP12とGP13)に接続。(シンプル!)

今回はさらにI2C接続に成功した気圧センサも同時に接続することにした。
さっと調べてもRaspberry Pi Picoで1系統のI2Cに複数のペリフェラルと接続した例が見つからなかったので半信半疑で配線。
DHT20回路図.jpg
20230927_190115.jpg

ちょっと不安だったのでスレーブアドレスを確認してみることに。

i2c_scan.py
from machine import Pin, I2C

i2c = I2C(0, sda=Pin(12), scl=Pin(13), freq=100000)

print(i2c.scan())
shell
>>> %Run -c $EDITOR_CONTENT

MPY: soft reboot
[56, 96]
>>> 

96は0x60なので気圧センサMPL115A2のスレーブアドレスで、56が0x38で温湿度センサDHT20のスレーブアドレスの模様。
無事に同時に接続できた!

4.コーディング

DHT20のライブラリが転がっていたので遠慮なく使わせてもらうことにした。
参考:Raspberry Pi Pico WにGROVE温度・湿度センサ(DHT20)をつなぐ

dht20.py
from machine import I2C
from time import sleep_ms
class DHT20(object):
    def __init__(self, i2c):
        self.i2c = i2c
        if (self.dht20_read_status() & 0x80) == 0x80:
            self.dht20_init()  
            
    def read_dht20(self):
        self.i2c.writeto(0x38, bytes([0xac,0x33,0x00]))
        sleep_ms(80)
        cnt = 0
        while (self.dht20_read_status() & 0x80) == 0x80:
            sleep_ms(1)
            if cnt >= 100:
                cnt += 1
                break
        data = self.i2c.readfrom(0x38, 7, True)
        n = []
        for i in data[:]:
            n.append(i)
        return n
        
    def dht20_read_status(self):
        data = self.i2c.readfrom(0x38, 1, True)
        return data[0]
    
    def dht20_init(self):
        i2c.writeto(0x38, bytes([0xa8,0x00,0x00]))
        sleep_ms(10)
        i2c.writeto(0x38, bytes([0xbe,0x08,0x00]))
        
    def calc_crc8(self,data):
        crc = 0xff
        for i in data[:-1]:
            crc ^= i
            for j in range(8):
                if crc & 0x80:
                    crc = (crc << 1) ^ 0x31
                else:
                    crc = (crc << 1)
        return crc
    
    def dht20_temperature(self):
        data = self.read_dht20()
        Temper = 0
        if 1:
            Temper = (Temper | data[3]) << 8
            Temper = (Temper | data[4]) << 8
            Temper = Temper | data[5]
            Temper = Temper & 0xfffff
            Temper = (Temper * 200 * 10 / 1024 / 1024 - 500)/10
        return Temper
    
    def dht20_humidity(self):
        data = self.read_dht20()
        humidity = 0
        if 1:
            humidity = (humidity | data[1]) << 8
            humidity = (humidity | data[2]) << 8
            humidity = humidity | data[3]
            humidity = humidity >> 4
            humidity = (humidity * 100 * 10 / 1024 / 1024)/10
        return humidity
main.py
from machine import I2C, Pin
from dht20 import DHT20
from mpl115a2 import MPL115A2

i2c = I2C(0, scl=Pin(13), sda=Pin(12), freq=100000)
dht20 = DHT20(i2c)
mpl115a2 = MPL115A2(i2c)

temp = dht20.dht20_temperature()
humidity = dht20.dht20_humidity()
air_pressure = mpl115a2.air_pressure()

print("temperature : " + str(temp))
print("humidity : " + str(humidity))
print("air pressure : " + str(air_pressure))
shell
>>> %Run -c $EDITOR_CONTENT

MPY: soft reboot
temperature : 26.32714
humidity : 66.87069
air pressure : 1010.528
>>> 

見事成功!

5.まとめ

Raspberry Pi Pico WのI2C接続でも複数のペリフェラルを問題なく接続できることが確認できた。
次回は有機ELディスプレイを接続してみる。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1