以前Raspberry Pi Picoで作成したCO2センサーも焼き付き防止のため押しボタンを押したときだけ表示するように改良します。
使用したOLEDは表示しっぱなしだと意外と早く焼き付きますのでオススメです。
今回は過去記事のPythonコードをジェミニさんにお願いして押しボタンを追加したコードを書いてもらいました。
一部LED表示部分が変更されたコードでしたがその部分はもとに戻しました。
過去記事
使用パーツなどは過去記事をご覧ください。
Blynk用に作成したCO2センサーの記事です。
Python Code
押しボタンを追加したPythonのCodeです
##########################################################
# SH1106 OLED Display I2C Driver for Raspberry Pi Pico
# https://github.com/robert-hh/SH1106
# 日本語フォントを使用する
# https://github.com/Tamakichi/pico_MicroPython_Multifont
##########################################################
import machine
from machine import Pin, I2C
from sh1106 import SH1106_I2C
import utime
from micropython import const
from mfont import mfont
#----LED設定-----
led_red = Pin(16, Pin.OUT)
led_orange = Pin(17, Pin.OUT)
led_green = Pin(18, Pin.OUT)
led_blue = Pin(19, Pin.OUT)
#----ボタン設定----
# 例: GPIO 13番ピン(GNDとの間にスイッチを接続する場合は PULL_UP)
sw = Pin(13, Pin.IN, Pin.PULL_UP)
# 定数(デフォルトは、Seeed XIAO RP2040用)
I2C_ID = const(1) # I2C ID
I2C_FREQ = const(400_000) # I2C バス速度
OLED_WIDTH = const(128) # OLEDの横ドット数
OLED_HEIGHT = const(64) # OLEDの縦ドット数
OLED_ADDR = const(0x3c) # OLEDのI2Cアドレス
OLED_SCL = const(15) # OLEDのSCLピン
OLED_SDA = const(14) # OLEDのSDAピン
# OLEDディスプレイのインスタンスの生成
i2c = I2C(I2C_ID, scl=Pin(OLED_SCL), sda=Pin(OLED_SDA), freq=I2C_FREQ)
oled = SH1106_I2C(OLED_WIDTH, OLED_HEIGHT, i2c, addr=OLED_ADDR, rotate=180)
oled.contrast(255)
oled.invert(False)
# フォントの表示
def drawFont(self, font, x, y, w, h, flg=False):
bn = (w+7)>>3
py = y
for i in range(0, len(font), bn):
px = x
for j in range(bn):
for k in range(8 if (j+1)*8 <=w else w % 8):
self.pixel(px+k, py, 1 if font[i+j] & 0x80>>k else 0)
px+=8
py+=1
if flg:
self.show()
# テキストの表示
def drawText(self, text, x, y, fs, wt=0):
self.x = x
self.y = y
self.mf = mfont(fs)
self.mf.begin()
for c in text:
code = ord(c)
font = self.mf.getFont(code)
self.drawFont(font, self.x, self.y, self.mf.getWidth(), self.mf.getHeight(), True)
if wt:
utime.sleep_ms(wt)
self.x+=self.mf.getWidth()
self.mf.end()
# SH1106_I2Cに漢字表示インスタンス・メソッドの追加
SH1106_I2C.drawText = drawText
SH1106_I2C.drawFont = drawFont
# 起動時は画面をクリア
oled.fill(0)
oled.show()
#----CO2数値の表示---
mhz19c = machine.UART(1, baudrate=9600) # UART
while True:
# 1. CO2データの取得
data = bytearray([0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79])
mhz19c.write(data)
utime.sleep_ms(100) # レスポンス待ち
mhz19c.readinto(data, len(data))
co2 = data[2]*256 + data[3]
print(str(co2) + 'ppm')
# 2. ボタンの状態に応じてOLED表示を切替
# プルアップ接続の場合:押している間 `0`、離すと `1`
if sw.value() == 0:
oled.fill(0)
# タイトル表示 (wt=0 にして素早く描画)
oled.drawText("CO2 濃度測定", 15, 0, 16, 0)
# 数値表示
oled.drawText(str(co2) + " ", 15, 35, 24, 0)
oled.drawText("PPM", 87, 35, 24, 0)
oled.show()
else:
# ボタンを離したら画面消去
oled.fill(0)
oled.show()
#----LED表示----
if (co2 > 3000):
led_red.value(1)
led_orange.value(1)
led_green.value(1)
led_blue.value(1)
utime.sleep(2)
led_red.value(0)
elif (co2 > 2000):
led_red.value(0)
led_orange.value(1)
led_green.value(1)
led_blue.value(1)
utime.sleep(2)
led_orange.value(0)
elif (co2 > 1000):
led_red.value(0)
led_orange.value(0)
led_green.value(1)
led_blue.value(1)
utime.sleep(2)
led_green.value(0)
elif (co2 <= 1000):
led_red.value(0)
led_orange.value(0)
led_green.value(0)
led_blue.value(1)
utime.sleep(2)
led_blue.value(0)
utime.sleep(2)
AIによるCode作成について
やってほしいことを詳細に指示しないと後で手直しが発生しやすくなります
今回は簡単なCode追加でしたので大きな問題は起きませんでしたが、LED表示については指示しなかったので手直しがありました。
完成した画像です



