from machine import Pin, I2C, PWM, SoftI2C
import time
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
from machine import I2C
I2C_ADDR = 0x27
totalRows = 2
totalColumns = 16
class Reloj:
def __init__(self, hora, minutos):
self.hora = hora
self.minutos = minutos
def ajustar(self, hora, minutos):
self.hora = hora
self.minutos = minutos
class Alarma(Reloj):
def __init__(self, hora, minutos, activa=False):
super().__init__(hora, minutos)
self.activa = activa
def activar(self):
self.activa = True
def desactivar(self):
self.activa = False
class Boton:
def __init__(self, pin):
self.boton = Pin(pin, Pin.IN, Pin.PULL_UP)
self.ultimo_estado = self.boton.value()
self.ultimo_tiempo = time.ticks_ms()
def presionado(self):
estado_actual = self.boton.value()
ahora = time.ticks_ms()
if estado_actual == 0 and self.ultimo_estado == 1 and ahora - self.ultimo_tiempo > 200: # Rebote
self.ultimo_estado = estado_actual
self.ultimo_tiempo = ahora
return True
self.ultimo_estado = estado_actual
return False
class Despertador:
def __init__(self):
self.reloj = Reloj(0, 0)
self.alarma = Alarma(0, 0)
i2c = SoftI2C (scl=Pin(5), sda=Pin(4), freq=10000)
self.display = I2cLcd (i2c, I2C_ADDR, totalRows, totalColumns)
self.boton_reloj = Boton(12)
self.boton_alarma = Boton(13)
self.boton_hora = Boton(14)
self.boton_minutos = Boton(15)
self.switch_alarma = Pin(16, Pin.IN, Pin.PULL_UP)
self.buzzer = PWM(Pin(17))
self.led = Pin(18, Pin.OUT)
def ajustar_reloj(self, hora, minutos):
self.reloj.ajustar(hora, minutos)
def ajustar_alarma(self, hora, minutos):
self.alarma.ajustar(hora, minutos)
def activar_alarma(self):
self.alarma.activar()
def desactivar_alarma(self):
self.alarma.desactivar()
def tic(self):
# Actualizar el reloj cada minuto
self.reloj.minutos += 1
if self.reloj.minutos == 60:
self.reloj.minutos = 0
self.reloj.hora += 1
if self.reloj.hora == 24:
self.reloj.hora = 0
# Comprobar si los botones han sido presionados
if self.boton_reloj.presionado():
self.display.move_to(1,14)
self.display.putstr("S")
if self.boton_hora.presionado():
self.reloj.hora += 1
if self.reloj.hora == 24:
self.reloj.hora = 0
if self.boton_minutos.presionado():
self.reloj.minutos += 1
if self.reloj.minutos == 60:
self.reloj.minutos = 0
if self.boton_alarma.presionado():
if self.boton_hora.presionado():
self.alarma.hora += 1
if self.alarma.hora == 24:
self.alarma.hora = 0
if self.boton_minutos.presionado():
self.alarma.minutos += 1
if self.alarma.minutos == 60:
self.alarma.minutos = 0
# Comprobar el switch de la alarma
if self.switch_alarma.value() == 0:
self.activar_alarma()
else:
self.desactivar_alarma()
# Comprobar si la alarma debe sonar
if (self.alarma.activa and self.reloj.hora == self.alarma.hora and
self.reloj.minutos == self.alarma.minutos):
self.sonar_alarma()
# Actualizar el display
self.actualizar_display()
def actualizar_display(self):
# Limpiar el display
#self.display.clear()
# Escribir la hora actual en la primera línea
self.display.move_to(0, 0)
self.display.putstr("Hora: {:02d}:{:02d}".format(self.reloj.hora, self.reloj.minutos))
# Escribir el estado de la alarma en la segunda línea
self.display.move_to(0, 1)
if self.alarma.activa:
self.display.putstr("Alarma: ON {:02d}:{:02d}".format(self.alarma.hora, self.alarma.minutos))
else:
self.display.putstr("Alarma: OFF")
def sonar_alarma(self):
# Hacer sonar la alarma
self.buzzer.freq(2000) # Ajustar a tu hardware
self.buzzer.duty(512)
self.led.on()
def detener_alarma(self):
# Detener la alarma
self.buzzer.duty(0)
self.led.off()
despertador = Despertador()
despertador.ajustar_reloj(5,20)
despertador.alarma.ajustar(6,00)
while True:
despertador.tic()
print (despertador.boton_reloj.presionado())
#despertador.actualizar_display()
#time.sleep(1) # Esperar un segundo antes de la próxima actualización