Raspberry Pi PicoでPicoMite(MMBasic)を使う〜温度測定結果をLCDに表示する

ADT7410での温度測定とAQM0802への出力ができるようになったので両者を組み合わせて温度センサーで測定した温度をLCDに表示するようにした。

# 使用する部品

| 機能     | 部品   |
| ------ | ----------------------------------------------------- |
| 温度センサー | [ADT7410使用 高精度・高分解能 I2C・16Bit 温度センサーモジュール](https://akizukidenshi.com/catalog/g/g106675/)        |
| LCD    | [I2C controlled 8×2LCD Breakout for Raspberry Pi](https://www.switch-science.com/products/1516) |

# 配線

温度センサーとLCDのI<sup>2</sup>CのSDA、SCLのピンはRaspberry Pi Picoの同じピンに接続する。

| 温度センサーとLCDのピン | Picoのピン(物理ピン番号) |
| :-----------: | :-------------: |
|      VDD      |     3V3(37)     |
|      SCL      |    GP17(22)     |
|      SDA      |    GP16(21)     |
|      GND      |    GND(3と38)    |

# 実体配線図

実体配線図を以下に示す。

![AQM0802LCD_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72921/d73f8c16-6d2f-4c22-9acd-dfb1a73afae5.png)

# 温度測定結果をLCDに表示するプログラム
以前作った温度測定プログラムとLCD表示プログラムを組み合わせればよい。
```BASIC
Dim data%(2), raw%, temp!, stemp$   ' Define variables
Const LCD_ADDR = &H3E               ' Set LCD I2C address
Const TMP_ADDR = &H48               ' Set ADT7410 I2C address
SetPin GP16, GP17, I2C              ' Set I2C pin for LCD
I2C OPEN 100, 100                   ' Open I2C channel 1
InitLCD                             ' Initialize LCD
LCD_CMD &H01                        ' Clear LCD
I2C Read TMP_ADDR, 0, 2, data%()    ' Read temperature data
raw% = data%(0) << 8 Or data%(1)    ' Convert data
raw% = raw% >> 3
If raw% >= 4096 Then raw% = raw% - 8192
temp! = raw% / 16.0
stemp$ = Str$(temp!, 2, 1) + CHr$(&DH) + "C" ' Make string of temperature
WriteString Str$(stemp$)            ' Write temperature
I2C CLOSE                           ' Close I2C channel 1

' Initialize LCD
Sub InitLCD
  Pause 40
  LCD_CMD &H38 : LCD_CMD &H39 : LCD_CMD &H14 : LCD_CMD &H70
  LCD_CMD &H56 : LCD_CMD &H6C
  Pause 200
  LCD_CMD &H38 : LCD_CMD &H0C : LCD_CMD &H01
  Pause 2
End Sub
' Write the letter of the code
Sub WriteChr code%
  I2C WRITE LCD_ADDR, 0, 2 , &H40, code%
End Sub
' Write string
Sub WriteString STRS$
  For i = 1 To Len(STRS$)
    I2C WRITE LCD_ADDR, 0, 2, &H40, Asc(Mid$(STRS$, i, 1))
  Next i
End Sub
' Write command
Sub LCD_CMD cmd%
  I2C WRITE LCD_ADDR, 0, 2, &H00, cmd%
  Pause 2
End Sub

End
```

13行目のコードについて
- `Str$(temp!, 2, 1)`は引数の数値から指定された整数部と小数部の桁数に応じた文字列を返す関数で、ここでは変数temp!の浮動小数点数から整数部2桁、小数部1桁の文字列を作る。
- Chr$は引数のコードの文字を返す関数で、&HDFはAQM0802では半濁点コードでCと組み合わせて℃を表現している（[AQM0802のコード表](https://akizukidenshi.com/goodsaffix/AQM0802.pdf)）。

このプログラムを実行すると温度センサーで計測された温度がLCDの1行目に表示される。

<!-- ここに写真 -->
![IMG_0903.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72921/41ef4b0d-4578-420a-9ea8-b6a6661b52eb.jpeg)

# 温度測定を繰り返すプログラム

温度測定を繰り返し実行したい場合は温度測定とLCD表示を`DO..LOOP`コマンドで繰り返せばよい。このとき、一定時間実行を停止し、LCDのカーソルを1行目の先頭に移動するようにしておく。
以下にそのコードを示す。サブルーチンは省略している。
無限ループしているプログラムは`CTRL+C`で終了できる。

```BASIC
Dim data%(2), raw%, temp!, stemp$
Const LCD_ADDR = &H3E
Const TMP_ADDR = &H48
SetPin GP16, GP17, I2C
I2C OPEN 100, 100
InitLCD
LCD_CMD &H01
Do                                  ' <--- Start Loop
  I2C Read TMP_ADDR, 0, 2, data%()
  raw% = data%(0) << 8 Or data%(1)
  raw% = raw% >> 3
  If raw% >= 4096 Then raw% = raw% - 8192
  temp! = raw% / 16.0
  stemp$ = Str$(temp!, 2, 1) + CHr$(&DH) + "C"
  WriteString Str$(stemp$)
  Pause 5000                        '<--- Wait 5 sec
  LCD_CMD &H80　　　　　　　　　　　　　' <--- Move cursor 1st line
Loop
I2C CLOSE
以下省略
```

## 電源投入と同時にプログラムを自動実行する

プログラムメモリに保存されているプログラムはコンソールから`RUN`コマンドで実行するが組み込み機器として利用する場合にはコンソールからの実行の指示がなくても電源投入と同時に自動的に実行させたい。
これを実現するには`OPTION AUTORUN`コマンドを使う。
次のコマンドで自動実行を有効にする。

```
> OPTION AUTORUN ON
```

自動実行しているプログラムはコンソール接続し、`CTRL+C`を入力すると終了できる。

OPTIONコマンドで設定した内容は電源の有無にかかわらず保持されるので自動実行の無効化したい場合は下記のコマンドを実行する。

```
> OPTION AUTORUN OFF
```

# 参考：コンソールの行数、文字数を変更する

PicoMiteのコンソール出力のデフォルトは24行80文字となっている。コンソール接続しているウィンドウのサイズがこれより大きい場合にはデフォルトの行数、文字数を超える部分には表示されない。より広い領域を`OPTION DISPLAY`コマンドで変更できる。
たとえば、40行100文字に変更する場合には次のコマンドを実行すればよい。一度実行したOPTIONコマンドはRaspberry Pi Picoの電源が切れても保持される。設定されているOPTIONは`OPTION LIST`コマンドで確認できる。

```
> OPTION DISPLAY 40, 100
> OPTION LIST
PicoMite MMBasic RP2040 Edition V6.00.01
OPTION COLOURCODE ON
OPTION DISPLAY 40, 100
>
```