from machine import Pin, I2C, PWM, ADC
from time import sleep
from i2c_lcd import I2cLcd
from servo import Servo
from neopixel import NeoPixel
from hcsr04 import HCSR04
import dht
from color_controller import ColorController
from piezo_alarm import PiezoAlarm # Importa la clase PiezoAlarm
# Instancia de objetos
sensorClima = dht.DHT22(Pin(15)) # Sensor Dht22
ultra = HCSR04(16, 17, 10000) # Pines trigg, echo de sensor ultrasonico
boton = Pin(2, Pin.IN, Pin.PULL_UP) # Boton
pot = ADC(Pin(4)) # Potenciometro
np = NeoPixel(Pin(0), 16) # Rueda de neopixeles
piezo_pin = Pin(5) # Pin del piezoeléctrico
piezo_alarm = PiezoAlarm(piezo_pin) # Instancia de PiezoAlarm
servo_pin = Pin(32) # Servo
my_servo = Servo(servo_pin) # Servo
Address_LCD = 0x27 # Dirección de pantalla LCD.
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000) # Configuración del bus I2C con pines de conexión y frecuencia
lcd = I2cLcd(i2c, Address_LCD, 2, 16)
# Instancia del controlador de color
regulador = ColorController(np, pot)
# Funciones llamadas desde "While True"
def LeerTemperatura(): # Función del dht22
sensorClima.measure()
temp = sensorClima.temperature()
return temp
def LeerHumedad(): # Función del dht22
sensorClima.measure()
hum = sensorClima.humidity()
return hum
def LeerDistancia():
return ultra.distance_cm()
def AnimarNeopixels(np, color=(0, 255, 0), delay=0.1):
"""Enciende los neopixels uno por uno en la rueda y apaga el anterior."""
for i in range(len(np)):
# Encender el LED actual
np[i] = color
np.write()
sleep(delay)
# Apagar el LED anterior
if i > 0:
np[i-1] = (0, 0, 0)
np.write()
# Apagar el último LED
np[len(np)-1] = (0, 0, 0)
np.write()
def apagar_neopixels(np):
"""Apaga todos los neopixels."""
for i in range(len(np)):
np[i] = (0, 0, 0)
np.write()
estadoBoton = 0 # Boton inicializado en false para mantener apagado al inicio
while True:
if not boton.value():
estadoBoton = (estadoBoton + 1) % 4 # Alternar entre 0, 1, 2, 3
while not boton.value(): # Espera hasta que se suelte el botón
pass
sleep(0.5) # Pausa para evitar cambios rápidos de estado
temp = LeerTemperatura()
hum = LeerHumedad() # Lecturas constantes de los sensores
dist = LeerDistancia()
if estadoBoton == 0: # Estado de apagado
# Apagar todo
apagar_neopixels(np) # Asegúrate de que los neopixels estén apagados
my_servo.write_angle(90) # Detener el servo en una posición fija
lcd.clear() # Limpiar la pantalla
lcd.backlight_off() # Apaga la iluminación
lcd.move_to(3, 0) # Mover el cursor
lcd.putstr("Invernadero")
lcd.move_to(6, 1)
lcd.putstr("off")
elif estadoBoton == 1:
# Conocer humedad y temperatura de plantas para ser visualizadas
lcd.backlight_on() # Enciende la iluminación
lcd.clear() # Limpiar la pantalla
lcd.move_to(3, 0) # Mover el cursor
lcd.putstr("Temp: " + str(temp))
lcd.move_to(3, 1) # Mover el cursor
lcd.putstr("Hum: " + str(hum))
if temp <= 28: # Si la temperatura es inferior se enciende ventilador.
for angle in range(0, 181, 1): # De 0 a 180 grados giro a la derecha
my_servo.write_angle(angle)
sleep(0.01)
for angle in range(180, -1, -1): # De 180 a 0 grados giro a la izquierda
my_servo.write_angle(angle)
sleep(0.01)
else:
my_servo.write_angle(180) # Detener el servo en una posición fija
if dist <= 120: # Se enciende alarma visual de neopixles para indicar animales cerca del invernadero.
AnimarNeopixels(np)
regulador.update_color()
piezo_alarm.alarm() # Llama a la alarma
else:
apagar_neopixels(np)
piezo_alarm.stop() # Detiene la alarma si la condición no se cumple
elif estadoBoton == 2:
lcd.backlight_on() # Enciende la iluminación
lcd.clear() # Limpiar la pantalla
lcd.move_to(2, 0) # Mover el cursor
lcd.putstr("Dist: " + str(dist) + " cm")
lcd.move_to(1, 1) # Mover el cursor
lcd.putstr("Animal aproxim")
# Asegurar que tanto el servo como los neopixeles funcionen independientemente
if temp <= 28: # Si la temperatura es inferior se enciende ventilador.
for angle in range(0, 181, 1): # De 0 a 180 grados giro a la derecha
my_servo.write_angle(angle)
sleep(0.01)
for angle in range(180, -1, -1): # De 180 a 0 grados giro a la izquierda
my_servo.write_angle(angle)
sleep(0.01)
else:
my_servo.write_angle(180) # Detener el servo en una posición fija
if dist <= 120: # Se enciende alarma visual de neopixles para indicar animales cerca del invernadero.
AnimarNeopixels(np)
regulador.update_color()
piezo_alarm.alarm() # Llama a la alarma
else:
apagar_neopixels(np)
piezo_alarm.stop() # Detiene la alarma si la condición no se cumple