"""Descripción del problema
Monitoreo de distancia: El sensor ultrasónico detecta si hay un objeto
frente al sistema (d<20cm)
Control de servomotor: Si se detecta un objeto, el servomotor gira 90
grados (simulando abrir compuerta).
Monitoreo de temperatura: El LM35 mostrara la temperatura en tiempo real y
y mostrará un led verde cuando la temperatura este por debajo de 30 centrigrado
y rojo si es mayor a 40 centrigrado
Visualización. La LCD mostrara:
Temp. Apertura de compuerta
Distancia.
"""
import machine
from machine import Pin, PWM, ADC, SoftI2C
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
from time import sleep
import utime
import math
print ("hola mundo")
def escribir_pantalla(lcd, temperatura, apertura, distancia):
"""Funcion para escribir en la pantalla lcd"""
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr(f"Temp:{temperatura:3.1f} Ap:{apertura}")
lcd.move_to(0, 1)
lcd.putstr(f"Dist:{distancia:.2f}")
def medir_distancia(trig, echo):
"""Mide la distancia mediante un sensor ultrasonico"""
trig.value(1)
utime.sleep_us(10)
trig.value(0)
t1 = utime.ticks_us()
while echo.value() == 0:
t1 = utime.ticks_us()
while echo.value() == 1:
t2 = utime.ticks_us()
t = t2-t1
d = 17*t/1000
utime.sleep_ms(500)
return d
def calcular_duty(angulo):
"""Convierte el ángulo (0-180) en el duty cycle adecuado (mín. 0.5ms, máx. 2.5ms)"""
return int(1638 + 36.4 * angulo)
def verificar_apertura(distancia):
"""verifica la apertura de la compuerta"""
if distancia < 20:
return 1
else:
return 0
def medir_temperatura(sensor):
"""mide la temperatura"""
BETA = 3950
analog_value = sensor.read_u16()
celsius = 1 / (math.log(1 / (65535 / analog_value - 1)) / BETA + 1.0 / 298.15) - 273.15;
return celsius
#Main
#inicialización de la pantalla LCD
I2C_ADDR = 0x27
totalRows = 2
totalColumns = 16
i2c = SoftI2C(scl=Pin(1), sda=Pin(0), freq=400000) #initializing the I2C method for ESP32
lcd = I2cLcd(i2c, I2C_ADDR, totalRows, totalColumns)
#Inicializar pines para sensor ultrasonico
trig = Pin(19,Pin.OUT)
echo = Pin(18,Pin.IN)
#Inicializar pines para servomotor
pwm = PWM(Pin(17))
pwm.freq(50)
#Inicializar pines para sensor de temperatura
sensor = ADC(0)
#inicializar pines para leds
led_rojo = Pin(14, Pin.OUT)
led_verde = Pin(15, Pin.OUT)
temperatura = 100.8
apertura = None
distancia = 19.5
while True:
distancia = medir_distancia(trig, echo)
nueva_apertura = verificar_apertura(distancia)
temperatura = medir_temperatura(sensor)
if apertura != nueva_apertura:
pwm.duty_u16(calcular_duty(nueva_apertura*90))
apertura = nueva_apertura
if temperatura >= 40:
led_rojo.value(1)
led_verde.value(0)
elif temperatura <= 30:
led_rojo.value(0)
led_verde.value(1)
else:
led_rojo.value(0)
led_verde.value(0)
escribir_pantalla(lcd, temperatura, apertura, distancia)
sleep(0.5)