ぴこぴこ 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%をまたぐたびに「ぴぴぴ」と教えてくれ、止める時は全ての電気が消えて安全に終了するはずです!ぜひ試してみてください。
# ==============================