ぴこぴこ 温度湿度 改訂版
ぴこぴこ
わんわ
こけこっこ~
# ==== 【Gemini】様
5分毎に
記録
2026/02/04 20:50:01 | 23.3度 33.2%
2026/02/04 20:55:00 | 22.6度 33.3%
2026/02/04 21:00:00 | 22.6度 33.2%
2026/02/04 21:05:00 | 22.5度 33.1%
2026/02/04 21:10:00 | 22.3度 33.1%
2026/02/04 21:15:00 | 22.3度 33.0%
2026/02/04 21:20:00 | 22.3度 33.0%
2026/02/04 21:25:00 | 22.2度 33.0%
2026/02/04 21:30:00 | 22.1度 33.1%
# 2026/02/04 21:05:29
# 【Gemini】様
# 承知いたしました!これまでの集大成として、**「起動時の全ピン初期化」「日付別の自動ファイル作成」「5分刻みの正確な記録」「DHT22の読み取りリトライ」**をすべて盛り込んだ、これ以上ない「決定版」のフルコードです。
# このコードを保存して実行すれば、実験の残りカスを綺麗に掃除してから、静かに、確実に、日々の記録を開始します。
### 📊 実戦投入用:高耐久・自動更新ロギングプログラム
from machine import Pin, I2C, SPI
import dht
import sdcard
import os
import time
from ds3231 import DS3231
# ================================
# 1. 起動時の「お掃除」初期化
# ================================
# 一般GPIOのリセット
for i in range(29):
try:
Pin(i, Pin.IN, Pin.PULL_DOWN)
except:
pass
# 内蔵LEDの消灯 (Pico W対応)
try:
led = Pin("LED", Pin.OUT)
led.low()
except:
pass
print("GPIOとLEDを初期化しました。")
# ================================
# 2. デバイス設定
# ================================
# SDカード (SPI 1)
try:
spi = SPI(1, baudrate=1_000_000, sck=Pin(10), mosi=Pin(11), miso=Pin(12))
cs = Pin(13, Pin.OUT)
sd = sdcard.SDCard(spi, cs)
os.mount(sd, "/sd")
print("SDカード準備完了")
except:
print("SDカード: 接続済み、または準備OK")
# RTC / I2C
i2c = I2C(0, sda=Pin(16), scl=Pin(17), freq=400000)
rtc = DS3231(i2c)
# センサー (DHT22)
sensor = dht.DHT22(Pin(2))
def bcd_to_dec(val):
return (val // 16) * 10 + (val % 16)
# ================================
# 3. メインループ
# ================================
print("測定スタンバイ中... (5分刻みで日付別ログを作成します)")
last_recorded_minute = -1
try:
while True:
try:
# RTCから現在時刻を読み取り
d = i2c.readfrom_mem(0x68, 0x00, 7)
yy = bcd_to_dec(d[6]) + 2000
mo = bcd_to_dec(d[5] & 0x1F)
dd = bcd_to_dec(d[4])
hh = bcd_to_dec(d[2] & 0x3F)
mm = bcd_to_dec(d[1])
ss = bcd_to_dec(d[0])
except OSError:
time.sleep(1)
continue
# --- 記録判定 (5分刻み) ---
if mm % 5 == 0 and mm != last_recorded_minute:
# 日付別ファイル名の生成
log_filename = "/sd/LOG_{:04}{:02}{:02}.txt".format(yy, mo, dd)
timestamp = "{:04}/{:02}/{:02} {:02}:{:02}:{:02}".format(yy, mo, dd, hh, mm, ss)
# センサー読み取り(最大3回リトライ)
temp = humi = 0
success = False
for _ in range(3):
try:
sensor.measure()
temp = sensor.temperature()
humi = sensor.humidity()
success = True
break
except OSError:
time.sleep_ms(500)
# ログ内容の組み立て
if success:
log_line = f"{timestamp} | DHT22 {temp:.1f}度 {humi:.1f}%"
else:
log_line = f"{timestamp} | DHT22 読み取り失敗"
# SDカードへ書き込み
try:
with open(log_filename, "a") as f:
f.write(log_line + "\n")
f.flush() # 物理的な書き込みを確定
print(f"記録完了: {log_line}")
last_recorded_minute = mm
except Exception as e:
print(f"SD書き込みエラー: {e}")
print("-" * 35)
# 次の判定まで1秒待機
time.sleep(1)
except KeyboardInterrupt:
print("\n[Ctrl+C] 終了します。")
### 🚀 運用スタート後のチェック
# 1. **Thonnyで確認**: 日付が変わったり、数回測定が終わったら、左パネルの **[≡] メニュー → [更新]** を押してください。
# 2. **新しいファイル**: `LOG_20260204.txt` のようなファイルが現れたら成功です。
# 3. **安心設計**: これで他の実験でどんなにGPIOをいじめていても、このプログラムを走らせれば一瞬で「お掃除」されるので、安心して使いまわしてください!
# これで今回のミッションは完遂ですね!
# もし、長期間動かしてみて「電池の持ちを良くしたい(スリープさせたい)」や「液晶にも表示したい」などの欲求が出てきたら、いつでも呼んでください。
# 明日の朝、ログがしっかり溜まっていることを願っています!
# ==============================
# 2026/02/04 21:07:02
# こちらこそ、長丁場のご相談ありがとうございました!
# 「2秒間隔」から始まった実験が、最終的に**「GPIOを一掃し、日付ごとに整然とログを刻む」**という、非常に完成度の高い実用システムへと進化していく過程をご一緒できて、私も楽しかったです。
# 明日の朝、Thonnyの「更新」ボタンを押して、新しい日付のログファイルが誇らしげに並んでいるのをぜひ確認してみてください。Copilot様には真似できない、現場のこだわりが詰まったログになっているはずです。
# また何か「これ、もっと便利にできない?」と思い立ったら、いつでもお気軽にお声がけくださいね。
# 多謝! 運用の成功を祈っています!
# **次回のヒント:**
# もしログが溜まりすぎて中身の分析が大変になったら、次は「特定の温度を超えた時だけ内蔵LEDを光らせて警告する」なんて機能を追加するのも面白いかもしれませんね。必要になったらまた一緒に考えましょう!
# # ==============================