【PT+Arduino+OneNET基础教程3】读卡器与红外探测器连接MCU使用方法

PacketTracer读卡器与红外探测器连接MCU使用方法

教程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
在这里插入图片描述
在这里插入图片描述

全部智能设备的讲解到此结束,下一篇文章我们将进行物联网基础模块的讲解。

你可能感兴趣的:(mcu,思科,物联网,iot)