"""Programa principal del control inteligente de iluminación.
Botones:
- MODO: cambia MANUAL -> AUTOMATICO -> HORARIO.
- ACCION: enciende/apaga manualmente o pausa/reactiva el modo actual.
- MAS / MENOS: ajustan intensidad o sensibilidad, según el modo.
"""
from time import ticks_ms, ticks_diff, sleep_ms
from configuracion import PINES, SISTEMA
from control import ControlIluminacion
from hardware import (
crear_botones,
SensorLuz,
LamparaPWM,
Pantalla,
configurar_reloj,
obtener_hora,
)
def formatear_hora(hora, minuto, segundo):
return "{:02d}:{:02d}:{:02d}".format(hora, minuto, segundo)
def imprimir_cabecera_csv():
print("CSV,hora,modo,oscuridad_pct,intensidad_pct,estado,motivo")
def imprimir_registro_csv(hora_texto, estado):
estado_lampara = "ENCENDIDA" if estado["encendida"] else "APAGADA"
motivo = estado["motivo"].replace(",", ";")
print(
"CSV,{},{},{},{},{},{}".format(
hora_texto,
estado["modo"],
estado["oscuridad"],
estado["intensidad"],
estado_lampara,
motivo,
)
)
def ejecutar():
botones = crear_botones()
sensor = SensorLuz(PINES["sensor_ldr_adc"])
lampara = LamparaPWM(PINES["lampara_pwm"])
pantalla = Pantalla()
reloj = configurar_reloj()
controlador = ControlIluminacion()
oscuridad = 0
estado = controlador.evaluar(oscuridad, 0, 0)
ahora = ticks_ms()
ultima_lectura = ahora - SISTEMA["periodo_sensor_ms"]
ultima_pantalla = ahora - SISTEMA["periodo_pantalla_ms"]
ultimo_serial = ahora - SISTEMA["periodo_serial_ms"]
print("Sistema de iluminación iniciado")
print("Botones: MODO, ACCION, MAS y MENOS")
imprimir_cabecera_csv()
try:
while True:
ahora = ticks_ms()
# Tarea 1: lectura de interfaz de usuario.
if botones["modo"].fue_presionado():
print("EVENTO:", controlador.cambiar_modo())
if botones["accion"].fue_presionado():
controlador.accionar()
print("EVENTO:", controlador.ultimo_motivo)
if botones["mas"].fue_presionado():
controlador.ajustar(1)
print("EVENTO:", controlador.ultimo_motivo)
if botones["menos"].fue_presionado():
controlador.ajustar(-1)
print("EVENTO:", controlador.ultimo_motivo)
# Tarea 2: adquisición y procesamiento de la señal analógica.
if ticks_diff(ahora, ultima_lectura) >= SISTEMA["periodo_sensor_ms"]:
oscuridad = sensor.leer_oscuridad()
ultima_lectura = ahora
hora, minuto, segundo = obtener_hora(reloj)
hora_texto = formatear_hora(hora, minuto, segundo)
# Tarea 3: decisión de control y salida PWM.
estado = controlador.evaluar(oscuridad, hora, minuto)
lampara.aplicar(estado["intensidad"])
# Tarea 4: interfaz visual.
if ticks_diff(ahora, ultima_pantalla) >= SISTEMA["periodo_pantalla_ms"]:
pantalla.mostrar(estado, hora_texto, controlador.texto_ajuste())
ultima_pantalla = ahora
# Tarea 5: comunicación serial y registro de datos.
if ticks_diff(ahora, ultimo_serial) >= SISTEMA["periodo_serial_ms"]:
imprimir_registro_csv(hora_texto, estado)
ultimo_serial = ahora
sleep_ms(SISTEMA["retardo_bucle_ms"])
except KeyboardInterrupt:
lampara.apagar()
print("Sistema detenido por el usuario")
except Exception as error:
lampara.apagar()
print("ERROR GENERAL:", error)
raise
if __name__ == "__main__":
ejecutar()