from machine import Pin
from utime import sleep
import urequests as requests
import ujson as json
import network
import random
import gc
# WiFi credentials
ssid = "Wokwi-GUEST"
password = ""
# Firebase URLs
firebase_power_url = "https://save-power-f1681-default-rtdb.firebaseio.com/device/power.json"
firebase_total_power_url = "https://save-power-f1681-default-rtdb.firebaseio.com/device/total_power_used_per_second.json"
# Define LED pin
led_pin = 2
led = Pin(led_pin, Pin.OUT)
# Function to connect to WiFi
def connect_to_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
wlan.connect(ssid, password)
while not wlan.isconnected():
pass
print("WiFi connected:", wlan.ifconfig())
# Function to send data to Firebase
def send_to_firebase(url, data):
try:
response = requests.put(url, data=json.dumps(data))
if response.status_code == 200:
print("Data sent to Firebase successfully")
else:
print("Error sending data to Firebase:", response.status_code)
except Exception as e:
print("Exception occurred:", e)
finally:
if response:
response.close() # Ensure response is closed to free up resources
gc.collect() # Trigger garbage collection
# Function to retrieve the last total power consumption from Firebase
def get_last_total_power():
try:
response = requests.get(firebase_total_power_url)
if response.status_code == 200:
data = response.json()
print("Firebase response for total power:", data) # Debug print
if data:
return data # Expecting data to be the total power value directly
else:
return 0.0
else:
print("Error retrieving data from Firebase:", response.status_code)
return 0.0
except Exception as e:
print("Exception occurred while retrieving data:", e)
return 0.0
finally:
if response:
response.close() # Ensure response is closed to free up resources
gc.collect() # Trigger garbage collection
# Function to get the current power state from Firebase
def get_power_state():
try:
response = requests.get(firebase_power_url)
if response.status_code == 200:
data = response.json()
print("Firebase response for power state:", data) # Debug print
if data is not None:
return data == 1 # Return True if power state is 1, else False
else:
return False
else:
print("Error retrieving power state from Firebase:", response.status_code)
return False
except Exception as e:
print("Exception occurred while retrieving power state:", e)
return False
finally:
if response:
response.close() # Ensure response is closed to free up resources
gc.collect() # Trigger garbage collection
# Main program
connect_to_wifi() # Connect to WiFi once at the beginning
# Retrieve the last total power consumption from Firebase
total_power = get_last_total_power()
print("Initial Total Power Consumption:", total_power)
while True:
# Retrieve the current power state from Firebase
power_on = get_power_state()
if power_on:
# Power is on, turn on the LED
led.on()
sleep(1) # Simulate the LED being on for 1 second
# Simulate power consumption calculation for the LED
led_current = 20 # Example current value for LED in milliamps
led_voltage = 3300 # Example voltage value for LED in millivolts
led_power = (led_current * led_voltage) / 1000 # Calculate power for LED in watts
# Add LED power consumption to the total
total_power += led_power
# Simulate power consumption calculation for other devices
current = float(random.randint(60, 69)) # Random current value in milliamps
voltage = float(random.randint(1500, 1600)) # Random voltage value in millivolts
power = (current * voltage) / 1000 # Calculate power in watts
# Add other devices' power consumption to the total
total_power += power
# Send updated total power consumption to Firebase
send_to_firebase(firebase_total_power_url, total_power)
# Print total power consumption per second
print("Total Power Consumption per Second:", total_power)
else:
# Power is off, turn off the LED
led.off()
print("Power is off, LED is turned off")
# Wait for 1 second before next iteration
sleep(1)