from machine import Pin, I2C, SoftI2C
import dht
import ssd1306
import time
import random  # Importar la librería random

# Configuración de las pantallas OLED
i2c_1 = SoftI2C(scl=Pin(22), sda=Pin(21))  # Pantalla 1
oled_1 = ssd1306.SSD1306_I2C(128, 64, i2c_1)

i2c_2 = SoftI2C(scl=Pin(25), sda=Pin(26))  # Pantalla 2
oled_2 = ssd1306.SSD1306_I2C(128, 64, i2c_2)

# Configuración del sensor DHT22
sensor_dht = dht.DHT22(Pin(4))

# Configuración de los pines para los motores paso a paso
pin_step_1 = Pin(18, Pin.OUT)  # Pin STEP para el motor 1
pin_dir_1 = Pin(19, Pin.OUT)   # Pin DIR para el motor 1

pin_step_2 = Pin(23, Pin.OUT)  # Pin STEP para el motor 2
pin_dir_2 = Pin(32, Pin.OUT)   # Pin DIR para el motor 2

# Pines enable para los drivers
pin_enable_1 = Pin(5, Pin.OUT)  # Enable para el motor 1
pin_enable_2 = Pin(17, Pin.OUT)  # Enable para el motor 2

# Umbrales de temperatura y humedad
UMBRAL_TEMPERATURA = 30  # Umbral de temperatura en grados Celsius
UMBRAL_HUMEDAD = 60      # Umbral de humedad en porcentaje

# Claves de acceso para el control de velocidad de los motores
claves_motor = {
    "1234": (pin_step_1, pin_dir_1, 1000),  # Motor 1 - velocidad lenta
    "5678": (pin_step_1, pin_dir_1, 500),   # Motor 1 - velocidad rápida
    "4321": (pin_step_2, pin_dir_2, 1000),  # Motor 2 - velocidad lenta
    "8765": (pin_step_2, pin_dir_2, 500),   # Motor 2 - velocidad rápida
}

# Función para mover el motor paso a paso
def mover_motor(pasos, direccion, pin_step, pin_dir, velocidad):
    pin_dir.value(direccion)  # Establecer la dirección (1 o 0)
    print(f"Moviendo motor con {pasos} pasos, dirección {direccion}")
    
    for _ in range(pasos):
        pin_step.on()
        time.sleep_us(velocidad)  # Ajusta el tiempo de pulso para la velocidad
        pin_step.off()
        time.sleep_us(velocidad)
    
    print("Motor movido correctamente")
    return 0  # Reiniciar los pasos a 0

# Función para simular lectura del sensor DHT22
def leer_sensor_dht_simulado():
    # Generar datos aleatorios de temperatura (20-40°C) y humedad (30-80%)
    temp = random.randint(20, 40)  # Genera temperatura aleatoria
    hum = random.randint(30, 80)    # Genera humedad aleatoria
    return temp, hum

# Función para mostrar datos en la OLED 1
def mostrar_temp_humedad(temp, hum, motor_encendido):
    oled_1.fill(0)
    oled_1.text("Temp: {} C".format(temp), 0, 0)
    oled_1.text("Hum: {} %".format(hum), 0, 10)
    oled_1.text("Motor: {}".format(motor_encendido), 0, 20)
    oled_1.show()

# Función para mostrar tiempo en la OLED 2
def mostrar_tiempo(tiempo_restante):
    oled_2.fill(0)
    oled_2.text("Tiempo: {}s".format(tiempo_restante), 0, 0)
    oled_2.show()

# Bucle principal
pasos_motor_1 = 0  # Contador de pasos para el motor 1
pasos_motor_2 = 0  # Contador de pasos para el motor 2

while True:
    # Leer datos simulados
    temp, hum = leer_sensor_dht_simulado()
    motor_encendido = "Ninguno"

    # Mostrar los datos simulados en la pantalla OLED 1
    mostrar_temp_humedad(temp, hum, motor_encendido)

    # Lógica de automatización basada en condiciones ambientales
    if temp > UMBRAL_TEMPERATURA:
        print("Temperatura alta, activando motor 1")
        motor_encendido = "Motor 1"
        pasos_motor_1 = mover_motor(2000, 1, pin_step_1, pin_dir_1, 500)  # Motor 1
        pin_enable_1.value(0)  # Activar el motor 1

    if hum > UMBRAL_HUMEDAD:
        print("Humedad alta, activando motor 2")
        motor_encendido = "Motor 2"
        pasos_motor_2 = mover_motor(2000, 1, pin_step_2, pin_dir_2, 1000)  # Motor 2
        pin_enable_2.value(0)  # Activar el motor 2

    # Mostrar motor encendido en OLED 1
    mostrar_temp_humedad(temp, hum, motor_encendido)

    # Simulación de entrada de clave
    clave = input("Ingrese clave: ")

    if clave in claves_motor:
        pin_step, pin_dir, velocidad = claves_motor[clave]
        print("Encendiendo motor con clave {}".format(clave))
        
        pasos = 2000  # Por ejemplo, 2000 pasos para varias vueltas
        direccion = 1  # Asegura que gire en la dirección correcta
        
        # Reiniciar el conteo de pasos antes de mover el motor
        pasos_motor_1 = mover_motor(pasos, direccion, pin_step, pin_dir, velocidad)

        # Mostrar tiempo restante en OLED 2
        for i in range(5, 0, -1):  # Cuenta regresiva de 5 a 1
            mostrar_tiempo(i)
            time.sleep(1)  # Espera un segundo entre cada actualización

    else:
        print("Clave incorrecta")

    time.sleep(1)  # Espera un poco antes de la siguiente lectura
A4988
A4988