Raspberry Pi PicoにLCD(AQM0802-PCA9515)と温度センサー(LM61CIZ)をつないで温度を表示

#はじめに
この夏、とうとうラズパイに手を出し始め、Raspberry Pi4や、Raspberry Pi Picoをいじっているのですが、Raspberry Pi Picoとこの組み合わせ、

 - LCD(AQM0802-PCA9515)
 - 温度センサー(LM61CIZ)

I2C接続のLCDと、アナログの温度センサーの組み合わせはRaspberry Pi Picoではまだあまり見かけないレアケース（？）かもしれないので、以下のサイトを参照した結果を記載します。
てなわけで、当方まだまだラズパイ(とPython)は初心者なので、間違い等がありましたら、ご指摘いただければ幸いです。 

#参照サイト
以下のサイトを参照しました。特にPicoの情報はまだまだ少ないので、先人の方々に感謝！
[CircuitPythonに温度センサーLM61CIZ(analog)を接続する]
(https://beta-notes.way-nifty.com/blog/2020/03/post-366f1d.html)
[ラズパイでAD変換！Picoでアナログ入力してみた]
(https://misoji-engineer.com/archives/raspberrypi-ad-pico.html)
[Raspberry PiとTWE-Liteで室温・気圧を測ってみた (2)]
(https://www.zukeran.org/shin/d/2015/03/11/raspberry-pi-and-twe-lite-2/)

#部材
すべて秋葉原の秋月電子で購入しました。
[**Raspberry Pi Pico**](https://akizukidenshi.com/catalog/g/gM-16132/)
ラズパイPico。OSさえ無い。MicroPython(とC/C++)が走るマイコン基板。たったの550円。
ブレッドボードに接続するため、[20ピンヘッダー](https://akizukidenshi.com/catalog/g/gC-04398/)をはんだ付けしました。はんだ付けができない/面倒な方は、ツクレルから[ピンが付いたのが販売](https://tkrel.shop/items/603c94cb243860414eaaf12e)されていますのでそちらをどうぞ。
Raspberry Pi 3/4系(zeroも？)はアナログ入力に対応しておらず、アナログ出力のセンサーをつなぐ際はADコンバーターをかまさないといけませんが、Picoだと５pin(一応ADC0〜2の3つは使える）があるので、アナログ出力のセンサーを直接つなげられます。
  
**ブレッドボード**
定番の[BB-801](https://akizukidenshi.com/catalog/g/gP-05294/)  
  
**LCD**
AE-AQE0802+PCA9515
秋月電子で[「Ｒａｓｐｂｅｒｒｙ　Ｐｉ　キャラクタ液晶ディスプレイモジュール完成品」](https://akizukidenshi.com/catalog/g/gM-11753/)として販売されているものです。
[「Ｒａｓｐｂｅｒｒｙ　Ｐｉ　キャラクタ液晶ディスプレイモジュールキット　バックライト付」](https://akizukidenshi.com/catalog/g/gK-11354/)でも良かったのですが、はんだ付けが面倒だったので、完成品にしてしまいました。
ブレッドボードへの接続は、ジャンパーピン接続だとケーブルだらけになってしまいますし、普通のピンヘッダーだとブレッドボードの上に立ってしまい表示内容が読みづらいので、[ピンヘッダ　（Ｌ型）　１×６　（６Ｐ）]((https://akizukidenshi.com/catalog/g/gC-05336/))でブレッドボード上に寝かせるように接続しています。

**温度センサー**
[高精度ＩＣ温度センサＬＭ６１ＣＩＺ](https://akizukidenshi.com/catalog/g/gI-11160/)
LC61CIZのスペックシートはメーカーのTI社の方針で、秋月電子のページからリンクもありません。TI社で公開しているスペックシートは[こちら](https://www.ti.com/lit/ds/symlink/lm61.pdf?HQS=dis-mous-null-mousermode-dsf-pf-null-wwe&ts=1630685119465)。
このセンサーのRaspberry Piでの使用例はあまり見かけませんでした(それで結構悩ませてくれました)。なので、解説本とかによく紹介されている[MCP9700A-E/TO](https://akizukidenshi.com/catalog/g/gI-14300/)とかをお勧めします。LM61CIZより25円安い30円ですし。  
  
  
**【補足】　LM61CIZのピンの配置について**
スペックシートに記載がありますが、ピンの配置はセンサーの平たい方を下にして足をこちらに向けて(スペックシートと逆の説明だなこりゃ)、左から

| LM61CIZ| Pico |
|:-:|:-:|
| GND  | GNDに接続  |
|  Vout |  ADCに接続 |
|  +Vs | 3v3(OUT)に接続  
となります。  

**その他**
ジャンパーピン(オス-オス)多数。

#構築環境
**iMac(10.13.6)**
ちょっと古いです。逆に最新のM1チップを積んだMacだとThonnyとか動くのかなぁという心配もあって、当分この環境ですかね。
MacでRaspberry Pi Picoをつないで、MicroPythonを使える環境にする方法は、いろいろな方が親切懇切丁寧に説明されているので、そちらを参照してください。  

#Raspberry Pi PicoとLCD+温度センサーの接続
最初、温度センサーだけをPicoにつないで動作確認。
次に、LCDだけをPicoにつないで動作確認。
その上で温度センサーとLCDの両方をPicoつなぐと、shell上で110℃と表示したり、LCDに何も表示できなかったりとハマりました。いろいろと出てきた値を見たり、ジャンパーピンの接続を変えた結果が、以下のとおりです。結局LM61CIZのGND接続を変えたら正常動作しました。GNDはどこでもOKと思ったのですが、選ぶんですかね？  
  
Raspberry Pi PicoとLCD+温度センサーは以下の接続で動作を確認。
###Pico to AQM0802
| Picoピン番号(GPIO)  | AQM0802 |
|:-:|:-:|
| 38([GND])  |  GND |
| 36(3V3(0UT)→ブレッドボードの[＋] |   3V3接続 |
| 32(GP27[ADC1])  |  SCL |
| 31(GP26[ADC0])  |  SDA |
  
###Pico to LM61CIZ
|Picoピン番号(GPIO)	| LM61CIZ|
|:-:|:-:|
| 3([GND]) | GND|
|34(GP28[ADC2]) | Vout|
|36(3V3(0UT)→ブレッドボードの[＋] | 3V3|
両方とも3V3を使うので、AQM0802とLM61CIZの3V3はブレッドボードの[＋]を経由して両方接続しています。
LCDでADC0とADC1を使うので、LM61はGP28のADC2を使います。

で、先ほども書きましたが、なぜかLM61のGNDを23pinのGNDにつなぐと、センサーからの値(電圧ですね)が単体で動かした時と違う値になってしまいました。
それでピン番号「3([GND])」にためしに接続したところ、単体試験と同じような値となりました。
これを書きながら調べていたのですが、以下のサイト見ると、
https://kirikoshokunin.hatenablog.com/entry/2021/04/13/234321
ADC_VREFとAGNDの方をむしろ使えばよかったのかな？
てか、これ、もう動かしてる写真でした。。。
![Pico_connected.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56853/d42a8335-40ce-c249-bc9a-4a44153921ba.jpeg)

#コード
コメントに日本語まじりのところはご愛嬌。そこが試行錯誤したところです。
参照先のサイトに掲載されているものを切り貼りしています。

```python:Pico+AQM0802+LM61CIZ.py
#LM61CIZ
import machine
import utime
#AQM0802
from machine import Pin, I2C
from micropython import const

from utime import sleep


#LM61 Vout connected to 34pin(ACD2)
#input LM61CIZ , convert voltage to temp value
sensor_temp = machine.ADC(2)
conversion_factor = 3.3 / (65535)

#AQM function
_ST7032  = const(0x3e)
_SETTING = const(0x00)
_DISPLAY = const(0x40)

#AQM initialized
def init(i2c):
    orders = [b'\x38', b'\x39', b'\x14', b'\x73', b'\x56', b'\x6c',
              b'\x38', b'\x0c', b'\x01']
    sleep(0.04)
    for order in orders[:6]:
        i2c.writeto_mem(_ST7032, _SETTING, order)
        sleep(0.001)
    sleep(0.2)
    for order in orders[6:]:
        i2c.writeto_mem(_ST7032, _SETTING, order)
        sleep(0.001)
    sleep(0.001)
    
#AQM show setting
def show(i2c, string):
    i2c.writeto_mem(_ST7032, _SETTING, b'\x01')
    sleep(0.002)
    for i in string:
        i2c.writeto_mem(_ST7032, _DISPLAY, i.encode())
#AQM show setting    
def main():
    i2c = I2C(1, scl=Pin(27), sda=Pin(26))
    init(i2c)
    #display temp data
    show(i2c, tempdata)

while True:
    #センサーから値を取り出します
    reading = sensor_temp.read_u16() * conversion_factor
    #センサから取り出した電圧
    #print(sensor_temp.read_u16())
    # 電圧を温度に変換
    temp_calc = (reading*1000-600) / 10
    #shellに表示
    #print("{0:.1f}".format(temp_calc)  + "C")
    #print(reading)
    #tempdata = str(temp_calc)
    #小数点以下1位のみ表示+ 温度のCをつける
    tempdata = ("{0:.1f}".format(temp_calc)  + "C")

    #Run
    if __name__ == '__main__':
        main()
    # 動作確認用のLチカ
    led = machine.Pin(25, machine.Pin.OUT)
    led.value(1)
    utime.sleep(0.2)
    led.value(0)
  
    #each 2 second
    utime.sleep(2)
```
動作確認用、というか、地味なLCD表示を2秒ごとに更新してるのですが、温度に変化がないと動いているかわかりません。
そこで動作していることを分かりやすくするためにRaspberry Pi Pico本体のLEDを点滅させています。
普通はいらないと思うので、お好みに応じてコメントアウトしてください。
逆にコメントアウトでたっぷり残しているところは、動かなくなった時、動作確認のため値を表示させていたところです。

#実行
Raspberry Pi Pico本体のLEDが点滅しています。
![Pico_sensor+LCD_running.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56853/ccdb33f1-458e-376d-1329-0ff552113744.jpeg)


動作確認用に奥においた温度計は、これもまた秋月電子で180円で購入しました。
[ミニサーモメーター（小型温度計モジュール）　ブラック（黒）](https://akizukidenshi.com/catalog/g/gM-13157/)
8秒ごとに温度更新。なにせこの価格なので、あくまでもRaspberry Pi Pico側の動作確認するための比較対象としてです。

温度センサーのスペックシートを見ると「Accuracy at 25°C」で「±2°C or ±3°C」とありますので、まぁこんなものかな、と。比較対象の温度計も全然厳密に測定しているわけではないので(LCD込みで価格はLM61CIZの3倍以内というシロモノ)、だいたいこんなものでしょう。

この情報がどなたかのお役に立てば。。。

それにしても私の部屋、エアコン付けているのに暑いな。