教程1.PacketTracer中MCU芯片编程入门教程
教程2.全部智能设备连接MCU使用方法
教程3.读卡器与红外探测器连接MCU使用方法
教程4.常用传感器使用方法
教程5.几种按钮与开关的使用方法
教程6.执行器使用方法
教程7.上云教程
教程8.多设备上云教程
教程9.Arduino+OneNET TCP透传上云教程(发+收)
在本文中,我们将介绍packetTracer内全部智能家居设备的使用方法。
我们首先放置报警器siren、风扇、车库、加湿器、咖啡机、鼓风机、洒水器、窗户、按钮如下图并进行连接。连接到MCU的接口已标注在设备名称后。
大家请注意,按钮、鼓风机和窗户连接到了A接口即模拟接口,所以我们使用时传参数应传A0,A1,A2而非0,1,2
代码如下:
from gpio import *
from time import *
while True:
a1=analogRead(A0);
if(a1!=0):
customWrite(0,1)#开报警器
customWrite(1,1)#开车库
customWrite(2,1)#开洒水器
customWrite(3,1)#开风扇
customWrite(4,1)#开加湿器
customWrite(5,1)#开咖啡机
customWrite(A1,1)#开鼓风机
customWrite(A2,1)#开窗户
else:#关以上设备
customWrite(0,0)
customWrite(1,0)
customWrite(2,0)
customWrite(3,0)
customWrite(4,0)
customWrite(5,0)
customWrite(A1,0)
customWrite(A2,0)
sleep(1)
由于接口限制,我们每次只能展示这些设备。我们可以看到,这些智能设备连接到MCU芯片时,全部都可以使用custom方法进行写入操作,并且A口和D口都可以正常使用。
演示如下:当按下按钮,全部设备成功打开,松开按钮则关闭。
其中需要注意,鼓风机与电风扇具有0,1,2三种状态分别为关,低速,高速。
那么接下来我们换一批智能设备进行尝试。
可以看到,我们添加了一个排水孔,一个摄像头,还有三个门。为什么要添加三个门呢?我么首先看代码。
from gpio import *
from time import *
while True:
a1=analogRead(A0);
if(a1!=0):
customWrite(0,1)#开排水孔
customWrite(1,1)#开摄像头
customWrite(2,[0,1])#门锁上锁
customWrite(3,[0,0])#门解锁
customWrite(4,[1,0])#尝试开门,解锁
else:
customWrite(0,0)
customWrite(1,0)
customWrite(2,[0,0])
customWrite(3,[0,0])
customWrite(4,[0,0])
sleep(1)
我们按下按钮进行尝试
我们可以看到,按下按钮时排水孔和摄像头都打开,而门则有三种状态。D2门钥匙孔红色表示上锁,3号门钥匙孔绿色表示没有上锁,4号门已被推开表示未上锁且打开。我们看代码可以发现,向门写入了数组[0,1]、[0,0]与[1,0],其中,数组第一个数字为0的话表示不打开门,为1的话表示尝试打开门。第二个数字表示是否上锁,为1的话表示上锁,为0的话表示解锁。 所以第一个门写入了[0,1]表示关门上锁,第二个门写入了[0,0]表示关门不上锁,第三个为[1,0]表示开门不上锁。如果我们写入[1,1]则为开门上锁,由于上锁了,所以无法开门,表现为第一个门同样的效果。按住ALT点击门与点击门孔分别表示手动开关门与上锁解锁。
至此我们已学完了智能设备中的执行器如何连接MCU进行使用,我们得出以下结论:全部智能家居设备都可以使用customWrite方法进行写入数据。
接下来我们尝试使用传感器。
以上几个传感器,如上面三个,是搭配服务器使用的,下面四个可以直接显示示数,但最好也是搭配服务器使用,不然我们就需要对设备代码进行比较大的改动。由于我们的物联网基础模块中有如烟雾传感器、温湿度传感器等传感器,可以替代这些智能探测器的功能,所以我们再此不再讲解,大家如果有需要,可以查看以下文章:
①服务器配置方法
②智能设备无线连接方法
③服务器环境管理器使用方法
但是有两个智能设备是无可替代的,即读卡器和红外检测器
读卡器可以读取卡片的ID并发送给服务器,红外检测器可以检测物体遮挡并发送给服务器,这两个设备十分好用,但连接MCU使用却存在一些问题,所以需要进行底层代码的修改,我会把修改好的优化过的代码直接给大家,大家不需要担心。
1.我们先把卡的属性修改为1001之外的数字比如2001(1001有些版本检测为0)
2.单击读卡器→右下角高级→I/O配置→修改数字插槽为1
3.点击编程,双击python代码
4.点击main.py
5.修改代码如下:
from options import Options
from time import *
from physical import *
from gpio import *
from ioeclient import IoEClient
DELAY_TIME = 1000 # var DELAY_TIME
current_time = 0 # var current_time
X_READ_DISTANCE = 50 # var X_READ_DISTANCE
Y_READ_DISTANCE = 50 # var Y_READ_DISTANCE
cardID = 0 # var cardID
lastCardID = 0 # var lastCardID
state = 2 # waiting # var state
def setup ():
# Registration Server Setup
IoEClient.setup({
"type": "RFID Reader",
"states": [{
"name": "Card ID",
"type": "number",
"unit": '',
"controllable": False
},
{
"name": "Status",
"type": "options",
"options": {
"0": "Valid",
"1": "Invalid",
"2": "Waiting"
},
"controllable": True
}]
})
IoEClient.onInputReceive( lambda rinput: processData(rinput, True) )
def loop ():
global cardID, lastCardID, state
devices = devicesAt(getCenterX(), getCenterY(), X_READ_DISTANCE, Y_READ_DISTANCE) # var devices
found = False # var found
for i in xrange(0, len(devices)) :
if devices[i] is getName():
continue
cardID = getDeviceProperty(devices[i], 'CardID')
found = True
digitalWrite(0,cardID)#如果发现卡片了则输出卡片ID
break
if not found:
cardID = lastCardID = 0
digitalWrite(0,0)#如果没有发现卡片则输出0
setState(2)
else:
if lastCardID != cardID:
lastCardID = cardID
sendReport()
delay(DELAY_TIME)
def setState (newState):
global state
if state != newState:
state = newState
analogWrite(A1, state)
sendReport()
def sendReport ():
report = str( int(cardID)) + "," + str(state) # var report
IoEClient.reportStates(report)
def processData (data, bIsRemote):
if len(data) <= 0:
return
data = data.split(",")
setState(int(data[1]))
if __name__ == "__main__":
setup()
while True:
loop()
idle()
改变主要在于中文注释的两行代码
第一行中文注释代码为向新建的数字接口D0输出卡片信息
第二行中文注释代码为未检测到卡片时输出0
如果不添加第一行,MCU将一直读到0
如果不添加第二行,移开卡片后MCU仍将一直输出之前读到的卡片ID而非0
6.一定记得点击Run,包括之后关闭重开pkt文件可能出现MCU读不到ID的情况,可能就是读卡器代码被软件系统默认停止运行了,需要我们重新手动运行一次。
7.进行以下连线
8.MCU内编写以下代码
from gpio import *
from time import *
while True:
id=digitalRead(0)
print(id)
sleep(1)
代码很简单,就是循环读取读卡器数据并输出,我们尝试运行。
9.没有卡片时读到0 有卡片时读到卡片ID
则我们已成功掌握读卡器的使用方法。
为了方便大家搜索,我会把读卡器使用方法单独发布一篇文章,大家在此学会的就不需要再去查看另一篇文章了。
接下来我们用类似的方法对红外探测器进行一些修改。
1.单击探测器→高级→I/O配置→修改数字插槽为2 请注意与读卡器不同,此处修改为2
2.我们如图进行连线,请注意,检测器端口为D1接口而非D0接口,因为检测器底层代码向D1接口输出数据而非D0,而接到MCU的那一端可以接任意接口(本实验接D0)。
3.运行红外检测器python程序同上(无需修改)
4.MCU内编写以下代码并运行
from gpio import *
from time import *
while True:
thing=digitalRead(0)
print(thing)
sleep(1)
5.按住ALT将鼠标放在红线上则装置会变红,挪开鼠标则变暗
6.当遮挡时MCU控制台输出1023,否则输出0
全部智能设备的讲解到此结束,下一篇文章我们将进行物联网基础模块的讲解。
在此整理常用设备的方法与需传参数如下
执行器(智能设备)名称 | 控制方法 | 开 | 关 |
---|---|---|---|
台灯 | customWrite | 1暗 2亮 | 0 |
加湿器 | customWrite | 1 | 0 |
咖啡机 | custom Write | 1 | 0 |
电风扇 | customWrite | 1低速 2高速 | 0 |
车库门 | customWrite | 1 | 0 |
siren报警器 | customWrite | 1 | 0 |
鼓风机 | customWrite | 1 | 0 |
草坪洒水器 | customWrite | 1 | 0 |
窗户 | customWrite | 1 | 0 |
排水孔 | customWrite | 1 | 0 |
门 | customWrite | [1,0]数组 | [0,1] |
摄像头 | customWrite | 1 | 0 |
LCD显示器 | customWrite | “xx” 字符串 | ""空字符串 |
制冷器 | digitalWrite | 1023或HIGH | 0或LOW |
制热器 | digitalWrite | 1023或HIGH | 0或LOW |
洒水器 | digitalWrite | 1023或HIGH | 0或LOW |
舵机 | analogWrite | 1到1023(亮度) | 0 |
LED | analogWrite | 1到1023(速度) | 0 |
门的使用较为特殊,数组第一个数字为0的话表示不打开门,为1的话表示尝试打开门。第二个数字表示是否上锁,为1的话表示上锁,为0的话表示解锁。
传感器名称 | 读取方法 |
---|---|
光照传感器 | digitalRead |
温度传感器 | digitalRead |
湿度传感器 | digitalRead |
运动传感器 | digitalRead |
烟雾传感器 | digitalRead |
金属传感器 | digitalRead |
水传感器 | digitalRead |
水探测器 | digitalRead |
风探测器 | digitalRead |
读卡器 | digitalRead |
红外线探测器 | digitalRead |
光照传感器 | analogRead |
烟雾传感器、读卡器、红外线装置需要进行一些修改,大家可以详细参考以下文章
烟雾传感器
读卡器与红外线装置