智能家居是物联网在家庭中的基础应用,随着宽带业务的普及,智能家居产品涉及到方方面面。 家中无人,可利用手机等产品客户端远程操作智能空调,调节室温,甚者还可以学习用户的使用习惯,从而实现全自动的温控操作,使用户在炎炎夏季回家就能享受到冰爽带来的惬意;通过客户端实现智能灯泡的开关、调控灯泡的亮度和颜色等等; 插座内置Wifi,可实现遥控插座定时通断电流,甚者可以监测设备用电情况,生成用电图表让你对用电情况一目了然,安排资源使用及开支预算。
本次课程设计要求设计一个基于 PT 和 OneNet 的智能家居系统,该系统要满足日常生活所使用的智能条件。
关键词
Python;物联网;PT;Cisco Packet Tracer
本次课设需要使用Cisco Packet Tracer模拟器和OneNet物联网平台。
Packet Tracer是一个功能强大的网络仿真程序,允许学生实验与网络行为,问“如果”的问题。随着网络技术学院的全面的学习经验的一个组成部分,包示踪提供的仿真,可视化,编辑,评估,和协作能力,有利于教学和复杂的技术概念的学习。
OneNET-中国移动物联网开放平台是由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,提供综合性的物联网解决方案,实现物联网设备的数据获取,数据存储,数据展现。
用户地理位置:海南大学儋州校区,PT的环境参数设置为该位置的。
湿度大于阈值:风扇打开;否则关闭。湿度阈值的初始值为50%,可通过云平台oneNet发送控制指令,远程设置湿度阈值。
1. 光照度小于20%:台灯及LED灯打开;否则关闭。
2. 温度高于25度:空调打开;否则关闭。
3. 风速大于2KPH:关窗;否则,开窗。
音箱播放音乐:
1. 门状态为doorstate=="1,0"时,即门打开且未上锁时(主人回家或在家),开始播放音乐。
2. 门状态为doorstate=="0,1"时,即门关闭且上锁时,停止播放音乐。
3. 门状态为doorstate=="0,0"时,即门关闭且未上锁时,可通过云平台oneNet发送控制指令,开始播放音乐或停止播放音乐。
1.光照度小于20%且有人在家时:台灯及LED灯打开;否则关闭。
2. 温度高于25度且有人在家时:空调打开;否则关闭。无人在家时可通过云平台oneNet发送控制指令:当温度高于35度时打开空调;当温度低于35度时关闭空调。
3. 风速大于2KPH:关窗;否则,开窗。
4. 增加一个“室外花园”,当湿度小于30%时,开始“浇花”。
5. 增加你认为需要的其它功能。
3.2必备功能
第一部分是室内传感器,有温度传感器,湿度传感器,光照传感器,这三种传感器将数据发送到MCU0进行数据分析再发送到SBC发送到云端管理。
第二部分是室内家具,有窗户,门,空调,电扇,台灯,LED灯,音响,它们受控于MCU1听从SBC发送的指令。
第三部分是室外花园,有浇灌系统,湿度传感器,传感器将数据发送到MCU2进行数据分析再发送到SBC发送到云端管理,浇灌系统受控于MCU2听从SBC发送的指令。
当湿度大于阈值:风扇打开;否则关闭。湿度阈值的初始值为 50%,可通过云平台 oneNet 发送控制指令,远程设置湿度阈值。
在MCU1中代码实现,如果获取到“fan:open”,则打开风扇,否则关闭:
if':'in data:
cmd =data.split(':')
if cmd[0] == "fan":
if cmd[1]=="open":
customWrite(3,1)
if cmd[1]=="close":
customWrite(3,0)
在SBC中代码实现设置阈值,并通过云端发送指令修改阈值:
如果获取到“window:open”,则打开窗户,否则关闭:
if cmd[0] == "window":
if cmd[1]=="open":
customWrite(A1,1)
if cmd[1]=="close":
customWrite(A1,0)
如果获取到“light:open”,则打开台灯与LED灯,否则关闭:
if cmd[0] == "light":
if cmd[1]=="open":
customWrite(4,1)
analogWrite(5,1023)
if cmd[1]=="close":
customWrite(4,0)
analogWrite(5,0)
如果获取到“airconditioner:open”,则打开空调,否则关闭:
if cmd[0] == "airconditioner":
if cmd[1]=="open":
digitalWrite(2, HIGH)
if cmd[1]=="close":
digitalWrite(2, LOW)
如果获取到“music:open”,则打开音响,否则关闭:
if cmd[0] == "music":
if cmd[1]=="open":
digitalWrite(A0, HIGH)
if cmd[1]=="close":
digitalWrite(A0,LOW)
如果室外湿度小于30%,则开始浇花,否则关闭:
def check(shidu):
if shidu < 30:
customWrite(0,1)
else:
customWrite(0,0)
在SBC中进行本地数据与阈值比较判断,是否满足开启条件,代码实现如下:
def hum():
if (sensor_humitidy >= humitidy_threshold):#fan
for _client in clients:
_client.send("fan:open")
else:
for _client in clients:
_client.send("fan:close")
sleep(1)
if (sensor_sunlight < sunlight_threshold):#light and led
for _client in clients:
_client.send("light:open")
else:
for _client in clients:
_client.send("light:close")
sleep(1)
if (sensor_temperature > temperature_threshold):#air conditioner
for _client in clients:
_client.send("airconditioner:open")
else:
for _client in clients:
_client.send("airconditioner:close")
sleep(1)
if (sensor_door == 0 and music_threshold == 1):
for _client in clients:
_client.send("music:open")
elif(sensor_door == 0 and music_threshold == 0):
for _client in clients:
_client.send("music:close")
sleep(1)
if (sensor_wind >= wind_threshold):
for _client in clients:
_client.send("window:close")#window
else:
for _client in clients:
_client.send("window:open")
sleep(1)
在hum函数中,有sensor_和threshold两类值,前者是传感器获取的本地数据,后者是默认阈值(可以通过云端下发命令进行更改),再结合设计书要求对数据进行比较再由服务端向客户端发送命令即可。
在各开发板上创建客户端,在SBC上创建服务端,在云端创建对应的设备并在SBC上配置好对应的接收方法,代码如下:
SBC:
serverIP = "183.230.40.40"
serverPort = 1811
###
auth1 = '*556835#humidty#Lab1*' #产品 ID#设备鉴权信息#脚本名称
auth2 = '*556835#sunlight#Lab1*'
auth3 = '*556835#temperature#Lab1*'
auth4 = '*556835#wind#Lab1*'
auth5 = '*556835#door#Lab1*'
###
oneNetclient = RealTCPClient()
oneNetclient2 = RealTCPClient()
oneNetclient3 = RealTCPClient()
oneNetclient4 = RealTCPClient()
oneNetclient5 = RealTCPClient()
###
def on1oneNet_TCPConnectionChange(type):
if type == 3:
oneNetclient.send(auth1)
def on1oneNet_TCPConnectionChange2(type):
if type == 3:
oneNetclient2.send(auth2)
def on1oneNet_TCPConnectionChange3(type):
if type == 3:
oneNetclient3.send(auth3)
def on1oneNet_TCPConnectionChange4(type):
if type == 3:
oneNetclient4.send(auth4)
def on1oneNet_TCPConnectionChange5(type):
if type == 3:
oneNetclient5.send(auth5)
####
def on1oneNet_TCPReceive(data):
print("received threshold from oneNet: " + data);
if ':' in data:
value = data.split(':')
if value[0]=="humidity":
global humitidy_threshold
humitidy_threshold = value[1]
if value[0]=="sunlight":
global sunlight_threshold
sunlight_threshold = value[1]
if value[0]=="temperature":
global temperature_threshold
temperature_threshold = value[1]
if value[0]=="wind":
global wind_threshold
wind_threshold = value[1]
def main():
server.listen(port)
server.onNewClient(onTCPNewClient)
#1
oneNetclient.onConnectionChange(on1oneNet_TCPConnectionChange) #add 3 lines
oneNetclient.onReceive(on1oneNet_TCPReceive)
oneNetclient.connect(serverIP, serverPort)
#2
oneNetclient2.onConnectionChange(on1oneNet_TCPConnectionChange2) #add 3 lines
oneNetclient2.onReceive(on1oneNet_TCPReceive)
oneNetclient2.connect(serverIP, serverPort)
#3
oneNetclient3.onConnectionChange(on1oneNet_TCPConnectionChange3) #add 3 lines
oneNetclient3.onReceive(on1oneNet_TCPReceive)
oneNetclient3.connect(serverIP, serverPort)
#4
oneNetclient4.onConnectionChange(on1oneNet_TCPConnectionChange4) #add 3 lines
oneNetclient4.onReceive(on1oneNet_TCPReceive)
oneNetclient4.connect(serverIP, serverPort)
#5
oneNetclient5.onConnectionChange(on1oneNet_TCPConnectionChange5) #add 3 lines
oneNetclient5.onReceive(on1oneNet_TCPReceive)
oneNetclient5.connect(serverIP, serverPort)
sleep(1)
while True:
oneNetclient.send(sensor_humitidy)
oneNetclient2.send(sensor_sunlight)
oneNetclient3.send(sensor_temperature)
oneNetclient4.send(sensor_wind)
oneNetclient4.send(sensor_door)
MCU0:
serverIP = "192.16.1.250"
serverPort = 1234
###
client = TCPClient()
def onTCPConnectionChange(type):
print("connection to " + client.remoteIP() + " changed to state " + str(type))
def onTCPReceive(data):
print("received from " + client.remoteIP() + " with: " + data)
def main():
client.connect(serverIP, serverPort)
client.onConnectionChange(onTCPConnectionChange)
client.onReceive(onTCPReceive)
while True:
client.send(gethumidity())
sleep(1)
client.send(getsunlight())
sleep(1)
client.send(gettemperature())
MCU1:
serverIP = "192.16.1.250"
serverPort = 1234
client = TCPClient()
def onTCPConnectionChange(type):
print("connection to " + client.remoteIP() + " changed to state " + str(type))
def onTCPReceive(data):
global cmd
print("received from " + client.remoteIP() + " with " + data)
def main():
client.onConnectionChange(onTCPConnectionChange)
client.onReceive(onTCPReceive)
client.connect(serverIP, serverPort)
while True:
client.send(door())
本段代码解析:
在SBC与MCU上分别设置客户端和服务端,多看两遍代码就可以看出来固定格式。
首先,关键的是设置好云端的设备然后再SBC上将产品和设备进行绑定,auth设置好,然后将接收函数与发送函数的对应关系找到,做到一收一发完美对接。
值得注意的是,传参过程中你看到的数字有可能并不是数字,可能是字符,因此,要将传出的值格式化,转换成 int 类型或者 float 类型都可。
运行如下:
完整工程文件 pkt 链接如下:
智能家居系统(密码请关注公众号:玹之空间 -->资料获取)