kreket

Raspberry Pi Temperature Controller

Dec 29th, 2019
732
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.60 KB | None | 0 0
  1. import threading
  2. import time
  3. import socket
  4. import RPi.GPIO as GPIO
  5. import Adafruit_DHT
  6. import datetime
  7.  
  8. # Pin setup
  9. dhtpin = 17
  10. dhtsensor = Adafruit_DHT.DHT22
  11.  
  12.  
  13. # GPIO Setup
  14. GPIO.setmode(GPIO.BCM)  # BCM Pin numbering
  15. GPIO.setwarnings(False)  # Disable warnings
  16.  
  17.  
  18. # Settings
  19. server_address = "10.0.0.45"
  20. server_port = 1234
  21. temp_pull = 5  # Seconds between each temperature pull
  22. pull_amount = 4  # Times pulled to get average, multiply by pull to get total time wasted.
  23.  
  24.  
  25. # Variable init
  26. humidity, temperature = Adafruit_DHT.read_retry(dhtsensor, dhtpin)
  27. current_temp = round(temperature, 2)
  28. target_temp = 15  # Default target temperature
  29. alarm_triggered = False  # Used to check if oven has been turned off/on by alarm trigger.
  30. alarm_sleep = 420  # Default time of sleep (420 = 7 hours)
  31. alarm_off = 90  # Time(minutes) oven shuts down before 7 hour sleep
  32. alarm_on = 30  # Amount of time before alarm oven should turn on.
  33. alarm = None
  34. loke_alarm = None
  35. kajsa_alarm = None
  36. now = datetime.datetime.now()
  37. ovenstate = False
  38.  
  39.  
  40. # Socket listener.
  41. # Sends and receives information.
  42. def socks():
  43.     print(f"Listening to sockets on {server_address} at {server_port}")
  44.     global target_temp
  45.     global current_temp
  46.     global alarm
  47.     global loke_alarm
  48.     global kajsa_alarm
  49.     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  50.     s.bind((server_address, server_port))
  51.     s.listen(5)
  52.     while True:
  53.         clientsocket, address = s.accept()
  54.         # Send current temperature and target temperature!
  55.         clientsocket.send(bytes("Temp: " + str(current_temp), "utf-8"))
  56.         clientsocket.send(bytes("Target: " + str(target_temp), "utf-8"))
  57.         clientsocket.send(bytes("Alarm: " + str(alarm), "utf-8"))
  58.  
  59.         # Receive new target temperature!
  60.         receive = clientsocket.recv(1024).decode("utf-8")
  61.         if receive:
  62.             target = receive.split(" ")
  63.             if target[0] == "Target:":
  64.                 target_temp = int(target[1])
  65.                 print(f"New target temperature: {target_temp}")
  66.  
  67.         # Recieve alarm information.
  68.         receive = clientsocket.recv(1024).decode("utf-8")
  69.         if receive:  # Checks if any alarm data has been received
  70.             print("Alarm data received")
  71.             data = receive.split(" ")
  72.             if data[0] == "Loke":  # Checks if its from Loke
  73.                 if data[1] != "%hour:%minute":  # Checks if alarm is set
  74.                     loke_alarm = data[1]  # Sets alarm time if set.
  75.                 else:
  76.                     loke_alarm = None  # Clears variable if no alarm is set, and alarm data is sent.
  77.             elif data[0] == "Kajsa":
  78.                 if data[1] != "%hour:%minute":
  79.                     kajsa_alarm = data[1]
  80.                 else:
  81.                     kajsa_alarm = None
  82.  
  83.         clientsocket.close()
  84.         masterdom()
  85.  
  86.  
  87. # Compares alarm with possible other alarms set, sets alarm variable to the earliest alarm. Removes alarm if empty,
  88. # and no other alarm is set.
  89. def updatealarm():
  90.     global alarm
  91.     global loke_alarm
  92.     global kajsa_alarm
  93.     if loke_alarm:
  94.         data = loke_alarm.split(":")  # Divide lokes alarm HH:mm
  95.         if kajsa_alarm:  # Check if kajsa also has an alarm set
  96.             data2 = kajsa_alarm.split(":")  # Divide Kajas alarm
  97.             if data[0] <= data2[0] and data[1] < data2[1]:  # Check if that alarm is set earlier
  98.                 alarm = loke_alarm  # If not, set the actual alarm
  99.         else:
  100.             alarm = loke_alarm  # If no other alarm is set, set the actual alarm time.
  101.  
  102.     if kajsa_alarm:
  103.         data = kajsa_alarm.split(":")
  104.         if loke_alarm:
  105.             data2 = loke_alarm.split(":")
  106.             if data[0] <= data2[0] and data[1] < data2[1]:
  107.                 alarm = kajsa_alarm
  108.         else:
  109.             alarm = kajsa_alarm
  110.     if not kajsa_alarm and not loke_alarm:
  111.         alarm = None
  112.     print(f"Loke's alarm {loke_alarm} Kajsa's alarm {kajsa_alarm} Actual alarm: {alarm}")
  113.  
  114.  
  115. # Checks if oven should be turned on/off in relation to the alarm time.
  116. def checkalarm():
  117.     global target_temp
  118.     global alarm
  119.     global alarm_off
  120.     global alarm_on
  121.     global alarm_triggered
  122.     global now
  123.     global loke_alarm
  124.     global kajsa_alarm
  125.     now = datetime.datetime.now()
  126.     if alarm:
  127.         # Convert alarm time to datetime format
  128.         alarm2 = alarm.split(":")
  129.         alarm2 = now.replace(hour=int(alarm2[0]), minute=int(alarm2[1]), second=0, microsecond=0)
  130.         # Subtract time before
  131.         alarm2 = alarm2 - datetime.timedelta(minutes=alarm_on)
  132.         if alarm2 < now:  # Check if oven should be turned on
  133.             if alarm_triggered:
  134.                 target_temp = 23
  135.                 alarm_triggered = False
  136.                 alarm = None
  137.                 loke_alarm = None
  138.                 kajsa_alarm = None
  139.                 print("Oven turned on by alarm, alarm variables reset.")
  140.                 return
  141.  
  142.         # Reset
  143.         alarm2 = alarm.split(":")
  144.         alarm2 = now.replace(hour=int(alarm2[0]), minute=int(alarm2[1]), second=0, microsecond=0)
  145.         # Subtract sleeping time and off timer
  146.         alarm2 = alarm2 - datetime.timedelta(minutes=(alarm_sleep + alarm_off))
  147.         if alarm2 < now:  # Check if oven should be turned off
  148.             if not alarm_triggered:
  149.                 print("Oven turned off by alarm.")
  150.                 target_temp = 15
  151.                 alarm_triggered = True
  152.  
  153.  
  154. # Turn oven on if not already on
  155. def ovenon():
  156.     global ovenstate
  157.     if not ovenstate:
  158.         print("Turning oven on")
  159.         ovenstate = True
  160.  
  161.  
  162. # Turn oven off if not already off
  163. def ovenoff():
  164.     global ovenstate
  165.     if ovenstate:
  166.         print("Turning oven off")
  167.         ovenstate = False
  168.  
  169.  
  170. def comparetemp():
  171.     print(f"Current temp: {current_temp} Target temperature: {target_temp} Ovenstate: {ovenstate}")
  172.     if target_temp > current_temp:
  173.         ovenon()
  174.     elif target_temp < current_temp:
  175.         ovenoff()
  176.  
  177.  
  178. # Master blaster
  179. def masterdom():
  180.     comparetemp()
  181.     updatealarm()
  182.     if alarm:
  183.         checkalarm()
  184.  
  185.  
  186. # Checking temperature every pull_temp
  187. def checktemp():
  188.     while True:
  189.         global current_temp
  190.         temp = 0
  191.         for x in range(pull_amount):
  192.             time.sleep(temp_pull)
  193.             humid, ttemp = Adafruit_DHT.read_retry(dhtsensor, dhtpin)
  194.             temp += ttemp
  195.         current_temp = round((temp / pull_amount), 2)
  196.         masterdom()
  197.  
  198.  
  199. comsthread = threading.Thread(name='socks', target=socks)
  200. tempthread = threading.Thread(name='checktemp', target=checktemp)
  201.  
  202. comsthread.start()
  203. tempthread.start()
Advertisement
Add Comment
Please, Sign In to add comment