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
# 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):
alarma.actualizar_estado(temp, hum) # Actualiza el estado de la alarma basado en temp y hum
if hum == 100:
my_servo.write_angle(0) # Cerrar el servo cuando se humedezca completamente
luz.fill((0, 255, 0)) # Luz verde
luz.write()
# La alarma ya se detendrá por la lógica en `actualizar_estado`
return # Salir de la función para evitar sobreescritura por la siguiente condición
if temp > 30:
my_servo.write_angle(180) # Abrir el servo al 100%
luz.fill((0, 0, 255)) # Luz azul
luz.write()
else:
# Si la temperatura está en rango normal, asegurar que el servo esté en 0 grados
my_servo.write_angle(0)
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.running: # Verifica si la alarma está en ejecución
alarma.detener() # Detiene la alarma si está en ejecución
sleep(1) # Pausa de un segundo entre cada lectura