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