"""
实时上报真实数据版
LED1 = GPIO14 【正常接法】
LED2 = GPIO25 【正常接法】
DHT22 = GPIO4
Trig=18 Echo=19
"""
import network
import time
from machine import Pin
import dht
import ujson
from umqtt.simple import MQTTClient
# MQTT
MQTT_CLIENT_ID = "wokwi-esp32-final"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_TOPIC_WEATHER = "wokwi-weather"
MQTT_TOPIC_LED_STATE = "wokwi-led/state"
MQTT_TOPIC_LED_SET = "wokwi-led/set"
MQTT_TOPIC_LED2_STATE = "wokwi-led2/state"
MQTT_TOPIC_LED2_SET = "wokwi-led2/set"
# 硬件引脚
sensor = dht.DHT22(Pin(4))
led1 = Pin(14, Pin.OUT) # 正常接法
led2 = Pin(25, Pin.OUT) # 正常接法
trig = Pin(18, Pin.OUT)
echo = Pin(19, Pin.IN)
led1_state = False
led2_state = False
# LED1 正常亮灭(取消反接!)
def set_led1(state):
global led1_state
led1_state = state
led1.value(state)
try:
client.publish(MQTT_TOPIC_LED_STATE, ujson.dumps({"led": state}))
except:
pass
# LED2 正常亮灭
def set_led2(state):
global led2_state
led2_state = state
led2.value(state)
try:
client.publish(MQTT_TOPIC_LED2_STATE, ujson.dumps({"led2": state}))
except:
pass
# 超声波
def read_distance():
trig.value(0)
time.sleep_us(2)
trig.value(1)
time.sleep_us(10)
trig.value(0)
timeout = 0
while echo.value() == 0 and timeout < 10000:
timeout += 1
if timeout >= 10000:
return -1
start = time.ticks_us()
while echo.value() == 1 and timeout < 10000:
timeout += 1
end = time.ticks_us()
return round((end - start) * 0.034 / 2, 1)
# MQTT指令
def mqtt_callback(topic, msg):
try:
cmd = ujson.loads(msg.decode()).get("command", "").lower()
t = topic.decode()
if t == MQTT_TOPIC_LED_SET:
if cmd == "on": set_led1(True)
elif cmd == "off": set_led1(False)
elif cmd == "toggle": set_led1(not led1_state)
if t == MQTT_TOPIC_LED2_SET:
if cmd == "on": set_led2(True)
elif cmd == "off": set_led2(False)
elif cmd == "toggle": set_led2(not led2_state)
except:
pass
# WiFi
print("Connecting WiFi...")
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.connect("Wokwi-GUEST", "")
while not sta.isconnected():
time.sleep(0.2)
print("WiFi OK")
# MQTT
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER)
client.set_callback(mqtt_callback)
client.connect()
client.subscribe(MQTT_TOPIC_LED_SET)
client.subscribe(MQTT_TOPIC_LED2_SET)
print("MQTT OK")
set_led1(False)
set_led2(False)
# 主循环:实时读取 + 实时上报
while True:
client.check_msg()
# 读取真实传感器数据
try:
sensor.measure()
t = sensor.temperature()
h = sensor.humidity()
except:
t = -1
h = -1
try:
d = read_distance()
except:
d = -1
# 距离自动控制灯
if d > 0:
if d < 20:
set_led1(True)
set_led2(True)
elif d < 50:
set_led1(True)
set_led2(False)
else:
set_led1(False)
set_led2(False)
# 每秒上传真实数据(不是固定值!)
data = {
"temp": round(t, 1),
"humidity": round(h, 1),
"distance": d
}
client.publish(MQTT_TOPIC_WEATHER, ujson.dumps(data))
print("📤 实时数据 →", data)
time.sleep(1)