ぴこぴこ DHT11 + ブザー | 60歳を迎えて、思うこと。

60歳を迎えて、思うこと。

いつの間にか、「60」という年月が経ちました。
残り少ないか多いか?わかりませんが。
じじぃ~の「ひとりごと」を細々と続けられれば。。。

ぴこぴこ DHT11 + ブザー

ぴぴぴ
ぴぃ~ぴぃ~ぴぃ~

にゃんですと!

さて
温湿度

圧電ブザー

【Gemini】様
の合体技

OnLineBackUp
で ありまする

# ====
# 「状態が変わった瞬間だけ鳴らす」
# というのは、
# 実用的なデバイスを作る上で
# 非常に重要なテクニックです。
# これを実現するために、
# **「前回の湿度の状態」を
# 覚えておく変数**(フラグ)を使います。
### 合体版:温湿度お知らせアラーム
# (お片付け機能付き)

# ```python


import machine
import dht
import utime
from machine import Pin

# --- Block 1: 設定 ---
# センサーとLEDの設定
sensor = dht.DHT11(machine.Pin(20))
led_green = machine.Pin(14, machine.Pin.OUT)
led_red = machine.Pin(13, machine.Pin.OUT)

# ブザーの設定
BUZZER_PIN = 5
buzzer = Pin(BUZZER_PIN, Pin.OUT)

# ブザーの音の設定
short_beep_dur = 0.1
short_pause_dur = 0.1

# 【重要】今の状態を記録する変数(最初は「不明」にしておく)
# これを使って「乾燥←→適正」が切り替わった瞬間を判定します
last_status = None 

print("システム開始... (STOPボタンで全ピンOFFにして終了します)")

# ぴぴぴ、と3回鳴らす関数(お作法として定義)
def beep_3_times():
    for i in range(3):
        buzzer.value(1)
        utime.sleep(short_beep_dur)
        buzzer.value(0)
        utime.sleep(short_pause_dur)

try:
    # --- Block 2: メインループ ---
    while True:
        try:
            sensor.measure()
            temp = sensor.temperature()
            hum = sensor.humidity()
            
            # 現在の状態を判定
            if hum < 40:
                current_status = "dry"    # 乾燥
            else:
                current_status = "good"   # 適正
            
            print(f"温度: {temp}℃  湿度: {hum}% [{current_status}]")

            # --- 状態が変わったかチェック ---
            if current_status != last_status:
                # 状態が変わった(初回実行時もここを通ります)
                print("--> 状態が変化しました。お知らせします!")
                
                # LEDの切り替え
                if current_status == "dry":
                    led_red.value(1)
                    led_green.value(0)
                else:
                    led_red.value(0)
                    led_green.value(1)
                
                # 状態が変わった時だけ「ぴぴぴ」と鳴らす
                # (初回起動時に鳴らしたくない場合は if last_status is not None: を追加します)
                beep_3_times()
                
                # 今の状態を「前回の状態」として保存
                last_status = current_status
            
        except OSError:
            print("センサー読み取りエラー。リトライします。")
        
        utime.sleep(2) # 2秒ごとにチェック

except KeyboardInterrupt:
    # --- Block 3: 中断 ---
    print("\nSTOPボタンが押されました。")

finally:
    # --- Block 4: お片付け(徹底消灯) ---
    print("安全に終了するため、全てのGPIOをLにします...")
    
    # 1. 明示的に使ったピンをオフ
    led_red.value(0)
    led_green.value(0)
    buzzer.value(0)
    
    # 2. 全てのGPIO(0-28)を走査してLにする(ご要望の徹底対策)
    for i in range(29):
        try:
            # 念のため全てのピンを出力モードにして0を書き込む
            p = Pin(i, Pin.OUT)
            p.value(0)
        except:
            pass # システムで使用中のピンなどはスキップ
            
    print("電源オフの準備が整いました。")



### 結合のポイント解説
# 1. **「状態の記憶」 (`last_status`)**:
# * `last_status` という変数に、「さっきまで乾燥してた?適正だった?」を覚えさせています。
# * `if current_status != last_status:` という条件を使うことで、**「乾燥から適正になった瞬間」**または**「適正から乾燥になった瞬間」**だけ、ブザー(beep_3_times)を動かしています。

# 2. **徹底的なお片付け (Block 4)**:
# * `finally` の中で、特定のピン(LEDとブザー)を消すだけでなく、`for`ループを使ってPicoの全ピンを無理やり `0 (L)` にしています。これで、どのピンに何を繋いでいても、プログラム終了と同時に電気が止まります。

# 3. **関数化 (`def beep_3_times`)**:
# * 「ぴぴぴ」という動作を一つのカタマリ(関数)にしました。これでメインのプログラムがスッキリ読みやすくなります。
# これで、湿度が40%をまたぐたびに「ぴぴぴ」と教えてくれ、止める時は全ての電気が消えて安全に終了するはずです!ぜひ試してみてください。
# ==============================