实现原理
实现原理很简单,使用k210与ESP01S进行串口通信,用串口的形式给ESP01S发送命令即可。ESP01S连接到有网络的wifi之后,该命令通过TCP发送到巴法云https://cloud.bemfa.com/。在巴法云创建账号,创建好主题
由右上角新建主题,即新建设备,如图设备命名为com002是一个灯,com003是一个风扇,com002的控制方式是打开/关闭,调节亮度/颜色。xxx00x后缀指定不一样的设备,具体可以看接入文档。
建议使用qq邮箱进行登录,登录之后可以在米家进行添加,选择连接其他平台
搜索巴法
点击即可完成设备共享,完全免费,如有同步,点击同步,则可以在米家看到同步的设备
测试ESP01S
安信可串口调试助手
链接:https://pan.baidu.com/s/1WPN9GlnDxnBB4qFTr-A7tQ?pwd=Coco
提取码:Coco
电脑端事先调试ESP01S测试通信,使用安信可串口调试助手调试ESP01S,需要用到USB to TTL
或者CH340串口下载器一个
将ESP01S连接上CH340 打开安信可串口调试助手
发送 AT 返回 OK即串口连接ESP01S成功
寻找到一个可用的wifi依次使用串口发送指令设置链接wifi
AT+CWMODE=1 设置AP模式
AT+CWJAP_DEF="MLS5434","A12345678" 设置WiFi名称和密码替换成你的
返回wifi连接成功,并且获取到了IP
AT+CIPSTART="TCP","bemfa.com",8344 使用TCP链接巴法云bemfa.com 端口8344
返回CONNECT链接成功
AT+CIPSEND=57 设置使用ESP01S发送57个字节内容
出现OK后再次将内容粘贴在输入框点击发送,即可通过ESP01S发送到巴法云控制台
内容如下
cmd=1&uid=63eaf70b147a44XXXXXXXXXXXXXXXX&topic=com002
发送成功后返回cmd=1&res=1说明订阅/上线成功,如果发送失败则再次点击TCP连接巴法云,没有发送心跳超过65秒设备会被认为不在线。
将UID部分替换成你在巴法云注册的账号私匙 com002替换成你创建的主题名称/设备名称,点击发送,即可看到巴法云上的主题被订阅/上线。
如图,上线成功。即可通过小爱同学控制数值,数值改变后将会广播到订阅/上线巴法云的设备上,即可通过串口下发到k210
k210 串口和ESP01S通信
使用k210串口和ESP01S通信,通过串口发送以上的指令到ESP01S,实现接收巴法云上的设备信息来控制一个LED灯的亮灭和亮度调节
使用k210的板载口 6,7 作为和ESP01S的串口传输
使用34号口用来输出PWM点亮LED灯和调节亮度
留有风扇PWM输出口35目前测试一块ESP01S只能接受一个主题/设备 控制 想要的拓展可以使用 两个串口拓展。
附上测试小视频
链接:https://pan.baidu.com/s/1dSNw5sOIg6hDNTgVjKyWQg?pwd=Coco
提取码:Coco
代码如下
from Maix import GPIO
from fpioa_manager import fm
from machine import Timer,PWM,UART
#led 和 风扇定义
tim1 = Timer(Timer.TIMER0, Timer.CHANNEL1, mode=Timer.MODE_PWM)
led=PWM(tim1, freq=100, duty=50, pin=34)
led.duty(0)
tim2 =Timer(Timer.TIMER0, Timer.CHANNEL2, mode=Timer.MODE_PWM)
fe=PWM(tim2, freq=100, duty=50, pin=35)
fe.duty(0)
#无线串口定义
fm.register(7, fm.fpioa.UART1_RX, force=True)
fm.register(6, fm.fpioa.UART1_TX, force=True)
uart = UART(UART.UART1, baudrate=115200,bits=8,parity=None,stop=1,timeout=2000, read_buf_len=1024)
data2=''
t0=0
UID='63eaf70b147a44xxxxxxxxxxxxxxxxx' #UID 你的私匙
wifiname='MLS5434' #wifi名称
wifipassword='A12345678' #wifi密码
com='com002' #设备号建议使用com002 如更改其他的需要修改代码91 96行发送 和106 107 115行接收
def ping0(tim): #心跳
global t0
t0+=1
if t0%30==1:
fa('AT+CIPSEND=5\r\n')
fa('ping\r\n')
def strdel(data): #接收数据清洗
if type(data)==type(''):
s=''
a=0 #s+= 控制
for i in data:
a+=1
if i=='\\':
a=-1
continue
if a:
s+=i
else:
s+=' '
return s
else:print('不是字符串')
def fa(data):
uart.write(data)
def shou():
global data2,i
data2=uart.read() #读取数据
if data2:
print('i=',i,'接收到:',end=' ')
data2=strdel(str(data2)[2:-1])
if 'ping' in data2 and 'OK' in data2:
print('心跳+1')
else:
print(data2)
time.sleep(0.2)
def l():#流程检测
global data2,i
if data2!='' and data2 != None:
if 'PSEND=5' in data2 and i<5: i=5
if 'AT ' in data2 and 'OK' in data2: i=1
if 'AT+CWMODE=1 ' in data2 and 'OK' in data2: i=2
if 'WIFI GOT IP' in data2 : i=3
if 'ERROR' in data2: i=2
#i= 3 接收到: AT+CIPSEND=5 ping busy p... link is not valid ERROR
if 'CONNECT ' in data2 and 'OK' in data2: i=4
if 'CLOSED' in data2:
print('设备下线')
i=0
if 'cmd=1&res=1' in data2:
i=6
print('设备上线')
def mw(): #控制esp发送指令
global data2,i,j
if data2:
if i==0:
fa('AT\r\n')
if i==1:
fa('AT+CWMODE=1\r\n')
if i==2:
fa('AT+CWJAP_DEF="'+wifiname+'","'+wifipassword+'"\r\n') #WIFi 连接
if i==3:
fa('AT+CIPSTART="TCP","bemfa.com",8344\r\n')
if i==4:
fa('AT+CIPSEND=57\r\n')
time.sleep(0.1)
fa('cmd=1&uid='+UID+'&topic='+com+'\r\n') #密匙
if i==5:
fa('AT+CIPSEND=57\r\n')
time.sleep(0.1)
fa('cmd=1&uid='+UID+'&topic='+com+'\r\n')
if i==6:
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PERIODIC, period=1000, callback=ping0)
j.append(i)
def runGPIO():
global data2,i
if data2:
if i==6: #
#cmd=2&uid=63eaf70Xxxxxxxxxxxxxxxxxxxxxxxxx&topic=com002&msg=on#11#813 开关/亮度/颜色
if com in data2:
if com+'&msg=on' in data2:
li=50
print('开灯')
if 'msg=on#' in data2:
li0=data2[data2.index('msg=on#')+7:]
if '#' in li0:li=eval(li0[:li0.index('#')])
else:li=eval(li0)
led.duty(li)
print(li)
if com+'&msg=off' in data2:
print('关灯')
led.duty(0)
i=0 #流程控制
j=[] #记录
fa('AT+RST\r\n')
while 1:
shou()
l()
mw()
runGPIO()