from machine import Pin, ADC, I2C
from time import sleep
from neopixel import NeoPixel
from servo import Servo
from hcsr04 import HCSR04
import dht
import ssd1306
from alarma import Alarma
# Creación de instancias de los objetos a utilizar.
boton = Pin(2, Pin.IN, Pin.PULL_UP)
luz = NeoPixel(Pin(0), 3) # Declaración del pin y la cantidad de neopixels.
servo_pin = Pin(14) # Instancia del servo según su pin
my_servo = Servo(servo_pin) # Enlace a la clase.
Potenciometro = ADC(Pin(4))
sensor = dht.DHT22(Pin(15))
Ultra = HCSR04(13, 12, 10000)
i2c = I2C(0, scl=Pin(22), sda=Pin(21)) # Instancia los pines conectados a la pantalla.
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Crear una instancia de Alarma
alarma = Alarma(pin=0, num_pixels=3)
# Inicializar estado
estado = 0 # 0: apagado, 1: mostrar temperatura, 2: mostrar humedad, 3: mostrar distancia
alarma_activada = False
# Métodos "funciones" llamadas desde ciclo "While"
def leer_temperatura():
sensor.measure()
return sensor.temperature()
def leer_humedad():
sensor.measure()
return sensor.humidity()
def controlar_alarma_y_servo(temp, hum):
global alarma_activada # Indica que usarás la variable global alarma_activada
if hum == 100:
my_servo.write_angle(0) # Cerrar la llave del agua cuando se humedezca completamente.
luz.fill((0, 255, 0)) # Luz verde
luz.write()
if alarma_activada: # Apaga la rutina de neopixels
alarma.detener()
alarma_activada = False
return # Salir de la función para evitar sobreescritura por la siguiente condición
if temp > 30:
my_servo.write_angle(180) # Abrir la llave del agua al 100%
print("Regando...")
if not alarma_activada: # Solo activar la alarma si no está activada
alarma.ejecutar() # Llamar al método ejecutar de la clase Alarma
alarma_activada = True
else:
# Desactivar la alarma y cerrar el servo si la temperatura está en el rango normal
if alarma_activada:
alarma.detener()
alarma_activada = False
my_servo.write_angle(0) # Asegurarse de que el servo esté en 0 grados
luz.fill((0, 0, 0)) # Luz apagada
luz.write()
def control_manual_servo():
pot_value = Potenciometro.read() # Leer valor del potenciómetro (0-4095)
angle = int(pot_value * 180 / 4095) # Mapear el valor a un rango de 0 a 180 grados
my_servo.write_angle(angle)
while True:
if not boton.value(): # Si el botón está presionado (valor bajo)
estado = (estado + 1) % 4 # Alternar entre 0, 1, 2, 3
while not boton.value(): # Espera hasta que se suelte el botón
pass
sleep(0.5) # Pequeña pausa para evitar rebotes
temp = leer_temperatura()
hum = leer_humedad()
if estado == 1:
oled.fill(0) # Función que borra pantalla.
oled.text("SENSOR", 40,20)
oled.text("TEMPERATURA", 30,30)
oled.show()
print("Temp: " + str(temp))
controlar_alarma_y_servo(temp, hum)
elif estado == 2:
oled.fill(0) # Función que borra pantalla.
oled.text("SENSOR", 40,20)
oled.text("HUMEDAD", 40,30)
oled.show()
print("Hum: " + str(hum))
controlar_alarma_y_servo(temp, hum)
elif estado == 3:
oled.fill(0) # Función que borra pantalla.
oled.text("SENSOR", 40,20)
oled.text("DISTANCIA", 30,30)
oled.show()
print("Cm: " + str(Ultra.distance_cm()))
else:
oled.fill(0) # Función que borra pantalla.
oled.text("Presiona boton", 10,20)
oled.show()
print("Apagado...")
my_servo.write_angle(0) # Mientras no se realizan lecturas de hum ni temp se cierra la llave.
if alarma_activada:
alarma.detener()
alarma_activada = False
sleep(1) # Pausa de un segundo entre cada lectura