Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import threading
- import time
- import socket
- import RPi.GPIO as GPIO
- import Adafruit_DHT
- import datetime
- # Pin setup
- dhtpin = 17
- dhtsensor = Adafruit_DHT.DHT22
- # GPIO Setup
- GPIO.setmode(GPIO.BCM) # BCM Pin numbering
- GPIO.setwarnings(False) # Disable warnings
- # Settings
- server_address = "10.0.0.45"
- server_port = 1234
- temp_pull = 5 # Seconds between each temperature pull
- pull_amount = 4 # Times pulled to get average, multiply by pull to get total time wasted.
- # Variable init
- humidity, temperature = Adafruit_DHT.read_retry(dhtsensor, dhtpin)
- current_temp = round(temperature, 2)
- target_temp = 15 # Default target temperature
- alarm_triggered = False # Used to check if oven has been turned off/on by alarm trigger.
- alarm_sleep = 420 # Default time of sleep (420 = 7 hours)
- alarm_off = 90 # Time(minutes) oven shuts down before 7 hour sleep
- alarm_on = 30 # Amount of time before alarm oven should turn on.
- alarm = None
- loke_alarm = None
- kajsa_alarm = None
- now = datetime.datetime.now()
- ovenstate = False
- # Socket listener.
- # Sends and receives information.
- def socks():
- print(f"Listening to sockets on {server_address} at {server_port}")
- global target_temp
- global current_temp
- global alarm
- global loke_alarm
- global kajsa_alarm
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.bind((server_address, server_port))
- s.listen(5)
- while True:
- clientsocket, address = s.accept()
- # Send current temperature and target temperature!
- clientsocket.send(bytes("Temp: " + str(current_temp), "utf-8"))
- clientsocket.send(bytes("Target: " + str(target_temp), "utf-8"))
- clientsocket.send(bytes("Alarm: " + str(alarm), "utf-8"))
- # Receive new target temperature!
- receive = clientsocket.recv(1024).decode("utf-8")
- if receive:
- target = receive.split(" ")
- if target[0] == "Target:":
- target_temp = int(target[1])
- print(f"New target temperature: {target_temp}")
- # Recieve alarm information.
- receive = clientsocket.recv(1024).decode("utf-8")
- if receive: # Checks if any alarm data has been received
- print("Alarm data received")
- data = receive.split(" ")
- if data[0] == "Loke": # Checks if its from Loke
- if data[1] != "%hour:%minute": # Checks if alarm is set
- loke_alarm = data[1] # Sets alarm time if set.
- else:
- loke_alarm = None # Clears variable if no alarm is set, and alarm data is sent.
- elif data[0] == "Kajsa":
- if data[1] != "%hour:%minute":
- kajsa_alarm = data[1]
- else:
- kajsa_alarm = None
- clientsocket.close()
- masterdom()
- # Compares alarm with possible other alarms set, sets alarm variable to the earliest alarm. Removes alarm if empty,
- # and no other alarm is set.
- def updatealarm():
- global alarm
- global loke_alarm
- global kajsa_alarm
- if loke_alarm:
- data = loke_alarm.split(":") # Divide lokes alarm HH:mm
- if kajsa_alarm: # Check if kajsa also has an alarm set
- data2 = kajsa_alarm.split(":") # Divide Kajas alarm
- if data[0] <= data2[0] and data[1] < data2[1]: # Check if that alarm is set earlier
- alarm = loke_alarm # If not, set the actual alarm
- else:
- alarm = loke_alarm # If no other alarm is set, set the actual alarm time.
- if kajsa_alarm:
- data = kajsa_alarm.split(":")
- if loke_alarm:
- data2 = loke_alarm.split(":")
- if data[0] <= data2[0] and data[1] < data2[1]:
- alarm = kajsa_alarm
- else:
- alarm = kajsa_alarm
- if not kajsa_alarm and not loke_alarm:
- alarm = None
- print(f"Loke's alarm {loke_alarm} Kajsa's alarm {kajsa_alarm} Actual alarm: {alarm}")
- # Checks if oven should be turned on/off in relation to the alarm time.
- def checkalarm():
- global target_temp
- global alarm
- global alarm_off
- global alarm_on
- global alarm_triggered
- global now
- global loke_alarm
- global kajsa_alarm
- now = datetime.datetime.now()
- if alarm:
- # Convert alarm time to datetime format
- alarm2 = alarm.split(":")
- alarm2 = now.replace(hour=int(alarm2[0]), minute=int(alarm2[1]), second=0, microsecond=0)
- # Subtract time before
- alarm2 = alarm2 - datetime.timedelta(minutes=alarm_on)
- if alarm2 < now: # Check if oven should be turned on
- if alarm_triggered:
- target_temp = 23
- alarm_triggered = False
- alarm = None
- loke_alarm = None
- kajsa_alarm = None
- print("Oven turned on by alarm, alarm variables reset.")
- return
- # Reset
- alarm2 = alarm.split(":")
- alarm2 = now.replace(hour=int(alarm2[0]), minute=int(alarm2[1]), second=0, microsecond=0)
- # Subtract sleeping time and off timer
- alarm2 = alarm2 - datetime.timedelta(minutes=(alarm_sleep + alarm_off))
- if alarm2 < now: # Check if oven should be turned off
- if not alarm_triggered:
- print("Oven turned off by alarm.")
- target_temp = 15
- alarm_triggered = True
- # Turn oven on if not already on
- def ovenon():
- global ovenstate
- if not ovenstate:
- print("Turning oven on")
- ovenstate = True
- # Turn oven off if not already off
- def ovenoff():
- global ovenstate
- if ovenstate:
- print("Turning oven off")
- ovenstate = False
- def comparetemp():
- print(f"Current temp: {current_temp} Target temperature: {target_temp} Ovenstate: {ovenstate}")
- if target_temp > current_temp:
- ovenon()
- elif target_temp < current_temp:
- ovenoff()
- # Master blaster
- def masterdom():
- comparetemp()
- updatealarm()
- if alarm:
- checkalarm()
- # Checking temperature every pull_temp
- def checktemp():
- while True:
- global current_temp
- temp = 0
- for x in range(pull_amount):
- time.sleep(temp_pull)
- humid, ttemp = Adafruit_DHT.read_retry(dhtsensor, dhtpin)
- temp += ttemp
- current_temp = round((temp / pull_amount), 2)
- masterdom()
- comsthread = threading.Thread(name='socks', target=socks)
- tempthread = threading.Thread(name='checktemp', target=checktemp)
- comsthread.start()
- tempthread.start()
Advertisement
Add Comment
Please, Sign In to add comment