import machine
from machine import Pin, I2C, PWM, ADC
import time
from machine import I2C, Pin
from pico_i2c_lcd import I2cLcd
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
direccion_lcd = 0x27 # Dirección I2C del LCD
pantalla_lcd = I2cLcd(i2c, direccion_lcd, 2, 16) # 2 filas, 16 columnas
# Configuración del SSR
ssr_control = Pin(15, Pin.OUT) # Control del SSR conectado al pin GP15
# Bocina
bocina = Pin(13, Pin.OUT) # Pin de salida para la bocina
# Configuración del potenciómetro (ADC)
potenciometro = ADC(Pin(26)) # Conectar al pin GP26 para leer la velocidad
# Configuración del PWM para el motor
pwm_motor = PWM(Pin(27)) # Pin GP27 para la señal PWM
pwm_motor.freq(1000) # Frecuencia PWM de 1 kHz
# Botones
boton_inicio = Pin(16, Pin.IN, Pin.PULL_UP)
boton_emergencia = Pin(17, Pin.IN, Pin.PULL_UP)
boton_reiniciar = Pin(18, Pin.IN, Pin.PULL_UP)
boton_incrementar = Pin(19, Pin.IN, Pin.PULL_UP)
boton_decrementar = Pin(20, Pin.IN, Pin.PULL_UP)
# Variables de temporización y estado
tiempo_restante = 0 # Tiempo restante en segundos
centrifuga_en_funcionamiento = False
# Funciones para ajustar el temporizador
def incrementar_tiempo(pin):
global tiempo_restante
if tiempo_restante < 600: # Máximo 10 minutos
tiempo_restante += 10 # Incrementar 10 segundos
actualizar_pantalla_lcd()
def decrementar_tiempo(pin):
global tiempo_restante
if tiempo_restante > 0:
tiempo_restante -= 10 # Disminuir 10 segundos
actualizar_pantalla_lcd()
# Función para iniciar la centrífuga
def iniciar_centrifuga(pin):
global centrifuga_en_funcionamiento
centrifuga_en_funcionamiento = True
iniciar_cuenta_regresiva() # Iniciar conteo regresivo
# Función de paro de emergencia
def paro_emergencia(pin):
global centrifuga_en_funcionamiento
centrifuga_en_funcionamiento = False
ssr_control.off() # Apagar el motor
tiempo_restante = 0
pwm_motor.duty_u16(0) # Apagar PWM
actualizar_pantalla_lcd()
# Función de reinicio
def reiniciar_centrifuga(pin):
global tiempo_restante, centrifuga_en_funcionamiento
centrifuga_en_funcionamiento = False
ssr_control.off() # Apagar el motor
tiempo_restante = 0
bocina.off() # Apagar la bocina
pwm_motor.duty_u16(0) # Apagar PWM
actualizar_pantalla_lcd()
# Función de cuenta regresiva para el temporizador
def iniciar_cuenta_regresiva():
global tiempo_restante
while tiempo_restante > 0 and centrifuga_en_funcionamiento:
# Leer el potenciómetro y ajustar la velocidad del motor
ajustar_velocidad_motor()
time.sleep(1)
tiempo_restante -= 1 # Reducir el tiempo en un segundo
actualizar_pantalla_lcd() # Actualizar el LCD con el tiempo restante
if tiempo_restante == 0:
finalizar_ciclo()
# Función para finalizar el ciclo de la centrífuga
def finalizar_ciclo():
global centrifuga_en_funcionamiento
centrifuga_en_funcionamiento = False
ssr_control.off() # Apagar el motor
pwm_motor.duty_u16(0) # Apagar PWM
bocina.on() # Activar la bocina como señal de finalización
pantalla_lcd.clear()
pantalla_lcd.putstr("Ciclo Finalizado")
# Función para actualizar la pantalla LCD con el tiempo restante
def actualizar_pantalla_lcd():
pantalla_lcd.clear()
minutos = tiempo_restante // 60
segundos = tiempo_restante % 60
pantalla_lcd.putstr(f"Tiempo: {minutos}:{segundos:02d}")
# Función para ajustar la velocidad del motor según el potenciómetro
def ajustar_velocidad_motor():
lectura_pot = potenciometro.read_u16() # Leer el ADC del potenciómetro
velocidad_pwm = int((lectura_pot / 65535) * 65535) # Mapear a rango PWM (0-65535)
pwm_motor.duty_u16(velocidad_pwm) # Ajustar la velocidad del motor
# Configuración de interrupciones para los botones
boton_inicio.irq(trigger=Pin.IRQ_FALLING, handler=iniciar_centrifuga)
boton_emergencia.irq(trigger=Pin.IRQ_FALLING, handler=paro_emergencia)
boton_reiniciar.irq(trigger=Pin.IRQ_FALLING, handler=reiniciar_centrifuga)
boton_incrementar.irq(trigger=Pin.IRQ_FALLING, handler=incrementar_tiempo)
boton_decrementar.irq(trigger=Pin.IRQ_FALLING, handler=decrementar_tiempo)
# Bucle principal
while True:
ajustar_velocidad_motor() # Monitorear y ajustar la velocidad del motor en tiempo real
time.sleep(0.1)