MicroPython:通过OneNET平台控制继电器

现在市面上有许多品牌的WIFI智能插座,大多利用了现有家庭中的WiFi网络,让您的智能手机在联网条件下,能通过App操作远程打开或者关闭指定的电器,十分方便,这样的产品内部核心部分大多是由一个主控制器和一个继电器,通过网络的指令控制继电器断开和吸合从而实现220v市电的通断,现在,随着开源硬件的普及,我们也可以轻松实现这样的功能。

本文使用nodemcu开发板,基于micropython固件,通过中国移动ONENET物联网平台,通讯协议使用MQTT,实现电脑远程控制继电器断开吸合的效果。

我们首先按照上图连接好硬件电路,继电器DC+接开发板VIN,DC-接开发板GND,IN接开发板D1,硬件连接好就可以进行软件部分了。
继电器模块可以通过跳线帽选择高电平触发或者低电平触发,在继电器模块的另一端可以接最大220v,10A的强电,在通常状态下COM端和NC端是相通的,在被触发的时候COM和NO连接。

首先创建boot.py文件,boot.py是启动时运行,用来连接本地的WIFI,并且在连接WIFI后输出一些网络信息。boot.py程序第10行的代码是本地的WIFI的SSID和密码,大家修改成自己的就可以连接上自己的WIFI了。

def do_connect():
import network
sta_if = network.WLAN(network.STA_IF)
ap_if = network.WLAN(network.AP_IF)
if ap_if.active():
ap_if.active(False)
if not sta_if.isconnected():
print('connecting to network...')
sta_if.active(True)
sta_if.connect('MERCURY_D5C8', 'zhimadiy') #wifi的SSID和密码
while not sta_if.isconnected():
pass
print('network config:', sta_if.ifconfig())
do_connect()
gc.collect()

创建好boot.py后,继续创建main.py,main.py是主程序,在boot.py运行完后运行,我们打开main.py只需要修改CLIENT_ID,username,password,TOPIC 4个参数为自己的就可以了

from umqtt.simple import MQTTClient
from machine import Pin
import ubinascii
import machine
import micropython
led = Pin(5, Pin.OUT, value=1)
#MQTT服务端信息,使用时修改成自己的
SERVER = "183.230.40.39" #ONENET服务器地址
SERVER_PORT=6002 #ONENET服务器端口
CLIENT_ID = "3784858" #创建设备时得到的设备ID,为数字字串
TOPIC = b"/6046214/notice" #通过订阅 /device_id/数据流名 的方式,及时获取到某设备最新的数据点信息。
username='74321' #注册产品时,平台分配的产品ID,为数字字串
password='zhimadiymicropythonesp8266' #鉴权信息
state = 0
def sub_cb(topic, msg):
global state
print((topic, msg))
if msg == b"0":
led.value(0)
state = 1
elif msg == b"1":
led.value(1)
state = 0
elif msg == b"toggle":
# LED is inversed, so setting it to current state
# value will make it toggle
led.value(state)
state = 1 - state
def main(server=SERVER):
#括号里主要是客户端ID,服务器地址,服务器端口,用户产品ID,鉴权信息
c = MQTTClient(CLIENT_ID, server,6002,username,password)
# Subscribed messages will be delivered to this callback
c.set_callback(sub_cb)
c.connect()
c.subscribe(TOPIC)
print("Connected to %s, subscribed to %s topic" % (server, TOPIC))

try:
while 1:
#micropython.mem_info()
c.wait_msg()
finally:
c.disconnect()

main()

需要注意的是此源码中

TOPIC = b”/6046214/notice”

通过订阅 /device_id/数据流名 的方式,及时获取到某设备最新的数据点信息,当接收到特定消息时,改变D1的输出状态。

在创建完成这两个程序以后,我们使用工具将这两个程序上传到开发板上,重启开发板以后就可以连接上平台,我们使用平台提供的MQTT模拟器模拟控制端,控制端通过发送不同的消息,控制开发板。

这是开发板串口输出的信息: