Raspberry Pi PicoのmicroPythonでI2CとADCを使ってみる

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ラズパイPicoのI2CとA/Dの使い方が分かった。オンボード上に温度センサーある。<a href="https://twitter.com/hashtag/raspberrypipico?src=hash&amp;ref_src=twsrc%5Etfw">#raspberrypipico</a> <a href="https://t.co/xQJ1i0IDjP">pic.twitter.com/xQJ1i0IDjP</a></p>&mdash; Sam Akada@HomeKit (@sam_akada) <a href="https://twitter.com/sam_akada/status/1358315774700441601?ref_src=twsrc%5Etfw">February 7, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# Raspberry Pi Pico
まだ、Arduino IDEに対応していないので、TonneyにてmicroPythonを使っています。

# I2CでLCD制御、ADCで温度センサーを取得する
Raspberry Pi Picoに温度センサーが実装されています。
手持ちの[秋月のI2C接続小型LCDモジュール(AE-AQM0802A)](https://akizukidenshi.com/catalog/g/gM-09109/)を使いました。

# ソースコード
```python
# MicroPython for Rapperry Pi Pico
import utime

class ST7032():

    def __init__(self, i2c, addr=0x3e):
        self.i2c = i2c
        self.addr = addr
        self.buf = bytearray(2)
        self.initDisplay()

    def writeCmd(self, cmd):
        self.buf[0] = 0x00
        self.buf[1] = cmd
        self.i2c.writeto(self.addr, self.buf)

    def writeData(self, char):
        self.buf[0] = 0x40
        self.buf[1] = char
        self.i2c.writeto(self.addr, self.buf)

    def initDisplay(self):
        self.i2c.writeto(self.addr, b'\x00\x38')
        self.i2c.writeto(self.addr, b'\x00\x39')
        self.i2c.writeto(self.addr, b'\x00\x14')
        self.i2c.writeto(self.addr, b'\x00\x73')
        self.i2c.writeto(self.addr, b'\x00\x56')
        self.i2c.writeto(self.addr, b'\x00\x6c')
        self.i2c.writeto(self.addr, b'\x00\x38')
        self.i2c.writeto(self.addr, b'\x00\x0C')
        self.i2c.writeto(self.addr, b'\x00\x01')

    def clear(self):
        self.writeCmd(0x01)
        utime.sleep(0.01)
        self.writeCmd(0x02)
        utime.sleep(0.01)

    def home(self):
        self.write_cmd(0x02)
        utime.sleep(0.01)

    def setContrast(self, contrast):
        if contrast < 0:
            contrast = 0
        if contrast > 0x0f:
            contrast = 0x0f
        self.writeCmd(0x39)
        self.writeCmd(0x70 + contrast)

    def setCursor(self, x, y):
        if x < 0: x = 0
        if y < 0: y = 0
        addr = y * 0x40 + x
        self.writeCmd(0x80 + addr)

    def print(self, str):
        for c in str:
            self.writeData(ord(c))

if __name__ == '__main__':

    import utime
    from machine import Pin, I2C
    from ST7032 import ST7032

    sensor_temp = machine.ADC(4)
    conversion_factor = 3.3 / (65535)

    i2c=I2C(0, scl=Pin(17), sda=Pin(16), freq=100000)

    lcd = ST7032(i2c) 
    lcd.setContrast(1)
    lcd.clear()
    
    while True:
        reading = sensor_temp.read_u16() * conversion_factor

        temperature = 27 - (reading - 0.706)/0.001721
        tempStr = "  {:5.1f}C".format(temperature)
        lcd.setCursor(0, 0)
        lcd.print('Temp:')
        lcd.setCursor(0, 1)
        lcd.print(tempStr)
        utime.sleep(1)
```

# 参考
- [Raspberry Pi Picoで サーボモーターを動かす](https://qiita.com/SamAkada/items/0f3454fb1e65bec3a94e)
- [M1 Macで Raspberry Pi PicoのLチカ](https://qiita.com/SamAkada/items/13cf63b6fc8a8198c160)