#25 April 2025
"""
MicroPython IoT using ESP32 +HC-SR04
To view the data:
A: Mosquitto.Org
1. Ultrasonic Distance. Go to terminal : mosquitto_sub -h test.mosquitto.org -t mkz/distance
2. Download IoT MQTT Panel for your android phone
3. Plot gauge and graph for Temperature and Humidity
B: Raspberry Pi 3 Cloud IOT
1. Install Mosquitto
2. Install Node Red
3. Install Node Red Dashboard
Now click on the HC-SR04 sensor in the simulation,
change the distance, and you should see
the message appear on the MQTT Broker, in the "Messages" pane.
C: https://testclient-cloud.mqtt.cool/
To View your Mosquitto Broker
1. set tcp://test.mosquitto.org:1883
2. Set Topic to "mkz/distance"
3. Click Subscribe
4. View Messages from your Sensor from Wokwi Project
D: View Data Using Mobile Apps (Available)
1. https://play.google.com/store/search?q=iot+mqtt+panel&c=apps
2. Install Iot MQTT Panel
3. Configure Panel
4. Display data from Sensor Realtime
Copyright (C) 2025, M Kamarul Zaman
https://wokwi.com/projects/429166796278789121
"""
import network
import time
from machine import Pin, I2C
import dht
import ujson
from umqtt.simple import MQTTClient
from hcsr04 import HCSR04
from time import sleep
from ssd1306 import SSD1306_I2C # OLED library
# Initialize OLED display
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = SSD1306_I2C(128, 64, i2c)
# MQTT Server Parameters
MQTT_CLIENT_ID = ""
MQTT_BROKER = "test.mosquitto.org"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC = "teddy/distance" # change to your topic yournick/distance
# ESP32
sensor = 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', '') # enter wifi nameID and password
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!")
prev_distance = ""
while True:
distance = sensor.distance_cm()
print('Distance:', distance, 'cm')
# Display distance on OLED
oled.fill(0) # Clear screen
oled.text("Distance:", 0, 0)
oled.text(f"{distance} cm", 0, 20)
oled.show()
sleep(1)
message = ujson.dumps(distance)
if message != prev_distance:
print("Updated!")
print("Reporting to MQTT topic {}:{} ".format(MQTT_TOPIC, message))
client.publish(MQTT_TOPIC, message)
prev_distance = message
else:
print("No change")
time.sleep(1)