from machine import Pin
import time
from umqtt.simple import MQTTClient
import ujson
import network
DEVICE_ID = "user22"
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""
MQTT_BROKER = "broker.hivemq.com" #"broker.mqttdashboard.com"
MQTT_CLIENT = DEVICE_ID
MQTT_TELEMETRY_TOPIC = "iot/telemetry"
MQTT_CONTROL_TOPIC = "iot/control"
btn_red = Pin(2, Pin.IN)
led_red = Pin(6, Pin.OUT)
btn_green = Pin(3, Pin.IN)
led_green = Pin(4, Pin.OUT)
def did_receive_callback(topic, message):
print('\n\nData Received! \ntopic = {0}, message = {1}'.format(topic, message))
if topic == MQTT_CONTROL_TOPIC.encode():
if message == ('{0}/lamp/red/on'.format(DEVICE_ID)).encode():
led_red.on()
elif message == ('{0}/lamp/red/off'.format(DEVICE_ID)).encode():
led_red.off()
elif message == ('{0}/lamp/green/on'.format(DEVICE_ID)).encode():
led_green.on()
elif message == ('{0}/lamp/green/off'.format(DEVICE_ID)).encode():
led_green.off()
elif message == ('{0}/lamp/on'.format(DEVICE_ID)).encode() or message == b'lamp/on':
led_red.on()
led_green.on()
elif message == ('{0}/lamp/off'.format(DEVICE_ID)).encode() or message == b'lamp/off':
led_red.off()
led_green.off()
elif message == ('{0}/status'.format(DEVICE_ID)).encode() or message == ('status').encode():
global telemetry_data_old
mqtt_client_publish(MQTT_TELEMETRY_TOPIC, telemetry_data_old)
else:
return
send_led_status()
def mqtt_connect():
print("Connecting to MQTT broker ...", end="")
mqtt_client = MQTTClient(MQTT_CLIENT, MQTT_BROKER, user="", password="")
mqtt_client.set_callback(did_receive_callback)
mqtt_client.connect()
print("Connected.")
mqtt_client.subscribe(MQTT_CONTROL_TOPIC)
return mqtt_client
def create_json_data(red_led_state, green_led_state):
data = ujson.dumps({
"device_id": DEVICE_ID,
"RED_LED": red_led_state,
"GREEN_LED": green_led_state,
"type": "sensor"
})
return data
def mqtt_client_publish(topic, data):
print("\nUpdating MQTT Broker...")
mqtt_client.publish(topic, data)
print(data)
def send_led_status():
data = ujson.dumps({
"device_id": DEVICE_ID,
"red_led": "ON" if led_red.value() == 1 else "OFF",
"green_led": "ON" if led_green.value() == 1 else "OFF",
"type": "lamp"
})
mqtt_client_publish(MQTT_TELEMETRY_TOPIC, data)
wifi_client = network.WLAN(network.STA_IF)
wifi_client.active(True)
print("Connecting device to WiFi")
wifi_client.connect(WIFI_SSID, WIFI_PASSWORD)
while not wifi_client.isconnected():
print("Connecting")
time.sleep(0.1)
print("WiFi Connected!")
print(wifi_client.ifconfig())
mqtt_client = mqtt_connect()
led_red.off()
led_green.off()
mqtt_client_publish(MQTT_CONTROL_TOPIC, 'lamp/off')
telemetry_data_old = ""
led_red_state = led_red.value()
led_green_state = led_green.value()
last_button_red_state = 0
last_button_green_state = 0
print("last_button_red_state = ", last_button_red_state, "led_red_state = ", led_red_state)
print("last_button_green_state = ", last_button_green_state, "led_green_state = ", led_green_state)
while True:
mqtt_client.check_msg()
print(". ", end="")
current_button_red_state = btn_red.value()
if current_button_red_state != last_button_red_state:
print("current_button_red_state = ", current_button_red_state, "led_red_state = ", led_red_state)
if current_button_red_state ==1:
if red_led_state ==0:
led_red_on()
print("RED LED ON")
else:
led_red_off()
print("RED LED OFF")
led_red_state = led_red.value()
last_button_red_state = current_button_red_state
print("last_button_red_state =", last_button_red_state)
print(led_red_state)
current_button_green_state = btn_green.value()
if current_button_green_state != last_button_green_state:
print("current_button_green_state = ", current_button_green_state, "led_green_state = ", led_green_state)
if current_button_green_state ==1:
if green_led_state ==0:
led_green_on()
print("GREEN LED ON")
else:
led_green_off()
print("GREEN LED OFF")
led_green_state = led_green.value()
last_button_green_state = current_button_green_state
print("last_button_green_state =", last_button_green_state)
print(led_green_state)
telemetry_data_new = create_json_data(led_red_state, led_green_state)
if telemetry_data_new != telemetry_data_old:
mqtt_client_publish(MQTT_TELEMETRY_TOPIC, telemetry_data_new)
telemetry_data_old = telemetry_data_new
time.sleep(0.5)
Loading
esp32-c3-devkitm-1
esp32-c3-devkitm-1