import time
import machine
import micropython
import network
import tm1637
from machine import Pin
from umqtt.simple import MQTTClient
from tm1637 import TM1637
#Indicamos red wifi y clave
ssid = 'Wokwi-GUEST'
wifipassword = ''
#Datos Server MQTT (broker)
#Indicamos datos MQTT Broker (server y puerto)
mqtt_server = 'io.adafruit.com'
port = 1883
user = 'facundo123'
password = 'aio_LriB36gLix0wNNCXuP82zOIzzb7e'
#Indicamos ID y topicos
client_id = 'Contadorpersonas'
topic_personas = 'facundo123/feeds/contador-dot-personas'
topic_evento = 'facundo123/feeds/contador-dot-evento'
topic_reset = 'facundo123/feeds/poner-dot-reset'
topic_set = 'facundo123/feeds/poner-dot-set'
topic_habilitar = 'facundo123/feeds/habilitador'
#Definimos variable contadora
contador = 0
#Definimos variable global para controlar el estado
sistema_habilitado = False
#Establecemos display, sensores y leds
display = TM1637(clk=Pin(2), dio=Pin(4))
display.show("0000")
sensor_A = Pin(14, Pin.IN)
sensor_B = Pin(27, Pin.IN)
led_A = Pin(18, Pin.OUT)
led_B = Pin(19, Pin.OUT)
led_A.value(0)
led_B.value(0)
#Definimos modo station (conectarse a acces point remoto)
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
#Conectamos al wifi
sta_if.connect(ssid,wifipassword)
print("Conectando")
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print("Conectado a Wifi!")
#Mostrar las IP
print(sta_if.ifconfig())
#Función que se llamará cada vez que se publique en un topico
#al que estamos suscritos
def callback(topic, msg):
global contador, sistema_habilitado
dato = msg.decode().strip() #se decodifica de UTF-8
topic = topic.decode()
if topic == topic_reset and dato.strip() == "1":
contador = 0
print("Contador reseteado")
actualizar_display()
elif topic == topic_set and dato.isdigit():
contador= min(99, int(dato)) #limita a 99
print ("contador seteado a:", contador)
actualizar_display()
elif topic == topic_habilitar:
if dato.strip() == "ON":
sistema_habilitado = True
print("Sistema habilitado")
elif dato.strip() == "OFF":
sistema_habilitado = False
print("Sistema deshabilitado")
#Intentamos conectarnos al broker MQTT
try:
conexionMQTT = MQTTClient(client_id, mqtt_server,user=user,password=password,port=int(port))
conexionMQTT.set_callback(callback)
conexionMQTT.connect()
conexionMQTT.subscribe(topic_reset)
conexionMQTT.subscribe(topic_set)
conexionMQTT.subscribe(topic_habilitar)
print("Conectado con Broker MQTT")
except OSError as e:
#Si fallo la conexion, reiniciamos todo
print("Fallo la conexion al Broker, reiniciando...")
time.sleep(5)
machine.reset()
#Mostrar en display y publicar valor
def actualizar_display():
val=max(0,min(contador,99))
display.show("{:0>2}".format(val))
conexionMQTT.publish(topic_personas, str(val))
#logica de detección
def detectar_movimiento():
global contador
if sensor_A.value():
led_A.value(1)
tiempo_inicio = time.ticks_ms()
while sensor_B.value() == 0 and time.ticks_diff(time.ticks_ms(), tiempo_inicio) < 3000:
pass
led_A.value(0)
if sensor_B.value():
led_B.value(1)
time.sleep(0.2) # breve encendido para confirmación visual
led_B.value(0)
if contador >= 99:
print("No se puede ingresar: el lugar está lleno")
conexionMQTT.publish(topic_evento, "lugar lleno")
else:
contador += 1
conexionMQTT.publish(topic_evento, "entrada")
actualizar_display()
print("Entrada detectada")
# Esperar hasta que ambos sensores estén apagados
while sensor_A.value() or sensor_B.value():
time.sleep(0.01)
elif sensor_B.value():
led_B.value(1)
tiempo_inicio = time.ticks_ms()
while sensor_A.value() == 0 and time.ticks_diff(time.ticks_ms(), tiempo_inicio) < 3000:
pass
led_B.value(0)
if sensor_A.value():
led_A.value(1)
time.sleep(0.2)
led_A.value(0)
if contador > 0:
contador -= 1
else:
contador = 0
conexionMQTT.publish(topic_evento, "salida")
actualizar_display()
print("Salida detectada")
# Esperar hasta que ambos sensores estén apagados
while sensor_A.value() or sensor_B.value():
time.sleep(0.01)
# --- Loop principal ---
while True:
try:
conexionMQTT.check_msg() # Escucha si llega algun mensaje de los feeds
if sistema_habilitado:
detectar_movimiento() # Verifica sensores solo si el sistema esta habilitado
time.sleep(0.1) # Pausa breve para que no se sature el microcontrolador
except OSError as e:
print("Error de conexión. Reiniciando...")
time.sleep(5)
machine.reset()