見出し画像

Raspberry Pi PicoでPythonのお勉強 ~4~

BME280モジュールの続きですが、I2Cのリードでは123行目に前回とは別の記述がありました。

        self.i2c.readfrom_mem_into(self.address, 0xF7, self._l8_barray)

これをMicroPython librariesで調べると

I2C.readfrom_mem_into(addr, memaddr, buf, *, addrsize=8)
Read into buf from the peripheral specified by addr starting from the memory address specified by memaddr. The number of bytes read is the length of buf. The argument addrsize specifies the address size in bits (on ESP8266 this argument is not recognised and the address size is always 8 bits).
The method returns None.

https://docs.micropython.org/en/latest/index.html

となっていて、前回調べた"i2c.readfrom_mem"とはちょっと違っています。i2c.readfrom_memはリターンがbytes型でしたが、I2C.readfrom_mem_intoではリターンが無くbufで指定した変数にI2Cで読み出したデータが格納されるようです。また読み出されるbyte数はbufで指定した変数の長さになるのでわざわざ指定する必要はないようです。BME280モジュールではbufにself._l8_barrayというbytearray型の変数を指定してそこにI2Cで読み出したデータを格納しています。

bytes型とbytearray型の違いですが、bytes型はimmutable(変更不可)でbytearray型は mutable(変更可)だそうです。なので、あとで書き換える必要がある場合はbytearray型を使えるI2C.readfrom_mem_intoを使った方が良いということになりますか。

array関連だとソース内に下記の記述がありました。

        return array("i", (temp, pressure, humidity))

配列を作成するためにarray.array()というクラスがあるようです。配列要素の型を指定してから、それに続けて配列の初期化ができるみたいです。この辺も組み込み要素ではよく使うことになるのかな?

いいなと思ったら応援しよう!