from machine import Pin, PWM, I2C
from ssd1306 import SSD1306_I2C
import dht
import utime
# Configuración de la comunicación I2C para la pantalla OLED
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
oled = SSD1306_I2C(128, 32, i2c)
# Configuración de los pines para el sensor DHT22 y el servo de humedad
dht_sensor = dht.DHT22(Pin(4))
servo_humedad = PWM(Pin(15)) # Pin para controlar el servomotor de humedad
servo_humedad.freq(50)
# Configuración de los pines para el sensor de distancia y el servo de distancia
trigger = Pin(16, Pin.OUT)
echo = Pin(17, Pin.IN)
servo_distancia = PWM(Pin(10)) # Pin para controlar el servomotor de distancia
servo_distancia.freq(50)
# Umbrales para activar el riego
umbral_humedad = 60 # Humedad en porcentaje
umbral_distancia = 100 # Distancia en centímetros
# Función para mostrar mensaje en la pantalla OLED
def mostrar_mensaje(mensaje):
oled.fill(0) # Limpiar la pantalla
oled.text(mensaje, 0, 0)
oled.show()
# Función para controlar el servomotor de humedad
def controlar_servo_humedad(humedad):
if humedad <= umbral_humedad:
servo_humedad.duty_u16(4915) # Valor de PWM para posición abierta
else:
servo_humedad.duty_u16(1638) # Valor de PWM para posición cerrada
# Función para medir la distancia con el sensor HC-SR04
def medir_distancia():
# Generar un pulso corto en el pin de trigger
trigger.value(0)
utime.sleep_us(5)
trigger.value(1)
utime.sleep_us(10)
trigger.value(0)
# Esperar el pulso de echo y medir la duración
while echo.value() == 0:
start_time = utime.ticks_us()
while echo.value() == 1:
end_time = utime.ticks_us()
# Calcular la duración del pulso y convertir a distancia en centímetros
pulse_duration = utime.ticks_diff(end_time, start_time)
distance = pulse_duration * 0.034 / 2 # Velocidad del sonido en el aire es ~343 m/s
return distance
def controlar_servo_distancia (distancia):
if distancia <= umbral_distancia:
servo_distancia.duty_u16(4915) #abre el contenedor
else:
servo_distancia.duty_u16(1638) #cierra el contend
# Inicialización
def mostrar_mensaje(nombre, humedad, distancia):
oled.fill(0) # Limpiar la pantalla
oled.text(nombre, 0, 0) # Mostrar el nombre primero
mensaje_hum = "Hum: {:.1f} %".format(humedad)
mensaje_dist = "Dist: {:.2f} cm".format(distancia)
oled.text(mensaje_hum, 0, 10) # Mostrar humedad debajo de la temperatura
oled.text(mensaje_dist, 0, 20) # Mostrar distancia debajo de la humedad
oled.show()
# Loop principal
while True:
try:
# Leer temperatura y humedad
dht_sensor.measure()
temperatura = dht_sensor.temperature()
humedad = dht_sensor.humidity()
# Mostrar en la pantalla OLED
distancia = medir_distancia()
mostrar_mensaje("Sistema de riego", humedad, distancia)
# Control del servomotor de humedad basado en la humedad
controlar_servo_humedad(humedad)
# Medir la distancia y controlar el servomotor de distancia
distancia = medir_distancia()
controlar_servo_distancia(distancia)
utime.sleep(5) # Medir cada 5 segundos (ajustar según necesidad)
except Exception as e:
mostrar_mensaje("Error: {}".format(e))
utime.sleep(2)