import time
import machine
import micropython
import network
from machine import Pin, PWM
from umqtt.simple import MQTTClient
# Indicamos red WIFI y clave
ssid = 'Wokwi-GUEST'
wifipassword = ''
# Indicamos datos MQTT Broker (server y puerto)
mqtt_server = 'io.adafruit.com'
port = 1883
client_id = 'Test'
user = 'IvanRoig'
password = 'aio_RPDP75gZQgUGsE0UMaz7jp8Tren4'
topic_SEMAFORO1 = 'IvanRoig/feeds/SEMAFORO1'
topic_SEMAFORO2 = 'IvanRoig/feeds/SEMAFORO2'
topic_BOTON1 = 'IvanRoig/feeds/BOTON1'
topic_BOTON2 = 'IvanRoig/feeds/BOTON2'
# Definimos modo Station (conectarse a Access 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(1)
print("Conectado a Wifi!")
# Estado inicial
semaforo1 = True
ledRojo1 = Pin(2, Pin.OUT)
ledAmarillo1 = Pin(3, Pin.OUT)
ledVerde1 = Pin(1, Pin.OUT)
semaforo2 = False
ledRojo2 = Pin(9, Pin.OUT)
ledAmarillo2 = Pin(8, Pin.OUT)
ledVerde2 = Pin(6, Pin.OUT)
ledRojo1.value(0)
ledAmarillo1.value(0)
ledVerde1.value(1)
ledRojo2.value(1)
ledAmarillo2.value(0)
ledVerde2.value(0)
# Definimos las funciones para el cambio de estado de los semáforos
def estado0():
ledRojo1.value(1)
ledAmarillo1.value(0)
ledVerde1.value(0)
ledRojo2.value(0)
ledAmarillo2.value(0)
ledVerde2.value(1)
def estado1():
ledRojo1.value(1)
ledAmarillo1.value(0)
ledVerde1.value(0)
ledRojo2.value(0)
ledAmarillo2.value(1)
ledVerde2.value(0)
def estado2():
ledRojo1.value(0)
ledAmarillo1.value(1)
ledVerde1.value(0)
ledRojo2.value(1)
ledAmarillo2.value(0)
ledVerde2.value(0)
def estado3():
ledRojo1.value(0)
ledAmarillo1.value(0)
ledVerde1.value(1)
ledRojo2.value(1)
ledAmarillo2.value(0)
ledVerde2.value(0)
#Definimos una funcion que se encargue de actualizar el tiempo
# de cada semaforo.
def actualizar_tiempo():
global tiempo_cambio_sem
tiempo_cambio_sem = time.ticks_ms() + 60000
def callback_semaforo(topic, msg):
global semaforo1, semaforo2, cambioDeEstado
dato = msg.decode('utf-8')
topicrec = topic.decode('utf-8')
print("Mensaje recibido en: " + topicrec + " con datos: " + dato)
if topicrec == topic_BOTON1 and "ON" in dato:
if semaforo1: # Es decir que el semaforo 1 está en verde
print("Cambiando semaforo1 de verde a rojo...")
print("Cambiando semaforo2 de rojo a verde...")
cambioDeEstado = True
time.sleep(0.5)
estado3()
time.sleep(2.5)
estado2()
time.sleep(2.5)
estado1()
time.sleep(2.5)
estado0()
semaforo1 = False # Se puso en rojo el semaforo 1
semaforo2 = True # Se puso en verde el semaforo 2
conexionMQTT.publish(topic_SEMAFORO1, "0")
conexionMQTT.publish(topic_SEMAFORO2, "1")
actualizar_tiempo()
cambioDeEstado = False
if topicrec == topic_BOTON2 and "ON" in dato:
if semaforo2: # Es decir que el semaforo 2 está en verde
print("Cambiando semaforo1 de rojo a verde...")
print("Cambiando semaforo2 de verde a rojo...")
cambioDeEstado = True
time.sleep(0.5)
estado0()
time.sleep(2.5)
estado1()
time.sleep(2.5)
estado2()
time.sleep(2.5)
estado3()
semaforo2 = False # Se puso en rojo el semaforo 2
semaforo1 = True # Se puso en verde el semaforo 1
conexionMQTT.publish(topic_SEMAFORO1, "1")
conexionMQTT.publish(topic_SEMAFORO2, "0")
actualizar_tiempo()
cambioDeEstado = False
# Intentamos conectarnos al broker MQTT
# Intento de conexión al broker MQTT
try:
conexionMQTT = MQTTClient(client_id, mqtt_server, user=user, password=password, port=port)
conexionMQTT.set_callback(callback_semaforo)
conexionMQTT.connect()
print("Conectado al broker MQTT")
conexionMQTT.subscribe(topic_SEMAFORO1)
conexionMQTT.subscribe(topic_SEMAFORO2)
conexionMQTT.subscribe(topic_BOTON1)
conexionMQTT.subscribe(topic_BOTON2)
conexionMQTT.publish(topic_SEMAFORO1, "1") # Estado inicial
conexionMQTT.publish(topic_SEMAFORO2, "0") # Estado inicial
print("Suscrito a los temas: {}, {}, {}, {}".format(topic_SEMAFORO1, topic_SEMAFORO2, topic_BOTON1, topic_BOTON2))
except OSError as e:
print("Error de conexión MQTT:", e)
machine.reset()
cambioDeEstado = False
tiempo_cambio_sem = time.ticks_ms() + 60000
while True:
try:
# Verificamos si hay mensajes nuevos publicados por el broker
conexionMQTT.check_msg()
# Creamos un if que verifica si un semaforo ya llegó a los 60 segundos.
if time.ticks_ms() >= tiempo_cambio_sem:
# Creamos un if que se fija si se está cambiando el estado del
# semaforo evitando así conflictos por si se toca ambos botones
# al mismo tiempo.
if cambioDeEstado == False:
# Ahora nos fijamos cual de los dos semaforos cumplió su
# tiempo máximo permitido en verde.
if semaforo1 == True:
print("Cambiando semaforo1 de verde a rojo...")
print("Cambiando semaforo2 de rojo a verde...")
cambioDeEstado = True #Empieza el cambio de estado
estado3()
time.sleep(2.5)
estado2()
time.sleep(2.5)
estado1()
time.sleep(2.5)
estado0()
semaforo1 = False # Se puso en rojo el semaforo 1
semaforo2 = True
cambioDeEstado = False # Termina el cambio de estado
actualizar_tiempo()
conexionMQTT.publish(topic_SEMAFORO1, "0")
conexionMQTT.publish(topic_SEMAFORO2, "1")
else:
print("Cambiando semaforo1 de rojo a verde...")
print("Cambiando semaforo2 de verde a rojo...")
cambioDeEstado = True # Empieza el cambio de estado
estado0()
time.sleep(2.5)
estado1()
time.sleep(2.5)
estado2()
time.sleep(2.5)
estado3()
semaforo2 = False # Se puso en rojo el semaforo 2
semaforo1 = True
cambioDeEstado = False # Termina el cambio de estado
actualizar_tiempo()
conexionMQTT.publish(topic_SEMAFORO1, "1")
conexionMQTT.publish(topic_SEMAFORO2, "0")
time.sleep_ms(500)
except OSError as e:
print("Error ", e)
time.sleep(5)
machine.reset()