"""
ILI9341 demo (shapes)
https://github.com/rdagger/micropython-ili9341
"""
import network
import time
from machine import Pin, SPI
from umqtt.simple import MQTTClient
from ili9341 import Display, color565
from xglcd_font import XglcdFont
import ujson
# MQTT settings
MQTT_BROKER = 'broker.mqttdashboard.com'
MQTT_TOPIC = 'wokwi-weather'
CLIENT_ID = 'micropython-weather-demo-1'
wendy = XglcdFont('Wendy7x8.c', 7, 8)
spi = SPI(2, baudrate=32000000, sck=Pin(18), mosi=Pin(23), miso=Pin(19))
display = Display(spi, dc=Pin(33), cs=Pin(5), rst=Pin(32), rotation= 270)
# Data storage for 3 sensors
sensor_data = [{"sensor_id": 1, "temperature": 0, "humidity": 0},
{"sensor_id": 2, "temperature": 0, "humidity": 0},
{"sensor_id": 3, "temperature": 0, "humidity": 0}]
# Connect to WiFi
def connect_wifi():
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect('Wokwi-GUEST', '')
while not wifi.isconnected():
time.sleep(0.1)
print("Connected to WiFi:", wifi.ifconfig())
# MQTT connection
def connect_mqtt():
client = MQTTClient(CLIENT_ID, MQTT_BROKER)
client.set_callback(mqtt_callback)
client.connect()
client.subscribe(MQTT_TOPIC)
print("Connected to MQTT broker and subscribed to topic:", MQTT_TOPIC)
return client
# MQTT message handler
def mqtt_callback(topic, msg):
try:
# msg = msg.decode('utf-8')
print(msg.decode('utf-8'))
data = ujson.loads(msg.decode('utf-8'))
sensor_id = data.get("sensor_id")
temperature = data.get("temp")
humidity = data.get("humidity")
if 1 <= sensor_id <= 3:
sensor_data[sensor_id - 1]["temp"] = temperature
sensor_data[sensor_id - 1]["humidity"] = humidity
draw_graph()
except Exception as e:
# Code to handle the exception
print("An error occurred:", e)
# Draw data on TFT display
def draw_graph():
display.clear()
for i, data in enumerate(sensor_data):
x = 10 + i * 80 # X position for each sensor graph
temp_height = int((data["temp"] / 50) * 100) # Scale temperature to display height
hum_height = int((data["humidity"] / 100) * 100) # Scale humidity to display height
# Temperature bar in red
display.fill_rectangle(x, 120 - temp_height, 20, temp_height, color565(255, 0, 0))
display.draw_text(x, 130,"T:{:.1f}".format(data["temp"]), wendy, color565(255, 255, 255))
# Humidity bar in blue
display.fill_rectangle(x + 30, 120 - hum_height, 20, hum_height, color565(0, 0, 255))
display.draw_text(x + 30, 130,"H:{:.1f}".format(data["humidity"]), wendy, color565(255, 255, 255))
# Sensor ID in yellow
display.draw_text(x, 150,"ID:{}".format(data["sensor_id"]), wendy, color565(255, 255, 0))
def main():
connect_wifi()
client = connect_mqtt()
display.clear()
try:
while True:
# client.check_msg() # Non-blocking check for new messages
# Blocking wait for message
client.wait_msg()
time.sleep(1)
except KeyboardInterrupt:
client.disconnect()
print("Disconnected from MQTT")
main()