#Este programa es diseñado para programar un sistema de
#habitación domotica tipo invernadero
#modulos
from machine import Pin, PWM, ADC, I2C
import ssd1306
from servo import Servo
import utime
from ultrasonido import Ultrason
from neopixel import NeoPixel
from time import sleep
import dht
import time
import machine
from buttonPrecionar import boton
#################Configuración de pines###########
# Pines servomotor
sensor = dht.DHT22(Pin(15))
# Pines oled
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
## configuracion oled
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
#Pin led de la placa
led0 = Pin(26, Pin.OUT)
# Pines neopixels y servo
pixels = NeoPixel(Pin(13), 16)
sg90 = PWM(Pin(18, mode=Pin.OUT))
sg90.freq(50)
adc=ADC(Pin(34))
#0.5ms/20ms = 0.025 = 2.5% duty cycle
#2.4ms/20ms = 0.12 = 12% duty cycle
#0.025*1024=25.6
#0.12*1024=122.88
# Definir los pines TRIG y ECHO del sensor
TRIG_PIN = 4
ECHO_PIN = 5
# Configurar los pines como salidas o entradas
trig = machine.Pin(TRIG_PIN, machine.Pin.OUT)
echo = machine.Pin(ECHO_PIN, machine.Pin.IN)
#Función que controla un servo por medio de un potenciometro
def servoControl():
while True :
pot=int(adc.read_u16()*180/65535)
sleep(1)
print ("El potenciometro cambio:",pot)
print("============================================")
ton=(pot+45)*100000/9
sg90.duty_ns(int(ton))
utime.sleep_ms(200)
if (pot >= 180):
print("ALERTA DEL SISTEMA")
print("""ALERTA, ALERTA""")
pixels.fill((255, 0, 0) )
pixels.write()
sleep(0.5)
if (pot==90):
print(" SISTEMA DE PUERTA ADECUADO")
print("==============================")
# Green
pixels.fill((0 , 255 , 0))
pixels.write()
sleep(0.5)
if (pot<60):
pixels.fill((0,255,255))
pixels.write()
sleep(0.5)
return pot
#Función zumbador
zumbador = PWM(Pin(2), freq = 400, duty = 512)
def miZumbador(freq1, sleep1):
zumbador.freq(freq1)
zumbador.duty(512)
time.sleep(sleep1)
zumbador.duty(0)
# Funcion para medir temperatura y humedad del invernadero
def func():
sensor.measure()
temp = str(sensor.temperature())
temp0 = sensor.temperature()
hum = str(sensor.humidity())
hum0 = sensor.humidity()
print("el invernadero tiene: " , temp, "temperatura")
print("===============================================")
print("el invernadero tiene:", hum, " humedad")
print("=============================================")
oled.fill(0)
oled.text("Bienvenido al invernadero ", 5,5)
print("=====================================================")
oled.text("Temp:"+ temp, 5, 30)
oled.text("hum:"+hum, 5, 45)
#relé funciona y controla la temperatura y la humedad de la habitación. cuando es mayor a 30
if temp0 >=30:
print("Rele activo, inicia el proceso de enfriamiento de la habitaciòn")
print("===========================================================")
led0.on()
miZumbador(330,1)
miZumbador(349,1)
miZumbador(330,1)
miZumbador(349,1)
miZumbador(440,1)
else:
print("Rele apagado, se ha enfriado la habitacion ")
print("=============================================")
led0.off()
miZumbador(1,0)
oled.show()
sleep(1)
#Funcion para detectar movimiento en la habitación dentro de esta
#se configuran los pines
pir = Pin(32, Pin.IN, Pin.PULL_DOWN)
def sensorMovimiento():
while True:
if pir.value() ==1:
print("Movimiento detectado, hay una persona dentro de la habitacion")
print("=====================NO PUEDE INGRESAR==========================")
time.sleep(3)
else:
print("Sin movimiento")
print("==================PUEDE INGRESAR===========================")
time.sleep(1)
return pir
#realiza la medición del nivel de agua utilizando el sensor ultrasónico.
def distance_measurement():
# Generar un pulso de 10us en el pin TRIG para iniciar la medición
trig.value(0)
utime.sleep_us(2)
trig.value(1)
utime.sleep_us(10)
trig.value(0)
# Esperar a que el pin ECHO se ponga en alto
while echo.value() == 0:
pass
pulse_start = utime.ticks_us()
# Esperar a que el pin ECHO se ponga en bajo nuevamente
while echo.value() == 1:
pass
pulse_end = utime.ticks_us()
# Calcular la duración del pulso (en microsegundos) y convertirla a distancia (en centímetros)
pulse_duration = pulse_end - pulse_start
#distance_cm = pulse_duration * 0.0343 / 2
# Calcular la velocidad del sonido en el aire (aproximadamente 343 metros por segundo a 20°C)
speed_of_sound = 34300 # en centímetros por segundo
# Calcular la distancia teniendo en cuenta la ida y vuelta del pulso ultrasónico
distance_cm = (pulse_duration * speed_of_sound) / (2 * 1000000) # Convertir de microsegundos a segundos
#if distance_cm >=45:
#sensorMovimiento()
#else:
#print("No se detecta nada")
return distance_cm
# funcion principal
def main():
#llamada a las funciones.
servoControl()
# Inicializar la clase Ultrason
ultrasonido = Ultrason()
while True:
#
func()
buttonPrecionar= boton.buttonPush()
distance_measurement()
print(("El ptenciometro hara que la lleva se abra : {} Grados ".format(servoControl())))
print("=======================================================")
print(("Distancia de la planta al agua es : {} cm ".format(Ultrason.ultra())))
print("====================================================")
distance = distance_measurement()
sensorMovimiento()
# Ajustar la distancia debido a la posición del sensor con respecto a la superficie del agua
# Si el sensor está arriba del agua, ajustar la distancia restando la altura del sensor al nivel del agua
# Si el sensor está sumergido en el agua, ajustar la distancia sumando la altura del sensor al nivel del agua
# Aquí, ajustaremos la distancia en el caso de que el sensor esté sumergido 3 cm en el agua.
sensor_height_cm = 3 # Altura del sensor sumergido en el agua
distance += sensor_height_cm
print("Nivel del agua: {:.2f} cm".format(distance))
print("=========================================================")
utime.sleep(1)
sleep(1)
main()
#Al dar vuelta al potenciometro hace girar al servo y cambia el color de las luces.