教程1.PacketTracer中MCU芯片编程入门教程
教程2.全部智能设备连接MCU使用方法
教程3.读卡器与红外探测器连接MCU使用方法
教程4.常用传感器使用方法
教程5.几种按钮与开关的使用方法
教程6.执行器使用方法
教程7.上云教程
教程8.多设备上云教程
教程9.Arduino+OneNET TCP透传上云教程(发+收)
其实在教程2中,我们已经学习了全部智能家居设备连接MCU使用的方法,其中就包含读卡器和红外探测器的使用方法,但为了方便大家搜索,我决定再开一篇文章进行单独的讲解。
读卡器可以读取卡片的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
全部智能设备的讲解到此结束,下一篇文章我们将进行物联网基础模块的讲解。