'''
Universidad Nacional de La Matanza
Fundamentos de sistemas embebidos
Integrantes:
Alexander Sanchez
Gabriel Benitez
Franco Richino
Problema:
Un local de una marca de ropa exclusiva solo permite tener hasta 10
personas dentro al mismo tiempo, pero a veces se pierde el control
de cuantas personas hay, lo que puede causar que se sobrepase el limite
sin que los empleados se den cuenta.
Solución:
Creamos un sistema que cuenta cuantas personas entran y salen
del local. Cuando se alcanza el limite permitido, el sistema activa una
alerta para avisar que no se permite el ingreso de mas personas.
'''
import time
import machine
import network
from machine import Pin
from umqtt.simple import MQTTClient
from HCSR04 import HCSR04
from tm1637 import TM1637
# Config WiFi
ssid = 'Wokwi-GUEST'
wifipassword = ''
#Config MQTT (Adafruit IO)
mqtt_server = 'io.adafruit.com'
port = 1883
user = 'Frankitocai'
password = 'aio_zBxY3509xc4fSy3lzb39aTwKIIMm'
client_id = 'ContadorPersonas1'
topic_limite = 'Frankitocai/feeds/capacidadmaxima' #publish
topic_reset = 'Frankitocai/feeds/resetearcont' #suscriber
#Conexion WiFi
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(ssid, wifipassword)
print("Conectando")
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print("\nConectado a Wifi!")
print(sta_if.ifconfig())
#Conexiones sensores y display
sensorA = HCSR04(trigger_pin=19, echo_pin=21)
sensorB = HCSR04(trigger_pin=5, echo_pin=18)
display = TM1637(clk=Pin(14), dio=Pin(12))
#Variables
estadocont = 0
capacidad_max = 3
bloqueado = False
estado = "libre"
#Callback MQTT
def callback_cont(topic, msg):
global estadocont, bloqueado
dato = msg.decode('utf-8')
topicrec = topic.decode('utf-8')
print("Cambio en: " + topicrec + ":" + dato)
if topicrec == topic_reset:
estadocont = 0
bloqueado = False
try:
conexionMQTT.publish(topic_limite, str(0))
except Exception as e:
print("Error al resetear:", e)
print("🔄 Se ha reseteado el contador de personas")
time.sleep(1)
#Conexion MQTT
try:
conexionMQTT = MQTTClient(client_id, mqtt_server, user=user, password=password, port=int(port))
conexionMQTT.set_callback(callback_cont)
conexionMQTT.connect()
conexionMQTT.subscribe(topic_reset)
print("✅ Conectado con Broker MQTT")
except OSError as e:
print("❌ Fallo la conexion al Broker, reiniciando...")
time.sleep(5)
machine.reset()
#Bucle principal
while True:
try:
conexionMQTT.check_msg()
time.sleep(0.1)
distanciaA = sensorA.distance_cm()
distanciaB = sensorB.distance_cm()
#Estado: libre
if estado == "libre":
if distanciaA < 50:
estado = "esperando_B"
print("Sensor A activado. Esperando sensor B...")
time.sleep(0.3)
elif distanciaB < 50:
estado = "esperando_A"
print("Sensor B activado. Esperando sensor A...")
time.sleep(0.3)
#Entrada A -> B
elif estado == "esperando_B":
if distanciaB < 50:
if not bloqueado:
estadocont += 1
print("🟢 Entrada valida (A→B). Total:", estadocont)
display.number(estadocont)
if estadocont >= capacidad_max:
conexionMQTT.publish(topic_limite, str(1))
bloqueado = True
print("🔴 Capacidad maxima alcanzada.")
else:
print("🚫 Entrada bloqueada.")
estado = "esperando_liberacion"
time.sleep(1)
#Salida B -> A
elif estado == "esperando_A":
if distanciaA < 50:
if estadocont > 0:
estadocont -= 1
print("🔻 Salida valida (B→A). Total:", estadocont)
display.number(estadocont)
if bloqueado and estadocont < capacidad_max:
conexionMQTT.publish(topic_limite, str(0))
bloqueado = False
print("✅ Se libero capacidad.")
else:
print("⚠️ No hay personas para restar.")
estado = "esperando_liberacion"
time.sleep(1)
#Esperando que ambos sensores se liberen
elif estado == "esperando_liberacion":
if distanciaA > 80 and distanciaB > 80:
estado = "libre"
print("🔄Ambos sensores liberados. Listo para volver a detectar.")
#Actualizar display
display.number(estadocont)
except OSError as e:
print("❌Error:", e)
time.sleep(5)
machine.reset()