from machine import Pin, ADC, I2C
import network, time
from utime import sleep, sleep_ms, ticks_ms, ticks_diff
import ujson
from umqtt.simple import MQTTClient
# MQTT Server Parameters
MQTT_CLIENT_ID = "valentina5345678388" # UNICO random
#MQTT_BROKER = "broker.hivemq.com"
MQTT_BROKER = "test.mosquitto.org"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC = "datos/consumo/energia"
# Configuración de pines ADC
sensor_pins = [33, 32, 35] # Pines analógicos en ESP32
adcs = [ADC(Pin(pin)) for pin in sensor_pins]
# Configuración ADC
for adc in adcs:
adc.atten(ADC.ATTN_11DB) # Rango hasta ~3.6V
adc.width(ADC.WIDTH_12BIT) # Resolución 12 bits
# Parámetros
VOLTAGE = 110 # Voltaje asumido (puedes cambiar a 220 si aplica)
ACS712_SENSITIVITY = 0.185 # Sensibilidad del sensor (5A)
VREF = 2048 # Valor ADC sin carga (calibrar si es necesario)
# Energía acumulada por cada carga (en Wh)
energy_wh = [0, 0, 0]
last_time = ticks_ms()
def read_current(adc, samples=100):
total = 0
for _ in range(samples):
raw = adc.read()
voltage = (raw - VREF) * 3.3 / 4095
current = voltage / ACS712_SENSITIVITY
total += current ** 2
sleep(0.001)
rms = (total / samples) ** 0.5
return abs(rms)
def conectaWifi (red, password):
global miRed
miRed = network.WLAN(network.STA_IF)
if not miRed.isconnected(): #Si no está conectado…
miRed.active(True) #activa la interface
miRed.connect(red, password) #Intenta conectar con la red
print('Conectando a la red', red +"…")
timeout = time.time ()
while not miRed.isconnected(): #Mientras no se conecte..
if (time.ticks_diff (time.time (), timeout) > 10):
return False
return True
if conectaWifi ("Wokwi-GUEST", ""):
print ("Conexión exitosa!")
print('Datos de la red (IP/netmask/gw/DNS):', miRed.ifconfig())
print("Conectando a MQTT server... ",MQTT_BROKER,"...", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.connect()
while True:
now = ticks_ms()
elapsed_sec = ticks_diff(now, last_time) / 1000
last_time = now
currents = [read_current(adc) for adc in adcs]
for i in range(3):
power = VOLTAGE * currents[i] # P = V x I
energy_wh[i] += (power * elapsed_sec) / 3600 # en Wh
print("----- Medición -----")
print("Bombillo -> I: {:.2f} A | Energía: {:.4f} kWh".format(currents[0], energy_wh[0] / 1000))
print("Plancha -> I: {:.2f} A | Energía: {:.4f} kWh".format(currents[1], energy_wh[1] / 1000))
print("Sanduchera-> I: {:.2f} A | Energía: {:.4f} kWh".format(currents[2], energy_wh[2] / 1000))
print("--------------------\n")
print("Revisando Condiciones ...... ")
message = ujson.dumps({
"Bombill_I": currents[0],
"Plancha_I": currents[1] ,
"Sanduchera_I": currents[2],
"Bombill_E": energy_wh[0],
"Plancha_E": energy_wh[1] ,
"Sanduchera_E": energy_wh[2],
})
print("Reportando a MQTT topic {}: {}".format(MQTT_TOPIC, message))
client.publish(MQTT_TOPIC, message)
sleep(3)
else:
print ("Imposible conectar")
miRed.active (False)
Bombillo
Sanduchera
Plancha