之前写过一个WiFi插座的制作方法,用的是Node的固件,然后是Lua来写的应用,稳定性也还可以,但就是开发不是很通用,Lua用起来也不顺手,开发环境也比较差,其实还有另一个比较好用的开发语言,那就是Python。对于Linux来说,Python不要太好用,对ESP8266来说,跑Python不现实,但有一个特别用于嵌入式的MicroPython就比较合适,既可以保留Python的编程习惯,又可以很好地使用并控制单片机,说到这里,就拿这个东西来做一个WiFi插座吧。
这里主要讲一下原理和代码,对于实物我就不进行制作了,其实就是加一个继电器的事,我们就定义GPIO2和GPIO4是两个继电器的驱动信号源,如果出高电平就代表打开继电器,如果出低电平就代表关闭继电器。平台还是使用贝壳物联的。
第一步是下载MicroPython的固件,传送门,可以根据自己Flash的大小选择合适的固件
下载完之后,还需要到乐鑫官网下载烧录工具,传送门,固件的烧录方法参考我之前的帖子传送门,如果之前有固件的话,烧录前必须执行一次整片擦除操作,否则有可能固件不能正常启动。
下面我们就要进行Micropython的编程阶段了,编程工具多种多样,可以使用记事本来写,也可以使用VIM来写,当然,也可以使用Pycharm,我们写的程序比较小,推荐使用notepad++来写就可以了,代码如下
import machine
import esp
import time
from machine import ADC
from machine import Pin
from machine import Timer
import esp
import network
import socket
import ujson
p0 = Pin(2,Pin.OUT)
p1 = Pin(4,Pin.OUT)
s = socket.socket()
machine.freq(80000000)
print(machine.freq())
cnt = 1
cnt_heart = 1
def System_restart():
print('Restart System...')
machine.reset()
def Heart_Bit(s):
try:
s.send(heart_bit)
except:
print("Heart Beat Err")
def Start_socket():
list = ""
addr = ('121.42.180.30',8181)#贝壳物联的IP地址和商品号
command = b'{"M":"checkin","ID":"xxx1","K":"xxx2"}\n'#xxx1改成自己的ID号,xxx2改成自己的API Key
heart_bit = b'{"M":"b"}\n'
device_status = b'{"M":"status"}\n'
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.connect(addr)
s.settimeout(1)#socket超时时间设置1秒,使所有命令的响应时间尽量不超过1秒
global cnt , cnt_heart
time.sleep_ms(500)
str = s.recv(100)
print(str)
de_com = ujson.loads(str)
cmd = de_com['M']
if cmd != 'WELCOME TO BIGIOT':
System_restart()
time.sleep(3)
try:
s.send(command)
time.sleep(2)
str = s.recv(100)
print(str)
de_com = ujson.loads(str)
cmd = de_com['M']
if cmd != 'checkinok':
System_restart()
except:
machine.reset()
tm = Timer(-1)
def func(t):
global cnt , cnt_heart
print(cnt)
print(cnt_heart)
cnt=1024
cnt_heart +=1024
tm.init(period = 12000 , mode = Timer.PERIODIC , callback=func)
while True:
try:
time.sleep(0.2)
comm = s.recv(100)
de_com = ujson.loads(comm)
if (de_com['M']=='say') and (de_com['ID']=='xxxx') and (de_com['NAME']=='xxxxxxx'):#同理修改两个XXX字符串,如果不知道怎么改,可以把后面两个判断条件删掉,也可以使用
cmd = de_com['C']
print(cmd)
if cmd == 'up':
p0.on()
elif cmd == 'down':
p0.off()
elif cmd == 'right':
p1.on()
elif cmd == 'left':
p1.off()
cnt +=1
except:
if cnt>=1024:
cnt = 0
try:
s.send(device_status)
time.sleep(0.2)
str = s.recv(100)
print(str)
de_com = ujson.loads(str)
cmd = de_com['M']
if (cmd != 'checked') and (cmd != 'say'):
break
except:
print("Data Err...")
if cnt_heart>=3072:
cnt_heart = 0
try:
print("call back 2 working...")
s.send(heart_bit)
except:
print("Data Err...\r\n Reset System...")
break
time.sleep(0.2)
def do_connect():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect('SSID','password')
while not wlan.isconnected():
print('Try again')
time.sleep_ms(500)
pass
print('network config:',wlan.ifconfig())
while True:
p0.on()
p1.off()
time.sleep(0.1)
p0.off()
p1.on()
time.sleep(0.1)
print('Switch '+ str(cnt) +' times')
cnt +=1
do_connect()
Start_socket()
s.close()
把这个代码烧进ESP8266芯片内,(代码烧录的方法参考我另一个帖子,传送门)我们就可以把贝壳物联上控制我们的开发板做出相应的动作,上箭头是开继电器1,下箭头是关继电器1,右箭头是开继电器2,左箭头是关继电器2