from machine import Pin, I2C
from DHT import DHT11, InvalidPulseCount
from lcd1602 import LCD
import utime as time
# --- DHT11 温湿度センサーの設定 ---
sensor = DHT11(Pin(20, Pin.IN)) # DHT11をGPIO20に接続(入力モード)
time.sleep(3) # センサー初期化待ち(安定化)
# --- I2C LCD1602 設定 ---
i2c = I2C(1, sda=Pin(18), scl=Pin(19), freq=400000) # I2Cバス1を使用(SDA=18, SCL=19)
i2c_addresses = i2c.scan() # I2Cに接続されているデバイスのアドレスをスキャン
print("I2C scan result:", i2c_addresses) # 確認用に表示
lcd = LCD(i2c, addr=0x27) # アドレス0x27でLCDインスタンス生成(固定)
# --- 初期メッセージ表示 ---
lcd.message("DHT11 Sensor\nReading Data...") # LCDに初期メッセージを表示
time.sleep(2)
lcd.clear() # LCDをクリア
# --- アラートを出す基準値の設定 ---
TEMP_MIN = 15 # 温度が15℃未満ならLOW!
TEMP_MAX = 30 # 温度が30℃超えならHIGH!
HUM_MIN = 30 # 湿度が30%未満ならLOW!
HUM_MAX = 70 # 湿度が70%超えならHIGH!
# --- メインループ ---
try:
while True:
try:
sensor.measure()
temperature = sensor.temperature
humidity = sensor.humidity
# --- 温度の判定 ---
if temperature < TEMP_MIN:
temp_status = "LOW!"
elif temperature > TEMP_MAX:
temp_status = "HIGH!"
else:
temp_status = "OK"
# --- 湿度の判定 ---
if humidity < HUM_MIN:
hum_status = "LOW!"
elif humidity > HUM_MAX:
hum_status = "HIGH!"
else:
hum_status = "OK"
# --- LCD 表示 ---
lcd.clear()
lcd.write(0, 0, f"{temperature}\xDFC {temp_status}")
lcd.write(0, 1, f"{humidity}% {hum_status}")
except InvalidPulseCount:
lcd.clear()
lcd.message("Sensor Error\nRetrying...")
time.sleep(2)
finally:
# --- プログラム終了時の処理 ---
lcd.clear()
lcd.message("STOPPED")
print("プログラムを終了しました。LCDもリセットしました。")