1780浏览
查看: 1780|回复: 1

[项目分享] 【Maixpy】手机小爱同学控制K210灯

[复制链接]
本帖最后由 我朝女王扔石头 于 2021-3-30 23:07 编辑

【项目描述】
手机小爱同学控制K210灯的亮暗,蛮久之前就想用K210实现了,但是上网查了一下代码基本都是Arduino的,好吧只能自己查资料解决了

【项目需要】
有小爱同学的手机、烧了maixpy的K210板子、物联网模块(这里我用的是ESP8285)

【项目步骤一:创建巴法云物联网平台账号】
小米的小爱可以外接的设备平台有很多,这里我就选了一个巴法云物联网平台,网址为  https://cloud.bemfa.com/
SunMarch-202103283198..png

运行微信登陆,登陆后还要绑定下邮箱,因为等下小米的小爱接入时要求使用邮箱登陆该平台
SunMarch-202103286170..png
再次强度,如果要接入小爱,那么主题名称的结尾一定要002结尾,因为巴法云文档里面写了如下,对于本次的灯类型设备,末尾要002结尾
SunMarch-202103281854..png
然后学习一下啥叫主题、订阅、发布,文档里面是这样描述的:
SunMarch-202103285912..png
也就是把客户端、服务器又简化为类似微信公众号发布消息的架构
那么我们这次实现的逻辑就是K210订阅刚才创建的主题,然后小爱同学根据指令向主题发布消息,该消息会经主题中转又被K210接受到,这样一来一回依靠这个中间巴法云平台就实现了小爱控制K210的功能了

【项目步骤二:K210订阅、接受主题消息】


第一步是先将K210连接上WIFI
SunMarch-202103281224..png
这里ESP8285()是我自己封装的一个类,底层是使用了network
网址是https://cn.maixpy.sipeed.com/zh/api_reference/machine/network.html

第二步是设置主题的一些信息
SunMarch-202103287293..png
这里uid就是
SunMarch-202103283737..png
想要订阅主题,巴法云物联网文档里面写了可以使用TCP/IP接入或者http API接入,我对比了一下觉得还是用http接入可以方便 SunMarch-202103285483..png
之后就容易了,导入urequest库,该库固件里面是没有的,需要自己在导入进入
https://github.com/micropython/m ... quests/urequests.py把这个urequests.py文件写入到自己的k210上就行了
SunMarch-202103286086..png
程序如下:
SunMarch-202103289173..png
返回值r是response类对象,使用text方法获取字符型结果,然后用json变为python的数据类型(字典类型),
结果如下:{'code': '40220', 'topic': 'light002', 'data': [{'msg': 'off', 'time': '2021-03-28 21:20:13'}], 'status': 'getok'}
然后就套娃出我们需要的信息,就是data里面msg内容,注意data的值是一个数组,因为一次可以接受多条消息,这里我们参数设定了每次只接受一条消息有了msg信息,我们就可以根据msg内容对灯进行控制啦。






---------------------------------------------------------------------------------------------------
整个程序代码如下:
#连接小爱同学
from my_device import ESP8285
import socket
import urequests
import ujson
from my_device import LED
import time

#连接WIFI
SSID = "test"
PASW = "caiqidongdad"
wifi = ESP8285()
wifi.connect_wlan(SSID,PASW)
print('network state:', wifi.isconnected(), wifi.ifconfig())

#设定TOPIC
topic="light002"
uid="afbeda8dcb7daa4cb6bcb41446a1c316"
url='http://api.bemfa.com/api/device/v1/data/3/get/'  #注意maixpy没有ussl模块,不能处理https协议
method = "GET"
url = url + "?uid={0}&topic={1}".format(uid,topic) #没有填num参数,默认接受1条信息

#初始化LED灯对象
led = LED()

while True:
    try:
        r = urequests.request(method=method,url=url)
        msg = ujson.loads(r.text)
    except:
        continue
    msg = msg['data'][0]['msg']
    print(msg)
    if msg == 'off':
        led.set_led_r(LED.OFF)
    elif msg == 'on':
        led.set_led_r(LED.ON)
    time.sleep_ms(100)

---------------------------------------------------------------------------------------------------
测试一下能不能接受到主题中数据,可以通过点击推送消息修改主题里面的数值
SunMarch-202103284771..png



【项目步骤三:将小爱同学关联上刚才创建的主题
1.打开米家->我的->其他平台设备,在里面众多的平台中找到巴法(尼玛没有搜索就离谱,找了半天)
SunMarch-202103282681..png
2.进入后点击同步设备(应该需要你邮箱登入),如果你刚才创建的主题名称末尾是002结尾的话,应该会出现一个灯(下图中的传感器不用管,这是我创建的另一个主题) SunMarch-202103281725..png
3.OK最后一步了,大喊小爱同学,开灯,小爱接受到指令后应该会出现下面的指令已发送
SunMarch-202103287110..png
然后去看看我们的主题,发现主题里面数据变为了on
SunMarch-202103282538..png
同理,如果你喊关灯的话,主题里面数据就变为off,
其他的一些指令如下:
SunMarch-202103284140..png
到这里为止,如果你K210中对接收到的数据进行了分析处理,比如接收到on就亮灯,那么你的小爱应该可以控制K210的灯了



【项目改进】
我在运行时发现,程序有时会在r = urequests.request(method=method,url=url)r.text中运行蛮久,导致产生蛮大的延时效果,就小爱发出信号后K120半天才反应过来,很难受。
该问题是因为GET请求接收数据时,会出现不稳定的掉包啥的导致接收数据不完整或者网络不稳定,导致程序一直在等待数据全部被接收。

解决方法是增加一个最大请求时间或者改为非堵塞传输,python3中request函数是有outtime参数的,但是micpython的request函数并没有该参数,由于request是socket封装过来的,我们只需在urequest.py中对socket对象添加最大延时时间就行
修改urequest.py中的内容如下,这里我设置最大时间为1s
SunMarch-202103288705..png


empty  版主

发表于 2021-3-29 14:47:31

牛哇~我顶一顶
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail