uPyCraft-micropython教程(dfrobot MQTT实现双向控制)

2017-07-091.4万
AI 快速预览详细 收起
本教程介绍了如何使用FireBeetle-ESP32和uPyCraft实现MQTT双向控制。通过设备A和设备B的交互,可以实现LED状态的切换和定时控制。首先,需要准备硬件平台(FireBeetle-ESP32、IO扩展板、Button模块)和软件平台(uPyCraft-V0.21)。然后,编写并运行代码,使设备A订阅TOPIC_LEDA,设备B按键后发送toggle消息,让LEDA状态反转;设备B订阅TOPIC_LEDB,设备A定时发送on/off消息,控制LEDB状态。
此实验代码有些问题,楼主调整中,请先不要测试

此实验紧接着单向控制实现,在做本实验之前,请阅读玩MQTT单向控制章节

准备工作:
硬件平台: FireBeetle-ESP32  x2
                  IO扩展板               x1
                  Button模块           x1

软件平台: uPyCraft-V0.21
物联网网站:https://iot.dfrobot.com.cn

本实验实现的效果
设备A订阅TOPIC_LEDA,设备B按键后向这个设备A发送toggle消息,让LEDA状态反转
设备B订阅TOPIC_LEDB,设备A定时向设备B发送on off消息,控制LEDB状态
从而实现双向控制

开始干活:
  第一步,第二步,第三步:和上次实验相同,申请两个TOPIC,一个LED_A,一个LED_B
uPyCraft-micropython教程(dfrobot MQTT实现双向控制)图1

  第四步:
    设备A执行下面代码[mw_shl_code=python,true]from umqtt.simple import MQTTClient
from machine import Pin,Timer
import network
import time

SSID="DFROBOT_AP"
PASSWORD="12345678"

led=Pin(2, Pin.OUT, value=0)
tim = Timer(-1)

SERVER = "182.254.130.180"
CLIENT_ID = "S1grx_VmNW1"
TOPIC = b"B1rl_47NZ"
username='H1UGxqD4-'
password='BkeLGeqvVb'
stateA = 0
stateB = 0
def sub_cb(topic, msg):
    global state
    print((topic, msg))
    if msg == b"on":
            led.value(0)
            stateA = 0
            print("1")
    elif msg == b"off":
            led.value(1)
            stateA = 1
            print("0")
    elif msg == b"toggle":
            # LED is inversed, so setting it to current state
            # value will make it toggle
            led.value(stateA)
            stateA = 1 - stateA
def connectWifi(ssid,passwd):
  global wlan
  wlan=network.WLAN(network.STA_IF)
  wlan.active(True)
  wlan.disconnect()
  wlan.connect(ssid,passwd)
  while(wlan.ifconfig()[0]=='0.0.0.0'):
    time.sleep(1)

def timerOnOff(t):
  global stateB,c
  if(stateB == 1):
    c.publish(TOPIC_LEDB, b'on')
    stateB = 0
  else:
    c.publish(TOPIC_LEDB, b'off')
    stateB = 1

connectWifi(SSID,PASSWORD)
server=SERVER
c = MQTTClient(CLIENT_ID, server,0,username,password)
c.set_callback(sub_cb)
c.connect()
c.subscribe(TOPIC)
print("Connected to %s, subscribed to %s topic" % (server, TOPIC))
tim.init(period=3000, mode=Timer.PERIODIC, callback=timerOnOff)
try:
  while 1:
    c.wait_msg()
finally:
  c.disconnect()
  tim.deinit()

[/mw_shl_code]
    设备B执行下面代码
[mw_shl_code=python,true]from umqtt.simple import MQTTClient
from machine import Pin,Timer
import network
import time

SSID="DFROBOT_AP"
PASSWORD="12345678"

SERVER = "182.254.130.180"
CLIENT_ID = "S1grx_VmNW2"
TOPIC_LEDA = b"B1rl_47NZ"
TOPIC_LEDB = b'S1LowEX4b'
username='H1UGxqD4-'
password='BkeLGeqvVb'
stateA = 0
stateB = 0
def sub_cb(topic, msg):
    global state
    print((topic, msg))
    if msg == b"on":
            led.value(0)
            stateB = 0
            print("1")
    elif msg == b"off":
            led.value(1)
            stateB = 1
            print("0")
    elif msg == b"toggle":
            # LED is inversed, so setting it to current state
            # value will make it toggle
            led.value(stateB)
            stateB = 1 - stateB

def buttonFunc(v):
  global c
  time.sleep_ms(50)
  if(button.value() == 0):
    return
  while(button.value() == 1):
    time.sleep_ms(100)
  time.sleep_ms(100)
  c.publish(TOPIC_LEDA,b'toggle')


def connectWifi(ssid,passwd):
  global wlan
  wlan=network.WLAN(network.STA_IF)
  wlan.active(True)
  wlan.disconnect()
  wlan.connect(ssid,passwd)
  while(wlan.ifconfig()[0]=='0.0.0.0'):
    time.sleep(1)

connectWifi(SSID,PASSWORD)
server=SERVER
c = MQTTClient(CLIENT_ID, server,0,username,password)
c.set_callback(sub_cb)
c.connect()
c.subscribe(TOPIC)
print("Connected to %s, subscribed to %s topic" % (server, TOPIC_LEDB))
button = Pin(25, Pin.IN)
button.irq(trigger=Pin.IRQ_RISING, handler=buttonFunc
try:
  while 1:
    c.wait_msg()
finally:
  c.disconnect()
[/mw_shl_code]
第五步:设备A执行代码,设备B执行代码,与预期结果相同

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(0)
- 没有更多了 -