from machine import Pin, I2C, time_pulse_us, PWM
from dht
import ds1307
from time import sleep_us, sleep
led = Pin(2, Pin.OUT)
# configuracion del sensor DHT22
dht_pin = Pin(26) #Cambiamos el pin si usamos otro
dht_sensor = dht.DHT22(dht_pin)
#configuracion del servomotor
servo_pin = Pin(13)
servo = PWM(servo_pin, freq=50) #frecuencia del 50Hz para el servomotor
# Configuración del sensor ultrasónico
echo = Pin(18, Pin.IN) # Entrada
trig = Pin(5, Pin.OUT) # Salida
# Configuración de I2C para el DS1307
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
rtc = ds1307.DS1307(i2c)
# Establecer la fecha y hora actual en el DS1307
# Formato: (año, mes, día, hora, minuto, segundo, día de la semana)
# Por ejemplo, 14 de enero de 2025, martes (2), a las 12:53:50
rtc.set_datetime(2025, 1, 14, 12, 53, 55, 2)
# Establecer fecha 14 enero 2025, martes a las 12:53:55
#funcion para mover el servomotor
def mover_servo(angulo):
#ajustamos el valor de duty para controlar el servo
#0 grados: 40, 180 grados: 115
duty_value = 40 + (angulo * 75) // 180 #//significa resultado de la division da como serultado el valor entero
servo.duty(duty_value)
# Función para medir la distancia con el sensor ultrasónico
def medir_distancia():
trig.value(0) # Apaga el trigger
sleep_us(2) # Espera 2 microsegundos
trig.value(1) # Enciende el trigger
sleep_us(10) # Espera 10 microsegundos
trig.value(0) # Apaga el trigger
x = time_pulse_us(echo, 1) # Medir el tiempo del pulso en el pin de echo
# Calcular la distancia en centímetros (usando 0.034 para un valor más preciso)
distancia = round((0.034 * x) / 2, 1)
return distancia
# Función para obtener la fecha y hora actual del DS1307
def obtener_fecha_y_hora():
fecha_y_hora = rtc.datetime()
# Devuelve una tupla (año, mes, día, hora, minuto, segundo, día de la semana)
# Desempaquetar la tupla
año = fecha_y_hora[0] # Año
mes = fecha_y_hora[1] # Mes
dia = fecha_y_hora[2] # Día
dia_semana = fecha_y_hora[6] # Día de la semana (0=domingo, 1=lunes, etc.)
hora = fecha_y_hora[3] # Hora
minuto = fecha_y_hora[4] # Minuto
segundo = fecha_y_hora[5] # Segundo
return año, mes, dia, dia_semana, hora, minuto, segundo
# Ciclo principal
while True:
try:
distancia = medir_distancia() # Obtener la distancia
año, mes, dia, dia_semana, hora, minuto, segundo = obtener_fecha_y_hora() # Obtener la fecha y hora
dht_sensor.measure() #leer DHT22
temperatura = dht_sensor.temperature()
humedad = dht_sensor.humidity()
humedad = round(humedad,1)
temperatura = round(temperatura,1)
# Imprimir en consola la distancia y la fecha y hora por separado
print("Distancia: " + str(distancia) + " cm Fecha: " + str(año) + "-" + str(mes) + "-" + str(dia) + " Día de la semana: " + str(dia_semana) + " Hora: " + str(hora) + ":" + str(minuto) + ":" + str(segundo))
if temperatura < 20 and distancia > 45:
print("Condición 1")
mover_servo(60)
elif temperatura > 40 and segundo > 40 and segundo < 50:
print("Condición 2")
mover_servo(50)
if humedad > 60 or segundo < 20
print("Condición 3")
led.on()
else:
led.off()
sleep(1) # Esperar 1 segundo antes de la siguiente medición