import network
import time
import math
from machine import Pin, ADC
from umqtt.simple import MQTTClient
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASS = ""
MQTT_BROKER = "1133c5f5d79b4a5db07d54df4e5806e3.s1.eu.hivemq.cloud"
MQTT_USER = "admin"
MQTT_PASS = "Admin12345"
CLIENT_ID = "ESP32_Relay_Station_01"
pot = ADC(Pin(34))
pot.atten(ADC.ATTN_11DB)
relay = Pin(15, Pin.OUT)
buzzer = Pin(13, Pin.OUT)
I_SET = 50.0
TMS = 0.1
def connect_mqtt():
try:
client = MQTTClient(CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASS, port=8883, ssl=True, ssl_params={'server_hostname': MQTT_BROKER})
client.connect()
return client
except:
return None
def calculate_trip_time(current):
if current > I_SET:
ratio = current / I_SET
t = (0.14 * TMS) / (math.pow(ratio, 0.02) - 1)
return t
return None
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASS)
while not wlan.isconnected():
time.sleep(0.5)
mqtt_client = connect_mqtt()
relay.value(1)
while True:
analog_val = pot.read()
current_amps = (analog_val / 4095) * 100
trip_delay = calculate_trip_time(current_amps)
if trip_delay is not None:
status_msg = "WARNING: Trip in {:.2f}s".format(trip_delay)
if mqtt_client:
mqtt_client.publish("station/status", status_msg)
time.sleep(trip_delay)
if (pot.read() / 4095) * 100 > I_SET:
relay.value(0)
buzzer.value(1)
if mqtt_client:
mqtt_client.publish("station/status", "BREAKER TRIPPED")
time.sleep(1)
buzzer.value(0)
else:
if mqtt_client:
mqtt_client.publish("station/status", "SYSTEM OK")
if mqtt_client:
mqtt_client.publish("station/current", str(round(current_amps, 2)))
time.sleep(0.5)