1

Hi I've been trying to implement a DHT22 temperature and humidity sensor with Tkinter GUI where it updates regularly while using the GUI. This is done on a Raspberry Pi 4 using Python. However, while the numbers are updating correctly, it would cause the GUI freeze momentarily while updating the numbers. I have already tried multithreading, but it unfortunately didn't help. Is there any solution to this problem? Any help is greatly appreciated. Here's the code:

# Import the required libraries
import RPi.GPIO as GPIO
import spidev
import time
import tkinter
from tkinter import *
import tkinter.font as tkFont
from PIL import ImageTk, Image
# import time    
import smbus
import serial
import os
import argparse
import Adafruit_DHT
from threading import Thread
SENSOR = Adafruit_DHT.DHT22

# GPIO4 on the Raspberry Pi
SENSOR_PIN = 4

address = 0b01
ssPin = 8
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz = 976000
spi.mode = 0b11 
#spi.bit_order = msbfirst
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(ssPin,GPIO.OUT)
GPIO.setup(22,GPIO.OUT)
GPIO.setup(26,GPIO.OUT)
GPIO.output(ssPin,GPIO.LOW)
GPIO.output(22,GPIO.HIGH)
GPIO.output(26,GPIO.HIGH)

class App:
    def __init__(self, master):

        def SendScaleReading(self):
            S = scale.get() #retrieve value from slider
            if S>0:
                S+=155
            print(S)
            spi.xfer([address ,S]) #write data to slave address

        frame = Frame(master)
        frame.pack()
        scale = tkinter.Scale(root,from_=0,to=100,length=700,bg='black',fg='#0000FF', highlightthickness = 0, bd = 0, command=SendScaleReading) #set parameters of slider
        scale.place(relx=0.75, rely=0.05)
        #scale.place(relx = 0, rely = 0) # set position of slider
        fontstyle = tkFont.Font(family='Arial', size=50) #initialise font
        scale['font'] = fontstyle 

def PowerFn():
    global powerBool
#     print(ledBool)

    if powerBool:
        #print('went to on button')
        powerBtn.config(image=On_BtnImg)  
        powerBtn.image = On_BtnImg
        #print("on button configured")
        powerLabel.config(text="POWER: ON", fg='#00FF00')
        # communicating with arduino
        GPIO.output(26,GPIO.LOW)
        
    else:
        #print('went to off button')
        powerBtn.config(image=Off_BtnImg)
        powerBtn.image = Off_BtnImg
        #print("off button configured")
        powerLabel.config(text="POWER: OFF", fg='#FF0000')
        # communicating with arduino
        GPIO.output(26,GPIO.HIGH)
        
    powerBool = not powerBool

def DirectionFn():
    global directionBool
#     print(cbBool)
    if directionBool: 
        #print('went to CbOn button')
        directionBtn.config(image = On_BtnImg)
        directionBtn.image = On_BtnImg
        #print("CbOn button configured")
        directionLabel.config(text="FORWARD", fg='#00FF00')
        # communicating with arduino
        GPIO.output(22,GPIO.HIGH)

    else:
        #print('went to CbOff button')
        directionBtn.config(image = Off_BtnImg)
        directionBtn.image = Off_BtnImg
#         print("CbOff button configured")
        directionLabel.config(text="REVERSE", fg='#FF0000')
        # communicating with arduino
        GPIO.output(22,GPIO.LOW)
        
    directionBool = not directionBool

def tempsensor():
    while True:
        print("bruh moment")
        h, t = Adafruit_DHT.read_retry(SENSOR, SENSOR_PIN)
        print(t)
        print(h)
        temp = "%.1F" %t
        hum = "%.1f" %h
        temperature.set(temp+ " *C")
        humidity.set(hum+ " %")
        time.sleep(1);
              
root = Tk()
app = App(root)
root.config(bg='black')
#root.attributes('-zoomed', True)
#root.state('fullscreen')
rootWidth = root.winfo_screenwidth()
rootHeight = root.winfo_screenheight()
root.attributes('-zoomed', True)
# Create mini window
#canvas = Canvas(root, bg='black', highlightbackground='white')
#canvas.place(relx=0.1, rely=0.03, relheight=0.51, relwidth=0.505)
temperature = StringVar()
temperature.set("----"+" *C")
humidity = StringVar()
humidity.set("----"+" %")
#root.after(2000, tempsensor)
h, t = Adafruit_DHT.read_retry(SENSOR, SENSOR_PIN)

On_img = Image.open("/home/pi/Downloads/on.png")
Off_img = Image.open("/home/pi/Downloads/off.png")

# Resize the image using resize() method according to the screen height and width
btnWidth = int(rootWidth / 6.4)
print(btnWidth)
infobtnWidth = int(rootHeight / 10)
print(infobtnWidth)

On_resize_img = On_img.resize((btnWidth, btnWidth))
Off_resize_img = Off_img.resize((btnWidth, btnWidth))
On_BtnImg = ImageTk.PhotoImage(On_resize_img)
Off_BtnImg = ImageTk.PhotoImage(Off_resize_img)

normalWidth = 1920  # Width of monitor screen used to write this code
normalHeight = 1080  # Height of monitor screen used to write this code

percentWidth = rootWidth / (normalWidth / 100)
percentHeight = rootHeight / (normalHeight / 100)

scale = ((percentWidth + percentHeight) / 2) / 100

fontsize = int(14 * scale)
fontsize = 50
fontstyle = tkFont.Font(family='Arial', size=fontsize)

titleFontsize = int(50 * scale)
if titleFontsize < 8:
    titleFontsize = 8
TitleFontstyle = tkFont.Font(family="Gothic", size=titleFontsize)
## Labels ##
titleLabel = Label(root, text="MAX5487 DigiPot", font=TitleFontstyle, fg="red", bg="black")
titleLabel.place(relx=0.35, rely=0.05)

powerLabel = Label(root, text="POWER: OFF", font=fontstyle, fg='red', bg='black')
powerLabel.place(relx=0.2, rely=0.65, anchor=N)
directionLabel = Label(root, text="FORWARD", font=fontstyle, fg='#00FF00', bg='black')
directionLabel.place(relx=0.5, rely=0.65 , anchor=N)


powerBool = True
# boolean for led button
powerBtn = Button(root, image=Off_BtnImg, bg='black', bd=0, activebackground='black', highlightthickness = 0, command=PowerFn)
powerBtn.place(relx=0.2, rely=0.35, anchor=N)

directionBool = False
  
directionBtn = Button(root, image=On_BtnImg, bg='black', bd=0, activebackground='black', highlightthickness = 0, command=DirectionFn)
directionBtn.place(relx=0.5, rely=0.35, anchor=N)

templabel = Label(root, textvariable=temperature, font=fontstyle, fg='white', bg='red', highlightthickness = 0)
templabel.place(relx=0.2, rely=0.8, anchor=N)
humidlabel = Label(root, textvariable=humidity, font=fontstyle, fg='white', bg='red', highlightthickness = 0)
humidlabel.place(relx=0.5, rely=0.8, anchor=N)

# Button for closing
exit_button = Button(root, text="Exit", font=fontstyle, fg='white', bg='red', highlightthickness = 0, command=root.destroy)
exit_button.place(relx=0.5, rely=0.9, anchor=N)
background_thread = Thread(target=tempsensor)
background_thread.start()
root.mainloop()
the8472
  • 40,999
  • 5
  • 70
  • 122

0 Answers0