RaspberryYogurth/berry_yogurt_4_05.py

81 lines
3.9 KiB
Python

from gpiozero import Button, LED # Import libraries
from time import sleep
from signal import pause
from datetime import datetime, timedelta
from pathlib import Path
import pandas as pd
import schedule
best_before_exeeded = timedelta(seconds=18) # Define thresholds
overdue = timedelta(seconds=30)
consumption_overview = [] # Key variables
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
infrared_sensor = Button(2) # GPIO pins of external hardware
orange_led = LED(4)
red_led = LED(17)
def on_a_sensor_signal(): # On a signal: update list, save csv and turn off led (if necessary)
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if len(consumption_overview) == 0 or consumption_overview[-1]['Status'] == 'Yogurt eaten up':
new_status = "Yogurt open"
passed_time = "pending"
consumption_overview.append({'Status':new_status, 'Time':current_time, 'Consumed In':passed_time})
else:
new_status = "Yogurt eaten up"
if len(consumption_overview) > 0 and consumption_overview[-1]['Status'] == 'Yogurt open':
opening_time_str = consumption_overview[-1]['Time']
else:
opening_time_str = current_time
opening_time = datetime.strptime(opening_time_str, '%Y-%m-%d %H:%M:%S')
now = datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S')
time_difference = now - opening_time
consumption_overview.append({'Status':new_status, 'Time':current_time, 'Consumed In':str(time_difference)})
print(consumption_overview[-1])
if len(consumption_overview) > 0 and consumption_overview[-1]['Status'] == 'Yogurt eaten up':
orange_led.off()
print("orange led pin 4 turned off")
red_led.off()
print("red led pin 17 turned off")
df = pd.DataFrame(consumption_overview)
currentDateTime = datetime.now().strftime("%Y%m%d_%H%M%S")
df.to_csv(f"Raspberry Yogurt_{currentDateTime}.csv", index=False)
print("CSV file saved")
def check(): # Runs periodically the led_check as long as a yogurth is open
schedule.every(6).seconds.do(led_check)
while not infrared_sensor.is_active and consumption_overview[-1]['Status'] == 'Yogurt open':
schedule.run_pending()
def led_check(): # Checks if an led needs to be turend on
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if len(consumption_overview) > 0 and consumption_overview[-1]['Status'] == 'Yogurt open':
opening_time_str = consumption_overview[-1]['Time']
else:
opening_time_str = current_time
opening_time = datetime.strptime(opening_time_str, '%Y-%m-%d %H:%M:%S')
now = datetime.strptime(current_time, '%Y-%m-%d %H:%M:%S')
time_difference = now - opening_time
print("open since", time_difference)
if overdue > time_difference >= best_before_exeeded:
orange_led.on()
print("ORANGE LED ON", "open since", time_difference)
elif time_difference >= overdue:
orange_led.off()
print("orange led off")
red_led.on()
print("RED LED ON", "open since", time_difference)
while True: # Keeps the program running to listen for sensor events
infrared_sensor.when_pressed = on_a_sensor_signal
infrared_sensor.when_released = check
pause()