#!/usr/bin/python3 # -*- coding: utf-8 -*- # https://www.codice-sorgente.it/2019/01/un-termostato-touchscreen-con-raspberrypi/ import RPi.GPIO as GPIO import w1thermsensor import sys, os from time import sleep try: from PySide2.QtWidgets import QApplication except: try: from tkinter import messagebox messagebox.showinfo("Installazione, attendi prego", "Sto per installare le librerie grafiche e ci vorrà del tempo. Premi Ok e vai a prenderti un caffè.") pip.main(["install", "PySide2"]) from PySide2.QtWidgets import QApplication except: try: from pip._internal import main main(["install", "PySide2"]) from PySide2.QtWidgets import QApplication except: sys.exit(1) from PySide2.QtUiTools import QUiLoader from PySide2.QtCore import QFile from PySide2.QtCore import Qt from PySide2.QtCore import Signal from PySide2.QtWidgets import QLabel from PySide2.QtWidgets import QMainWindow from PySide2.QtCore import QThread toSleep = 10 class TurnOn(QThread): TempReached = Signal(bool) def __init__(self, w, addr = ""): QThread.__init__(self) self.w = w self.setTerminationEnabled(True) self.relaypin = 23 # Numerazione dei PIN GPIO GPIO.setmode(GPIO.BCM) # Il pin del relay va in output GPIO.setup(self.relaypin, GPIO.OUT) #Cerco il sensore self.sensor = w1thermsensor.W1ThermSensor() def __del__(self): print("Shutting down thread") def run(self): self.reachTemp() return def readTemp(self): #Leggo la temperatura temperature_in_celsius = self.sensor.get_temperature() print("Temperatura:"+str(temperature_in_celsius)+"° C") return temperature_in_celsius def reachTemp(self): global toSleep try: while self.w.SwitchOn.isChecked(): if float(self.readTemp()) < float(self.w.tempImpostata.value()): # Accendo il relay GPIO.output(self.relaypin, GPIO.HIGH) sleep(toSleep) else: # Spengo il relay GPIO.output(self.relaypin, GPIO.LOW) self.TempReached.emit(True) except: self.TempReached.emit(False) class ShowTemp(QThread): def __init__(self, w, addr = ""): QThread.__init__(self) self.w = w self.setTerminationEnabled(True) #Cerco il sensore self.sensor = w1thermsensor.W1ThermSensor() def __del__(self): print("Shutting down thread") def run(self): global toSleep while True: self.w.tempAttuale.setText(str(self.readTemp())+" °C") sleep(toSleep) return def readTemp(self): #Leggo la temperatura temperature_in_celsius = self.sensor.get_temperature() return temperature_in_celsius class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) file = QFile(os.path.abspath(os.path.dirname(sys.argv[0]))+"/termostato.ui") file.open(QFile.ReadOnly) loader = QUiLoader(self) self.w = loader.load(file) self.setCentralWidget(self.w) self.setWindowTitle("Termostato") self.w.SwitchOn.clicked.connect(self.StopThis) self.w.tempImpostata.valueChanged.connect(self.setTempImp) #Devono essere abilitati i 1-Wire os.system('sudo modprobe w1-gpio') os.system('sudo modprobe w1-therm') self.alreadyOn = False self.w.tempImpostata.setValue(25) self.setTempImp(25) self.stoponreached = False self.getTempThread = ShowTemp(self.w) self.getTempThread.start() def itIsOff(self): self.w.SwitchOn.setChecked(False) self.StopThis() def reached(self): print("Temperatura raggiunta") if self.stoponreached: self.itIsOff() def dostuff(self): if not self.alreadyOn: self.myThread = TurnOn(self.w) self.myThread.TempReached.connect(self.reached) self.myThread.finished.connect(self.itIsOff) self.myThread.start() self.alreadyOn = True def StopThis(self): if self.w.SwitchOn.isChecked(): self.w.SwitchOn.setText("Spegni") self.dostuff() else: self.w.SwitchOn.setText("Accendi") self.alreadyOn = False def setTempImp(self, arg1): self.w.tempImpostataLabel.setText(str(arg1)+" °C") self.dostuff() if __name__ == "__main__": app = QApplication(sys.argv) w = MainWindow() w.setFixedSize(640,480) w.show() sys.exit(app.exec_())