ESP8266制作WiFi插座

之前写过一个WiFi插座的制作方法,用的是Node的固件,然后是Lua来写的应用,稳定性也还可以,但就是开发不是很通用,Lua用起来也不顺手,开发环境也比较差,其实还有另一个比较好用的开发语言,那就是Python。对于Linux来说,Python不要太好用,对ESP8266来说,跑Python不现实,但有一个特别用于嵌入式的MicroPython就比较合适,既可以保留Python的编程习惯,又可以很好地使用并控制单片机,说到这里,就拿这个东西来做一个WiFi插座吧。

这里主要讲一下原理和代码,对于实物我就不进行制作了,其实就是加一个继电器的事,我们就定义GPIO2和GPIO4是两个继电器的驱动信号源,如果出高电平就代表打开继电器,如果出低电平就代表关闭继电器。平台还是使用贝壳物联的。

第一步是下载MicroPython的固件,传送门,可以根据自己Flash的大小选择合适的固件

ESP8266制作WiFi插座_第1张图片

ESP8266制作WiFi插座_第2张图片

下载完之后,还需要到乐鑫官网下载烧录工具,传送门,固件的烧录方法参考我之前的帖子传送门,如果之前有固件的话,烧录前必须执行一次整片擦除操作,否则有可能固件不能正常启动。

下面我们就要进行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

ESP8266制作WiFi插座_第3张图片

你可能感兴趣的:(个人小制作,程序拾遗)