【一步一步使用uPyCraft学习MicroPython之两块8266通过MQTT相互控制】 这周发生了不少大事,不是不知道、也不是不想管,只是管不了。看看MicroPython这边,大事情就是uPyCraft IDE推出了V0.20版。 上一期我们讲到,通过mqtt两块sp8266(或者esp32)都可以相互控制,那么今天我们就来试试: ESP-8266-A:将一只按钮的状态,以开关量的形式发布到mqtt服务器(本例题仍然使用tlink.io),然后在本地用一只led(绿色)来提示发送成功。 ESP-8266-B:从MQTT服务器订阅开关量消息,然后在本地判定后,控制一只LED(红色)亮灭
试验完成后,是这样的。上视频:
【硬件清单】 【软件准备】 品名 | | | | | |
| |
| |
| 需要了解mqtt物联网规约。 {"sensorDatas":[{"switcher":1}]} {"sensorDatas":[{"switcher":0}]} | |
| |
啰嗦一下mqtt的协议,这个json格式的字符串只是tlink.io的约定,是为了该网站在监控页面上展示方便,其实就本例题而言,你上送一个“1”、“0”都是没有问题的。只是,为了方便我观察在监控页面是否更新,才保留了人家的协议。这一点再次说明,在玩家玩的时候,理解即可,千万不必照抄。 【基本思路】 【硬件接线】 接线表
叠装后的esp-8266A是这样的:
旁边放一只esp32,可以比对一下尺寸。
【esp-8266A代码】
- <div align="left">from simple import MQTTClient
- from machine import Pin
- import network
- import time
- #Date:217-06-24</div><div align="left">#esp8266-A
-
-
- SSID=your SSID"
- PASSWORD="your psw"
-
- button=Pin(0,Pin.IN) #D3---d1 mini
- led=Pin(13,Pin.OUT) #D7---d1 mini
-
- SERVER = "mqtt.tlink.io"
- CLIENT_ID = "******A"
- TOPIC = b"your topic"
- username=''
- password=''
- button_state = False
- onoff=False
-
- 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 publish_but():#这是按钮发布函数,里面包括了防抖、状态反转的处理,参考了极客工坊的按钮笔记,玩家测试时可以把这段中文注释删除
- #global up_temp1
- global onoff
- if(button.value()==0):
- time.sleep_ms(10)
- if(button.value()==1):
- led.value(onoff)
- print(onoff)
- if (onoff==True):
- up_temp1="{"sensorDatas":[{"switcher":1}]}"
- else:
- up_temp1="{"sensorDatas":[{"switcher":0}]}"
- c.publish(TOPIC,up_temp1,retain= True)
- #print("Connected to %s, publish %s topic" % (server, TOPIC))
- print(up_temp1)
- onoff=not(onoff)
- time.sleep_ms(10)
- while (button.value()==1):
- time.sleep_ms(10)
-
- def setup():
- global c
- connectWifi(SSID,PASSWORD)
- server=SERVER
- c = MQTTClient(CLIENT_ID, server,1883,username,password)
- c.connect()
-
-
- def main_loop():
- while 1:
- publish_but()
-
- def teardown():
- try:
- c.disconnect()
- print("Disconnected.")
- except Exception:
- print("Couldn't disconnect cleanly.")
-
- if __name__ == '__main__':
- setup() #such as Arduino--setup()
- try:
- main_loop() #such as arduino-loop
- finally:
- teardown()
-
- </div>
复制代码
【esp8266-B代码】 - from simple import MQTTClient
- from machine import Pin
- import network
- import time
-
-
- #date:2017-06-23
- #micropython+mqtt,esp8266A-B led control
- #this program for esp-8266-B ,subscribe from tlink.io,control local led(red)
-
- SSID="your ssid"
- PASSWORD="your psw"
-
- led=Pin(14, Pin.OUT, value=0) #led pin
- SERVER = "mqtt.tlink.io"
- CLIENT_ID = "******B"
- TOPIC = b"your topic"
- username=''
- password=''
-
- def sub_cb(topic, msg):
- global state
- print((topic, msg))
- #tlink.io switch
- if msg == b"{"sensorDatas":[{"switcher":1}]}":
- led.value(1)
- #state = 0
- print("1")
- elif msg == b"{"sensorDatas":[{"switcher":0}]}":
- led.value(0)
- #state = 1
- print("0")
-
- 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 setup():
- global c
- connectWifi(SSID,PASSWORD)
- server=SERVER
- c = MQTTClient(CLIENT_ID, server,0,username,password)
- c.set_callback(sub_cb)
- c.connect()
- c.subscribe(TOPIC)
-
- def main_loop():
- while 1:
- c.wait_msg()
-
- def teardown():
- try:
- c.disconnect()
- print("Disconnected.")
- except Exception:
- print("Couldn't disconnect cleanly.")
-
- #主程序运行
- if __name__ == '__main__':
- setup() #such as arduino--setup()
- try:
- main_loop() #such as arduino-loop
- finally:
- teardown()
复制代码
【测试】 点击A板的按钮,绿色led亮起,在tlink.io上看到开关量发生变化。此刻按钮状态也随之翻转,为下一次控制做准备。B板从tlink.io订阅到了开关量的变化,经过判断之后,驱动红色led亮起。
再次点击A板按钮,绿色led灭,这时,tlink.io上看到开关量变为“OFF”。B板从tlink.io订阅到了开关量的变化,经过判断之后,驱动红色led熄灭。
【小结】 这是最简单的两块8266的应用,因为本次主要为了测试dfrobot的uPyCraft ide,所以特意选取了两块8266进行本次试验。等待dfrobot的8266 for萤火虫出品后,当然会及时跟进啦。 注意几个问题:一是两块板子clientID的选择不可以一样,否则会在订阅时出错。二是在代码编写时,尽量不要用中文注释,否则因为字库的原因,可能会导致文件很大,引起下载、运行错误,切记。 上述代码我全部亲自测试,win7 64位操作系统。
另外,在github上看到了一篇micropython的资料,很有趣是它的代码风格,结构化设置了setup(),loop(),让我这样从arduino转过来的玩家看着很亲切。 这一点见仁见智,只是我觉得代码看起来会比较结构化。也是一个习惯问题。在此也和各位玩家分享一下。并不是说这样最好,而是我们多了一种选择。 这篇资料来自: https://github.com/davea/sonoff-mqtt
感谢秦皇岛岛主、僵小懒、Andy等师兄的指导。尤其是岛主帮我测试了代码,指出了clientid的问题,让我少走很多弯路。沧海抱拳!
周末快乐! |