from machine import PWM, Pin
from time import sleep
from hcsr04 import HCSR04
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
from machine import Pin, I2C
import ujson
import network
import time
from umqtt.simple import MQTTClient
# Constants
frequency = 5000
threshold_distance = 250
MQTT_CLIENT_ID = "micropython-distance-sensor"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC = "wokwi-distancee"
led = PWM(Pin(2), frequency)
led.duty(0)
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000)
lcd = I2cLcd(i2c, 0x27, 2, 16)
sensor1 = HCSR04(trigger_pin=5, echo_pin=18, echo_timeout_us=100000)
print("Connecting to WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Connected!")
print("Connecting to MQTT server... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.connect()
print("Connected!")
while True:
try:
distance = sensor1.distance_cm()
if distance < threshold_distance:
duty_cycle = int((1 - (distance / threshold_distance)) * 1023)
led.duty(duty_cycle)
led_state = "ON"
else:
led.duty(0)
led_state = "OFF"
lcd.clear()
lcd.putstr("Distance:\n{} cm".format(distance)) # Display distance on the LCD
print('Distance:', distance, 'cm')
print('LED State:', led_state)
message = ujson.dumps({
"distance": distance,
"led_state": led_state
})
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message))
client.publish(MQTT_TOPIC, message)
sleep(0.5)
except Exception as e:
print("Error:", e)
lcd.clear()
lcd.putstr("Error reading\nsensor")
sleep(1)