from machine import Pin, ADC, PWM, I2C
from time import sleep # Librería para usar pausas de tiempo.
from neopixel import NeoPixel
from servo import Servo # Librería para usar servomotor
from hcsr04 import HCSR04 # Librería del sensor ultrasónico
import dht # Librería para el uso del sensor DHT22
import ssd1306 # Libería para pantalla OLED
# 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 conectado a la pantalla.
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Métodos "funciones" llamadas desde ciclo "While"
def leer_temperatura():
sensor.measure()
temp = sensor.temperature()
return temp
def leer_humedad():
sensor.measure()
hum = sensor.humidity()
return hum
def control_flujo_agua(temp, hum):
if hum == 100:
my_servo.write_angle(0) # Cerrar la llave del agua cuando se humedezca completamente.
luz[0] = (0, 255, 0)
luz.write()
luz[1] = (0, 255, 0)
luz.write()
luz[2] = (0, 255, 0)
luz.write()
elif 5 <= temp <= 30:
my_servo.write_angle(0) # Cerrar la llave del agua cuando la temperatura esté en el rango normal.
luz[0] = (0, 255, 0)
luz.write()
luz[1] = (0, 255, 0)
luz.write()
luz[2] = (0, 255, 0)
luz.write()
elif temp > 30:
# Permitir el control manual del servomotor mediante el potenciómetro
my_servo.write_angle(180) # Abrir la llave del agua al 100%
luz[0] = (0, 0, 255)
luz.write()
luz[1] = (0, 0, 255)
luz.write()
luz[2] = (0, 0, 255)
luz.write()
def control_manual_servo():
# Leer el valor del potenciómetro y mapearlo a un ángulo para el servomotor
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)
estado = 0 # 0: apagado, 1: mostrar temperatura, 2: mostrar humedad
while True:
#print(Ultra.distance_cm())
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))
control_flujo_agua(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))
control_flujo_agua(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.
sleep(1) # Pausa de un segundo entre cada lectura