import network
import ujson
from machine import Pin, I2C
import ssd1306
from time import sleep
from umqtt.simple import MQTTClient
# Khởi tạo giao diện I2C cho màn hình OLED
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
#Kích thước màn hình OLED
oled_width = 128 #Chiều rộng 
oled_height = 64 #Chiều cao
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
# Xóa màn hình và hiển thị thông điệp khởi động
oled.fill(0)  # Xóa màn hình
oled.text('Hello, Wokwi!', 10, 10)  # Hiển thị thông điệp
oled.show()  # Cập nhật màn hình
sleep(2)  # Dừng 2 giây
oled.fill(0)  # Xóa màn hình
# Hàm xử lý tin nhắn MQTT
def mqtt_message(topic, msg): #topic : chủ đề của tin nhắn , msg: nội dung tn
    print("Incoming message:", msg)  # In ra tin nhắn nhận được
    try:
        msg = ujson.loads(msg)  # Giải mã tin nhắn JSON
        oled.text(msg, 10, 10)  # Hiển thị tin nhắn trên màn hình
        oled.show()  # Cập nhật màn hình
        sleep(2)  # Dừng 2 giây
        oled.fill(0)  # Xóa màn hình
    except Exception as e:
        print("Error:", e)  # In ra lỗi nếu có
print("Đang bắt đầu khởi động các kết nối!")
# Kết nối Wi-Fi
print("Đang kết nối WiFi...", end="")
wifi = network.WLAN(network.STA_IF)  # Khởi tạo chế độ STA (Client)
wifi.active(True)  # Bật Wi-Fi
wifi.connect("Wokwi-GUEST", "")  # Kết nối đến mạng Wi-Fi
while not wifi.isconnected():  # Chờ cho đến khi kết nối thành công
    sleep(0.5)
    print(".", end="")  # In dấu "." để chỉ trạng thái kết nối
print("kết nối thành công✔")
# Kết nối đến máy chủ MQTT
print("Đang kết nối MQTT...")
client = MQTTClient("wokwi1", "broker.hivemq.com")  # Khởi tạo client MQTT
client.set_callback(mqtt_message)  # Đặt hàm xử lý tin nhắn
try:
    client.connect()  # Kết nối đến broker MQTT
    client.subscribe("wokwi1")  # Đăng ký theo dõi chủ đề "wokwi1"
    print("Kết nối thành công ✔")
except Exception as e:
    print("Kết nối thất bại:", e)  # In ra lỗi nếu kết nối thất bại
while True:
    client.wait_msg()  # Chờ tin nhắn đến và xử lý