12511浏览
查看: 12511|回复: 3

[uPyCraft IDE] 一步一步使用uPyCraft学习MicroPython之两块8266通过MQTT相互控制

[复制链接]
【一步一步使用uPyCraft学习MicroPython之两块8266通过MQTT相互控制】
    这周发生了不少大事,不是不知道、也不是不想管,只是管不了。看看MicroPython这边,大事情就是uPyCraft IDE推出了V0.20版。
上一期我们讲到,通过mqtt两块sp8266(或者esp32)都可以相互控制,那么今天我们就来试试:
ESP-8266-A:将一只按钮的状态,以开关量的形式发布到mqtt服务器(本例题仍然使用tlink.io),然后在本地用一只led(绿色)来提示发送成功。
ESP-8266-B:从MQTT服务器订阅开关量消息,然后在本地判定后,控制一只LED(红色)亮灭

试验完成后,是这样的。上视频:



【硬件清单】
  品名
数量
备注
D1 mini pro
2
Esp8266-12F的core
D1 mini button 扩展板
1

led
2
红色、绿色各一  
杜邦线
7

【软件准备】
  
品名
  
版本
备注
uPyCraft
V0.20
DF出品MicroPython IDE


mqtt.tlink.io

需要了解mqtt物联网规约。
  
{"sensorDatas":[{"switcher":1}]}
  
{"sensorDatas":[{"switcher":0}]}
MQTT client 示例代码

dfrobot
啰嗦一下mqtt的协议,这个json格式的字符串只是tlink.io的约定,是为了该网站在监控页面上展示方便,其实就本例题而言,你上送一个“1”、“0”都是没有问题的。只是,为了方便我观察在监控页面是否更新,才保留了人家的协议。这一点再次说明,在玩家玩的时候,理解即可,千万不必照抄。
【基本思路】
3.PNG
【硬件接线】
接线表

  
  
名称
pin
Esp8266-A
Button
D3(gpio0)

led
D7(gpio13)
Esp8266-B
Led(red)
D5(gpio14)

叠装后的esp-8266A是这样的:
4.jpg
1.png


旁边放一只esp32,可以比对一下尺寸。

【esp-8266A代码】
  1. <div align="left">from simple import MQTTClient
  2. from machine import Pin
  3. import network
  4. import time
  5. #Date:217-06-24</div><div align="left">#esp8266-A
  6. SSID=your SSID"
  7. PASSWORD="your psw"
  8. button=Pin(0,Pin.IN) #D3---d1 mini
  9. led=Pin(13,Pin.OUT)   #D7---d1 mini
  10. SERVER = "mqtt.tlink.io"
  11. CLIENT_ID = "******A"
  12. TOPIC = b"your topic"
  13. username=''
  14. password=''
  15. button_state = False
  16. onoff=False
  17. def connectWifi(ssid,passwd):
  18.   global wlan
  19.   wlan=network.WLAN(network.STA_IF)
  20.   wlan.active(True)
  21.   wlan.disconnect()
  22.   wlan.connect(ssid,passwd)
  23.   while(wlan.ifconfig()[0]=='0.0.0.0'):
  24.     time.sleep(1)
  25. def publish_but():#这是按钮发布函数,里面包括了防抖、状态反转的处理,参考了极客工坊的按钮笔记,玩家测试时可以把这段中文注释删除
  26.   #global up_temp1
  27.   global onoff
  28.   if(button.value()==0):  
  29.     time.sleep_ms(10)   
  30.     if(button.value()==1):
  31.       led.value(onoff)
  32.       print(onoff)
  33.       if (onoff==True):
  34.         up_temp1="{"sensorDatas":[{"switcher":1}]}"
  35.       else:
  36.         up_temp1="{"sensorDatas":[{"switcher":0}]}"
  37.       c.publish(TOPIC,up_temp1,retain= True)
  38.       #print("Connected to %s, publish %s topic" % (server, TOPIC))
  39.       print(up_temp1)
  40.       onoff=not(onoff)
  41.       time.sleep_ms(10)
  42.       while (button.value()==1):
  43.         time.sleep_ms(10)
  44. def setup():
  45.     global c
  46.     connectWifi(SSID,PASSWORD)  
  47.     server=SERVER
  48.     c = MQTTClient(CLIENT_ID, server,1883,username,password)
  49.     c.connect()
  50. def main_loop():
  51.   while 1:
  52.     publish_but()
  53. def teardown():
  54.   try:
  55.       c.disconnect()
  56.       print("Disconnected.")
  57.   except Exception:
  58.       print("Couldn't disconnect cleanly.")
  59. if __name__ == '__main__':
  60.   setup() #such as Arduino--setup()
  61.   try:
  62.       main_loop() #such as arduino-loop
  63.   finally:
  64.       teardown()
  65. </div>
复制代码

【esp8266-B代码】
  1. from simple import MQTTClient
  2. from machine import Pin
  3. import network
  4. import time
  5. #date:2017-06-23
  6. #micropython+mqtt,esp8266A-B led control
  7. #this program for esp-8266-B ,subscribe from tlink.io,control local led(red)
  8. SSID="your ssid"
  9. PASSWORD="your psw"
  10. led=Pin(14, Pin.OUT, value=0)  #led pin
  11. SERVER = "mqtt.tlink.io"
  12. CLIENT_ID = "******B"
  13. TOPIC = b"your topic"
  14. username=''
  15. password=''
  16. def sub_cb(topic, msg):
  17.     global state
  18.     print((topic, msg))
  19.     #tlink.io switch
  20.     if msg == b"{"sensorDatas":[{"switcher":1}]}":
  21.             led.value(1)
  22.             #state = 0
  23.             print("1")
  24.     elif msg == b"{"sensorDatas":[{"switcher":0}]}":
  25.             led.value(0)
  26.             #state = 1
  27.             print("0")
  28. def connectWifi(ssid,passwd):
  29.   global wlan
  30.   wlan=network.WLAN(network.STA_IF)
  31.   wlan.active(True)
  32.   wlan.disconnect()
  33.   wlan.connect(ssid,passwd)
  34.   while(wlan.ifconfig()[0]=='0.0.0.0'):
  35.     time.sleep(1)
  36. def setup():
  37.     global c
  38.     connectWifi(SSID,PASSWORD)
  39.     server=SERVER
  40.     c = MQTTClient(CLIENT_ID, server,0,username,password)
  41.     c.set_callback(sub_cb)
  42.     c.connect()
  43.     c.subscribe(TOPIC)
  44. def main_loop():
  45.     while 1:
  46.         c.wait_msg()
  47. def teardown():
  48.     try:
  49.         c.disconnect()
  50.         print("Disconnected.")
  51.     except Exception:
  52.         print("Couldn't disconnect cleanly.")
  53. #主程序运行  
  54. if __name__ == '__main__':
  55.   setup() #such as arduino--setup()
  56.   try:
  57.       main_loop() #such as arduino-loop
  58.   finally:
  59.       teardown()
复制代码
【测试】
点击A板的按钮,绿色led亮起,在tlink.io上看到开关量发生变化。此刻按钮状态也随之翻转,为下一次控制做准备。B板从tlink.io订阅到了开关量的变化,经过判断之后,驱动红色led亮起。

再次点击A板按钮,绿色led灭,这时,tlink.io上看到开关量变为“OFF”。B板从tlink.io订阅到了开关量的变化,经过判断之后,驱动红色led熄灭。

2.png
【小结】
   这是最简单的两块8266的应用,因为本次主要为了测试dfrobot的uPyCraft ide,所以特意选取了两块8266进行本次试验。等待dfrobot的8266 for萤火虫出品后,当然会及时跟进啦。
注意几个问题:一是两块板子clientID的选择不可以一样,否则会在订阅时出错。二是在代码编写时,尽量不要用中文注释,否则因为字库的原因,可能会导致文件很大,引起下载、运行错误,切记。
上述代码我全部亲自测试,win7 64位操作系统。

另外,在github上看到了一篇micropython的资料,很有趣是它的代码风格,结构化设置了setup(),loop(),让我这样从arduino转过来的玩家看着很亲切。
这一点见仁见智,只是我觉得代码看起来会比较结构化。也是一个习惯问题。在此也和各位玩家分享一下。并不是说这样最好,而是我们多了一种选择。
这篇资料来自:
https://github.com/davea/sonoff-mqtt

感谢秦皇岛岛主、僵小懒、Andy等师兄的指导。尤其是岛主帮我测试了代码,指出了clientid的问题,让我少走很多弯路。沧海抱拳!

周末快乐!

Zeyo_Pendragon  高级技师

发表于 2017-6-24 19:50:17

跟紧大神脚步,好好学习
回复

使用道具 举报

lkl0305  中级技师

发表于 2017-6-24 22:52:13

予人玫瑰,手留余香
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail