一步一步使用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(红色)亮灭试验完成后,是这样的。上视频:http://player.youku.com/player.php/sid/XMjg0NTA4MzQyMA==/v.swf
【硬件清单】
品名数量备注
D1 mini pro 2Esp8266-12F的core
D1 mini button 扩展板1
led2红色、绿色各一
杜邦线7
【软件准备】
品名版本备注
uPyCraftV0.20DF出品MicroPython IDE
mqtt.tlink.io
需要了解mqtt物联网规约。{"sensorDatas":[{"switcher":1}]}{"sensorDatas":[{"switcher":0}]}
MQTT client 示例代码
dfrobot
啰嗦一下mqtt的协议,这个json格式的字符串只是tlink.io的约定,是为了该网站在监控页面上展示方便,其实就本例题而言,你上送一个“1”、“0”都是没有问题的。只是,为了方便我观察在监控页面是否更新,才保留了人家的协议。这一点再次说明,在玩家玩的时候,理解即可,千万不必照抄。【基本思路】
【硬件接线】接线表
名称pin
Esp8266-AButtonD3(gpio0)
ledD7(gpio13)
Esp8266-BLed(red)D5(gpio14)
叠装后的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'):
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'):
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的问题,让我少走很多弯路。沧海抱拳!
周末快乐! 跟紧大神脚步,好好学习 予人玫瑰,手留余香
页:
[1]