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 ayogurth 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()