专题五 在Cisco Packet Tracer中设计基于 PT 和 OneNet 的智能家居系统

摘    要

        智能家居是物联网在家庭中的基础应用,随着宽带业务的普及,智能家居产品涉及到方方面面。 家中无人,可利用手机等产品客户端远程操作智能空调,调节室温,甚者还可以学习用户的使用习惯,从而实现全自动的温控操作,使用户在炎炎夏季回家就能享受到冰爽带来的惬意;通过客户端实现智能灯泡的开关、调控灯泡的亮度和颜色等等; 插座内置Wifi,可实现遥控插座定时通断电流,甚者可以监测设备用电情况,生成用电图表让你对用电情况一目了然,安排资源使用及开支预算。

        本次课程设计要求设计一个基于 PT 和 OneNet 的智能家居系统,该系统要满足日常生活所使用的智能条件。

关键词

        Python;物联网;PT;Cisco Packet Tracer

 

1.平台及软件

        本次课设需要使用Cisco Packet Tracer模拟器和OneNet物联网平台。

        Packet Tracer是一个功能强大的网络仿真程序,允许学生实验与网络行为,问“如果”的问题。随着网络技术学院的全面的学习经验的一个组成部分,包示踪提供的仿真,可视化,编辑,评估,和协作能力,有利于教学和复杂的技术概念的学习。

        OneNET-中国移动物联网开放平台是由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,提供综合性的物联网解决方案,实现物联网设备的数据获取,数据存储,数据展现。

2.设计要求

2.1 环境参数设置

        用户地理位置:海南大学儋州校区,PT的环境参数设置为该位置的。

2.2必需实现以下功能:

        湿度大于阈值:风扇打开;否则关闭。湿度阈值的初始值为50%,可通过云平台oneNet发送控制指令,远程设置湿度阈值。

1. 光照度小于20%:台灯及LED灯打开;否则关闭。

2. 温度高于25度:空调打开;否则关闭。

3. 风速大于2KPH:关窗;否则,开窗。

        音箱播放音乐:

1. 门状态为doorstate=="1,0"时,即门打开且未上锁时(主人回家或在家),开始播放音乐。

2.  门状态为doorstate=="0,1"时,即门关闭且上锁时,停止播放音乐。

3. 门状态为doorstate=="0,0"时,即门关闭且未上锁时,可通过云平台oneNet发送控制指令,开始播放音乐或停止播放音乐。

2.3可选实现以下功能:

1.光照度小于20%且有人在家时:台灯及LED灯打开;否则关闭。

2. 温度高于25度且有人在家时:空调打开;否则关闭。无人在家时可通过云平台oneNet发送控制指令:当温度高于35度时打开空调;当温度低于35度时关闭空调。

3. 风速大于2KPH:关窗;否则,开窗。

4. 增加一个“室外花园”,当湿度小于30%时,开始“浇花”。

5. 增加你认为需要的其它功能。

3.功能实现

3.1用户地理位置

ae67d7071b444d9d92bcad191faf3851.png

 

 3.2必备功能

8bb5534f52b24e8295a3a65a5e469de3.png

d4a067fb110047e2837a8532f6bfbd15.png

 

3.2.1系统概况

        第一部分是室内传感器,有温度传感器,湿度传感器,光照传感器,这三种传感器将数据发送到MCU0进行数据分析再发送到SBC发送到云端管理。

        第二部分是室内家具,有窗户,门,空调,电扇,台灯,LED灯,音响,它们受控于MCU1听从SBC发送的指令。

        第三部分是室外花园,有浇灌系统,湿度传感器,传感器将数据发送到MCU2进行数据分析再发送到SBC发送到云端管理,浇灌系统受控于MCU2听从SBC发送的指令。

 

3.2.2联动实现

        当湿度大于阈值:风扇打开;否则关闭。湿度阈值的初始值为 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中代码实现设置阈值,并通过云端发送指令修改阈值:

 d60965fa27ba408bbdb090995702b07c.png

         如果获取到“window:open”,则打开窗户,否则关闭:

if cmd[0] == "window":			
	if cmd[1]=="open":
		customWrite(A1,1)
	if cmd[1]=="close":
		customWrite(A1,0)

4e4ca894d6c640aba034b71d46ae98a7.png

         如果获取到“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)

c4f92785f70c4422ad8d39c81f20847b.png

 

        如果获取到“airconditioner:open”,则打开空调,否则关闭:

if cmd[0] == "airconditioner":

    if cmd[1]=="open":
    
        digitalWrite(2, HIGH)

    if cmd[1]=="close":

        digitalWrite(2, LOW)

7ae4f0c7af1045d09664ff4ed3018b16.png

 

        如果获取到“music:open”,则打开音响,否则关闭:

if cmd[0] == "music":

    if cmd[1]=="open":

        digitalWrite(A0, HIGH)

    if cmd[1]=="close":

        digitalWrite(A0,LOW)

e8fc2cc83d7941d2a11af2e4cb92ba10.png

 

        如果室外湿度小于30%,则开始浇花,否则关闭:

def check(shidu):

    if shidu < 30:

        customWrite(0,1)

    else:

        customWrite(0,0)

cd409a05367740d590f41b819c3cff89.png

         在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两类值,前者是传感器获取的本地数据,后者是默认阈值(可以通过云端下发命令进行更改),再结合设计书要求对数据进行比较再由服务端向客户端发送命令即可。

3.2.3通信实现

        在各开发板上创建客户端,在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 类型都可。

运行如下:

95f073fc91a546f49dc99818bcaa94a6.png

53dfa00f9f134cd0a465a90f5373fd85.pngc3258f8117a24444932df6e110b75afc.png

 完整工程文件 pkt 链接如下:

智能家居系统(密码请关注公众号:玹之空间 -->资料获取)

 

 

 

  • 8
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值