RasPi  Desk

Python日時温湿度GUI画面表示サンプルプログラム


*サンプルプログラムです。RasPi5の環境の差で動かないこともありますので自己責任で
 行ってください。
 実験用電子パーツのサイトにて示されているDHT11とLCDのサンプルプログラムを基にして
 GPIOピンなどを実験ボードにあわせた編集をしたもので爺さんのRasPi5で動作したプログラムです
 (I2C設定を enable にする)

 デバッグのために 無駄な print文が入っています


import tkinter as tk
import time
import sys
#------ for DHT11 ------
import dht11
import RPi.GPIO as GPIO

# ====== DHT11 読み取り関数 ======
# 当Raspberry Pi 5のPythonではlgpioの動作が不安定なのでdht11ライブラリを使用
#CHIP = 0
#PIN = 4  # GPIO4 を使用(必要に応じて変更)

#define GPIO 4 as DHT11 data pin(GPIO Socketpin 7)
Temp_sensor=4

# 時間表示の秒を数値ではなく*の点滅にするためグローバル変数でトグル動作を行う
FlgTogl=0
# DHT11からデータが取得できなかったときに直前の温湿度を表示するために文字列保持
savTemp=""
savHumi=""

# ====== Tkinter GUI ======
root = tk.Tk()
root.title("Raspberry Pi 5 温湿度モニター")
root.geometry("450x250")
root.configure(bg="black")

label_time = tk.Label(root, text="", font=("Arial", 32), fg="cyan", bg="black")
label_time.pack(pady=10)

label_temp = tk.Label(root, text="", font=("Arial", 28), fg="orange", bg="black")
label_temp.pack(pady=5)

label_humi = tk.Label(root, text="", font=("Arial", 28), fg="lightgreen", bg="black")
label_humi.pack(pady=5)

# -------------------- DHT11 Initialize ------------
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)       # Use BCM GPIO numbers

instance = dht11.DHT11(pin = Temp_sensor)

# ====== 画面更新 ======
def update_screen():
   global FlgTogl
   global savTemp
   global savHumi

#   秒表示を数値ではなく*のトグル動作とする    
   if FlgTogl == 0:
       FlgTogl=1
       FlgMark=" *"
   else:
       FlgTogl=0
       FlgMark="  "

   # 時刻表示
   now = time.strftime("%Y-%m-%d %H:%M"+FlgMark)
   label_time.config(text=now)

   # 温湿度読み取り
   result = instance.read()
   # Send some test
   if result.is_valid():
       label_temp.config(text=f"温度: " + str(result.temperature)+" ℃"+"  ")
       savTemp="温度: " + str(result.temperature)+" ℃"
       label_humi.config(text=f"湿度: " + str(result.humidity)+ " %"+"  ")
       savHumi="湿度: " + str(result.humidity)+ " %"
   else:
       label_temp.config(text=savTemp+" ー")
       label_humi.config(text=savHumi+" ー")

   root.after(2000, update_screen)  # 2秒ごと更新


update_screen()
root.mainloop()