Raspberry Pi Pico Wで温湿度気圧計を作る③

# 目次
[1.前回のまとめ](#1前回のまとめ)
[2.有機ELディスプレイ](#2有機elディスプレイ)
[3.Raspberry Pi Pico WとI2C通信する](#3raspberry-pi-pico-wとi2c通信する)
[4.コーディング](#4コーディング)
[5.まとめ](#5まとめ)

# 1.前回のまとめ
houwouです。
[前回の投稿](https://qiita.com/houwou/items/82338cbe2b62b4d45a51)でRaspberry Pi Pico Wと気圧センサMPL115A2、温湿度センサDHT20のI2C通信が無事に成功しました。
今回は有機ELディスプレイで遊んでみようと思います。

# 2.有機ELディスプレイ
有機ELディスプレイは[0.96インチ 128×64ドット有機EL（OLED）白色](https://akizukidenshi.com/catalog/g/gP-12031/)を使用します。
仕様は[秋月電子通商](https://akizukidenshi.com/catalog/)さんが掲載している取扱説明書で確認。
裏面のチップ抵抗R11をR12に付け替えることでスレーブアドレスが0x78から0x7Aに設定変更できるらしい。
![SSD1306.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/93e0666c-7b4c-03e5-9723-f670733b446c.jpeg)

# 3.Raspberry Pi Pico WとI2C通信する
Raspberry Pi Pico Wのピンアサインを[公式サイト](https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html)で確認する。
![Raspberry Pi Pico Wのピンアサイン](https://www.raspberrypi.com/documentation/microcontrollers/images/picow-pinout.svg)
今回もSDAはGP12、SCLはGP13を使用してI2C0で接続する。

次は[有機ELディスプレイ](https://akizukidenshi.com/catalog/g/gP-12031/)のピンアサインを確認、と思ったらSSD1306の取扱説明書には詳細なことが書いてありすぎて解読不可能。
でも親切なことに基盤にピンアサインが書いてあった。
VDDには3.3Vを供給、GNDはそのまま接地、SDAとSCLはそれぞれRaspberry Pi Pico WのSDAとSCL（今回はGP12とGP13）に接続。（DHT20と一緒）

これまで接続していた気圧センサMPL115A2と温湿度センサDHT20も同時にI2C接続したのがこちら。
![SSD1306回路図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/84e576c4-366a-b376-f1b3-1fc2c8b44c1a.jpeg)
![20230928_211931.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/d87e4b3c-9cfb-6b47-e503-f51299af29b9.jpeg)

念のため今回もスレーブアドレスを確認。
```python:i2c_scan.py
from machine import Pin, I2C

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

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

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

60の0x3Cが仲間になった。
あれ？0x78じゃないのか？
![SSD1306-i2c.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/a1e9508d-d5e2-59ef-8d04-bbf8a3007e74.jpeg)
取扱説明書を見れば解決した。
言われてみれば単純なことだった。
0x3Cは0011 1110で0x78は0111 1100。
0011 1110を左シフトすると0111 1100と一致する。
一桁目は読み書きのモード切替に使用するらしい。
ということで無事に接続成功！

# 4.コーディング
SSD1306はライブラリが豊富という噂通り、Thonnyの「パッケージを管理」でPyPIのMicropythonライブラリを検索すると1件ヒットしたのでそれをインストール。
![SSD1306-lib1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/f75a4962-f80a-bfb5-a64f-ae0f7f3959f2.jpeg)
![SSD1306-lib2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/3505627f-8717-031a-2762-18cb02200250.jpeg)
![SSD1306-lib3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/973933a0-0dac-02d3-74b6-b7e5e25efbd5.jpeg)

無事にインストールできたので、先人の知恵を借りながらコーディングしていく。（ライブラリ内のコードは割愛）
参考：[ラズパイPicoでSSD1306有機ELディスプレイの使い方 MicroPython編](https://logikara.blog/raspi_pico_oled_micropy/)


```python:main.py
from machine import Pin, I2C
import ssd1306

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

display = ssd1306.SSD1306_I2C(128, 64, i2c)

while True:
    display.fill(0)
    display.text('SSD1306 TEST', 5, 2, True)
    display.text('TEMP: 27.5C', 5, 18, True)
    display.text('HUMI: 66.6%', 5, 34, True)
    display.text('PRES: 1023.1hPa', 5, 50, True)

    display.show()
```
![20230929_232659.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559141/ceff04f7-2fe7-a0cf-97f9-f4d049bf3bff.jpeg)
見事成功！

# 5.まとめ
これで一通りのペリフェラルを接続することに成功した。
次回は少し実用性を考えた温湿度気圧計を設計してみる。