"""
============================================================
Mionca Safe-System
- Integrantes: Fabrizio Guzman - Lautaro Moreira
- Materia: Fundamentos de Sistemas Embebidos - UNLaM
- Fecha: 07/07/2026
Mionca Safe-System asiste a la conducción de camiones de carga de dos formas:
Por un lado, vigila el entorno cercano del camión y advierte al conductor
cuando algo se aproxima peligrosamente desde cualquiera de sus puntos ciegos.
Por otro lado, supervisa la temperatura del acoplado e informa
a un tablero remoto cada vez que su estado cambia, permitiendo reaccionar
a tiempo para evitar que la carga pierda la cadena de frío.
"""
import time
import network
import machine
import config
from machine import Pin, PWM
from umqtt.simple import MQTTClient
from hcsr04 import HCSR04
DISTANCIA_PELIGRO_CM = 50 # Por debajo de esta distancia, se considera peligroso
INTERVALO_LECTURA_MS = 300 # Tiempo entre iteraciones
BUZZER_PIN = 32 # GPIO del buzzer
BUZZER_FREQ = 2000 # Frecuencia del buzzer (Hz)
BUZZER_DUTY = 256 # Ciclo de trabajo cuando suena (0=apagado)
SENSORES = {
"sensor-izq-del": {
"trigger_pin": 13,
"echo_pin": 34
},
"sensor-izq-tras": {
"trigger_pin": 25,
"echo_pin": 36
},
"sensor-der-del": {
"trigger_pin": 14,
"echo_pin": 35
},
"sensor-der-tras": {
"trigger_pin": 26,
"echo_pin": 39
}
}
def conectar_wifi():
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(config.WIFI_SSID, config.WIFI_PASS)
while not sta_if.isconnected():
time.sleep_ms(100)
print("Conectado a Wifi")
print(sta_if.ifconfig())
def conectar_mqtt():
mqtt_client = MQTTClient(client_id="camion-esp32", server=config.MQTT_SERVER, port=config.MQTT_PORT, user=config.ADAFRUIT_AIO_USERNAME, password=config.ADAFRUIT_AIO_KEY)
mqtt_client.connect()
print("Conexión MQTT establecida")
return mqtt_client
def crear_sensores(config_sensores):
sensores={}
for nombre, datos_sensores in config_sensores.items(): # iteramos sobre los sensores configurándolos uno por uno
sensores[nombre] = HCSR04(trigger_pin=datos_sensores["trigger_pin"], echo_pin=datos_sensores["echo_pin"])
return sensores
buzzer=PWM(Pin(BUZZER_PIN),freq=BUZZER_FREQ,duty=0) #duty=0 -> Apagado inicialmente
def buzzer_on():
buzzer.duty(BUZZER_DUTY) #buzzer prendido al 25%
def buzzer_off():
buzzer.duty(0)
def leer_proximidad(sensores):
esquina_peligro = []
for nombre, sensor in sensores.items(): # leemos la distancia de cada sensor
try:
distancia = sensor.distance_cm()
except OSError:
distancia=999
if distancia <= DISTANCIA_PELIGRO_CM:
esquina_peligro.append(nombre) # si existe una esquina peligrosa, la agregamos a la lista
return esquina_peligro
"""
FSM de proximidad: dos estados -> LIBRE (lista vacía) y PELIGRO (hay puntos ciegos peligrosos)
Solo se informa a Adafruit cuando el estado cambia
"""
def manejar_proximidad(sensores,esquina_peligro_anterior,contador_eventos, mqtt_client):
esquina_peligro = leer_proximidad(sensores)
if esquina_peligro:
buzzer_on() # si existe una esquina peligrosa, prendemos el buzzer
else:
buzzer_off()
if esquina_peligro_anterior != esquina_peligro:
if esquina_peligro:
mensaje = ",".join(esquina_peligro)
else:
mensaje = "LIBRE"
mqtt_client.publish(topic=config.ADAFRUIT_AIO_USERNAME+"/feeds/"+config.FEED_PROXIMIDAD, msg=mensaje)
if not esquina_peligro_anterior and esquina_peligro:
contador_eventos += 1
mqtt_client.publish(topic=config.ADAFRUIT_AIO_USERNAME+"/feeds/"+config.FEED_EVENTOS, msg=str(contador_eventos))
return esquina_peligro, contador_eventos
def main():
conectar_wifi()
mqtt_client = conectar_mqtt()
sensores = crear_sensores(SENSORES)
# fix: leemos y descartamos los registros iniciales para estabilizar el sensor, evitando falsos positivos
for _ in range(3):
leer_proximidad(sensores)
time.sleep_ms(INTERVALO_LECTURA_MS)
esquina_peligro_anterior=[]
contador_eventos=0
while True:
esquina_peligro_anterior, contador_eventos = manejar_proximidad(sensores,esquina_peligro_anterior, contador_eventos, mqtt_client)
time.sleep_ms(INTERVALO_LECTURA_MS)
main()