#Fundamentos de sistemas embebidos
#Integrantes: Fernandez Enzo/Guzman Gonzalo
#10/07/2024
#UNLAM
#descripcion: Un medidor de altura para control de calidad, utilizando un sensor de ultrasonidos
# con el objetivo de categorizar piezas, en base, a si cumplen con una medida
# determinada.
from hcsr04 import HCSR04
import time
import machine
import micropython
import network
from machine import Pin, SoftI2C
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
from machine import Pin,PWM
from umqtt.simple import MQTTClient
#Indicamos red WIFI y clave
ssid = 'Wokwi-GUEST'
wifipassword = ''
#Datos Server MQTT (Broker)
#Indicamos datos MQTT Broker (server y puerto)
mqtt_server = 'io.adafruit.com'
port = 1883
user = 'FLAN27' #definido en adafruit
password = 'aio_ecMc19Vvww7IPGgQYcFDTv1THRsu' #key adafruit
#Indicamos ID(unico) y topicos
client_id = 'Proyect'
topic_SENSOR = 'FLAN27/feeds/Sensor'
topic_SERVO = 'FLAN27/feeds/Servo'
topic_OF = 'FLAN27/feeds/ON/OFF'
topic_ALTURA = 'FLAN27/feeds/ALTURA'
topic_led = 'FLAN27/feeds/led'
#Definimos modo Station (conectarse a Access Point remoto)
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
#Conectamos al wifi
sta_if.connect(ssid, wifipassword)
print("Conectando")
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print("Conectado a Wifi!")
#Vemos cuales son las IP
print(sta_if.ifconfig())
ACTIVO = True
#Antes de conectarnos al broker, vamos a definir una funcion
#que sera llamada cada vez que se produzca un publish sobre
#un topico donde estamos suscriptos
def callback_sensor(topic, msg):
global ACTIVO, SERVOMEDIO
#Cuando se ejecuta esta funcion quere decir que
#hubo un mensaje nuevo en algun topico, verificamos esto
#Dado que lo que llega viene en UTF-8, lo decodificamos
#para que sea una cadena de texto regular
dato = msg.decode('utf-8')
topicrec = topic.decode('utf-8')
print("Cambio en: "+topicrec+":"+dato)
#Nos fijamos si es el topico esperado y el valor del dato
if (topicrec == topic_OF) and ("OFF" in dato):
ACTIVO = False
else:
ACTIVO = True
if topicrec == topic_SERVO:
SERVOMEDIO = dato
#Intentamos conectarnos al broker MQTT
try:
conexionMQTT = MQTTClient(client_id, mqtt_server,user=user,password=password,port=int(port))
conexionMQTT.set_callback(callback_sensor)
conexionMQTT.connect()
conexionMQTT.subscribe(topic_SERVO)
conexionMQTT.subscribe(topic_OF)
print("Conectado con Broker MQTT")
except OSError as e:
#Si fallo la conexion, reiniciamos todo
print("Fallo la conexion al Broker, reiniciando...")
time.sleep(5)
machine.reset()
Led_Rojo = Pin(33,Pin.OUT)
SERVOMEDIO=100
servo=PWM (Pin(4), freq=50)
servo.duty_u16(0)
i2c = SoftI2C(scl=Pin(22), sda=Pin(23), freq=10000) #initializing the I2C method for ESP32
lcd = I2cLcd(i2c, 0x27, 2, 16)
lcd.putstr("Buen Dia")
sensor = HCSR04(trigger_pin=12, echo_pin=14)
h=-1
while True:
try:
conexionMQTT.check_msg()
time.sleep_ms(500)
if ACTIVO == True:
Led_Rojo.value(1)
conexionMQTT.publish(topic_led,str(1))
distance = sensor.distance_cm()
if h != distance:
print('Distancia con el sensor:', distance, 'cm')
h = distance
Altura_objeto = 400 - int(h)
conexionMQTT.publish(topic_ALTURA,str(Altura_objeto))
print('Altura del objeto:', Altura_objeto, 'cm')
lcd.clear()
lcd.putstr("La altura: ")
lcd.putstr(str(Altura_objeto))
if Altura_objeto < int(SERVOMEDIO):
for i in range(0, 1800):
servo.duty_u16(i)
print("BAJO")
else:
for i in range(1800, 8000):
servo.duty_u16(i)
print("ALTO")
conexionMQTT.publish(topic_SENSOR,str(h))
mostrar = int(h)
time.sleep(10)
else:
Led_Rojo.value(0)
conexionMQTT.publish(topic_led,str(0))
lcd.clear()
lcd.putstr("APAGADO")
time.sleep(10)
except OSError as e:
print("Error ",e)
time.sleep(5)
machine.reset()