Temperaturregelung mit Raspi
Verfasst: Donnerstag 2. April 2020, 13:58
Hallo erstmal.
Ich bin gerade am tüfteln, wie ich denn am einfachsten meinem Python Programm Variablen übergeben kann?
Ausgangssituation:
Ich möchte eine Temperaturregelung bauen, um meinen Ofen auf ca 200°C zu halten. +-5°C sind egal.
Meine Hardware:
Raspberry Pi 3 B+ (mit Raspian)
MAX6675 Thermomodul (Messwerte über SPI)
OLED Display 128x64 (i2C)
Relaykarte zum An/Ausschalten der Heizspiralen.
Meine Frage ist nun, wie ich am besten per Smartphone einen Sollwert, Hysterese usw übergeben kann, und gleichzeitig den Istwert des Sensors auslesen kann?
Habe mich durch viele Foren gelesen, aber die Lösung mit dem QT5 Designer scheint mir zu kompliziert, da weiß ich nicht wie ich den Code am besten implementieren soll.
Geht es mit php über einen Webbrowser? Oder über VNC direkt auf den Raspi zugreifen auf eine graphische Oberfläche? (Welche??)
Mein Programmcode:
Ich bin gerade am tüfteln, wie ich denn am einfachsten meinem Python Programm Variablen übergeben kann?
Ausgangssituation:
Ich möchte eine Temperaturregelung bauen, um meinen Ofen auf ca 200°C zu halten. +-5°C sind egal.
Meine Hardware:
Raspberry Pi 3 B+ (mit Raspian)
MAX6675 Thermomodul (Messwerte über SPI)
OLED Display 128x64 (i2C)
Relaykarte zum An/Ausschalten der Heizspiralen.
Meine Frage ist nun, wie ich am besten per Smartphone einen Sollwert, Hysterese usw übergeben kann, und gleichzeitig den Istwert des Sensors auslesen kann?
Habe mich durch viele Foren gelesen, aber die Lösung mit dem QT5 Designer scheint mir zu kompliziert, da weiß ich nicht wie ich den Code am besten implementieren soll.
Geht es mit php über einen Webbrowser? Oder über VNC direkt auf den Raspi zugreifen auf eine graphische Oberfläche? (Welche??)
Mein Programmcode:
Code: Alles auswählen
import time
import time
import pigpio
import Adafruit_GPIO.SPI as SPI
import Adafruit_SSD1306
import RPi.GPIO as gpio
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import subprocess
##Gpio Einstellungen
Taster10_up = 23
Taster10_down = 24
Taster01_up = 25
Taster01_down = 26
Relay1 = 5
gpio.setwarnings(False)
gpio.setmode(gpio.BCM)
gpio.setup(Taster10_up, gpio.IN) #Taster10_up
gpio.setup(Taster10_down, gpio.IN) #Taster10_down
gpio.setup(Taster01_up, gpio.IN) #Taster01_up
gpio.setup(Taster01_down, gpio.IN) #Taster01_down
gpio.setup(Relay1, gpio.OUT) #Relay1 für Heizspule
##Sensor einlesen
pi = pigpio.pi()
sensor = pi.spi_open(0, 1000000, 0)
if not pi.connected:
exit(0)
# Raspberry Pi pin configuration:
RST = None
DC = 23
SPI_PORT = 0
SPI_DEVICE = 0
# 128x64 display with hardware I2C:
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)
disp.begin()
# Clear display.
disp.clear()
disp.display()
# Create blank image for drawing.
width = disp.width
height = disp.height
image = Image.new('1', (width, height))
# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)
# Draw a black filled box to clear the image.
draw.rectangle((0,0,width,height), outline=0, fill=0)
# First define some constants to allow easy resizing of shapes.
padding = -2
top = padding
bottom = height-padding
# Move left to right keeping track of the current x position for drawing shapes.
x = 0
# Load default font.
font = ImageFont.load_default()
# Alternatively load a TTF font. Make sure the .ttf font file is in the same directory as the python script!
# Some other nice fonts to try: http://www.dafont.com/bitmap.php
# font = ImageFont.truetype('Minecraftia.ttf', 8)
def LCD_Temperatur():
# Draw a black filled box to clear the image.
draw.rectangle((0,0,width,height), outline=0, fill=0)
# Shell scripts for system monitoring from here : https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load
cmd = "hostname -I | cut -d\' \' -f1"
IP = subprocess.check_output(cmd, shell = True )
cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"
draw.text((x, top), "IP: " + str(IP), font=font, fill=255)
draw.text((x, top+16), "Isttemp = " + str(isttemp) + " °C", font=font, fill=255)
draw.text((x, top+32), "Solltemp = " + str(solltemp) + " °C", font=font, fill=255)
draw.text((x, top+48), "Hysterese = +-" + str(hysterese) + " °C", font=font, fill=255)
# Display image.
disp.image(image)
disp.display()
#time.sleep(.1)
def getSensorTemp():
c, d = pi.spi_read(sensor, 2)
if c == 2:
word = (d[0]<<8) | d[1] #shift bits
if (word & 0x8006) == 0: # Bits 15, 2, und 1 müssen 0 sein (lt. Datenblatt).
t = (word >> 3)/4.0
Istwert = t
print("{:.2f}".format(t))
else:
print("bad reading {:b}".format(word))
Istwert = 987
return Istwert
pi.spi_close(sensor)
pi.stop()
solltemp = float(input("Sollwert: "))
hysterese = float(input("Hysterese: "))
while True: ##Hier sollte eigentlich eine Abfrage eines Starttasters stattfinden
Tempmax = (solltemp+hysterese)
Tempmin = (solltemp-hysterese)
isttemp = getSensorTemp()
LCD_Temperatur()
time.sleep(0.5)
if isttemp < Tempmin:
#print("relay an")
gpio.output(Relay1, gpio.HIGH)
elif isttemp > Tempmax:
#print ("relay aus")
gpio.output(Relay1, gpio.LOW)