单片机实例分享,射频卡流量监控系统
回想以前,学校浴室的收费标准是1.5元/次,每次可以持续洗一个小时,但是很多人洗澡的时间并不是很长,根本用不了一个小时,于是浪费水的情况便时有出现。我经常看到有些同学在浴室里洗衣服,所以这样的收费方式有滋生学生浪费习惯的弊端。为此我想到了通过改进浴室管理方案,修改计费方式,从而遏制大学生的浪费行为,这个系统可先在饮水机上进行测试。
我所在学校使用的“一卡通”是一张 IC 卡,用它可以到图书馆借书、到食堂就餐,学校还能通过IC卡获得使用者的详细信息等。我设想也可以利用IC卡对淋浴流量管理,每秒或者每几秒读取一次流量器的数据,再经过计算然后扣费,如果某个同学一直开启喷头,那么他一卡通内的钱也会随着流量的增加被更多地扣除。
我们设计的射频卡进行流量计费管理的系统具有以下优点。(1)存储容量大。磁卡的存储容量大约在200个字符;IC卡的存储容量根据型号不同,小的有几百个字符,大的有上百万个字符。
(2)安全保密性好,不容易被复制,IC卡上的信息能够随意读取、修改、擦除,但都需要密码。
(3)IC卡具有数据处理能力。在与读卡器进行数据交换时,可对数据进行加密、解密,以确保交换数据的准确可靠;而磁卡则无此功能。
(4)使用寿命长,可以重复充值。
(5)IC卡具有防磁、防静电、防机械损坏和防化学破坏等能力,信息保存年限长,读写次数在数万次以上。
(6)IC卡能广泛应用于金融、电信、交通、商贸、社保、税收、医疗、保险等方面,几乎涵盖所有的公共事业领域。
设计思路
通过单片机对流量计、射频卡、电磁阀等实施控制。单片机会按照流量,对射频卡内的信息进行修改(修改余额信息,对其他信息无影响),单片机访问流量计的频率大约为3s访问一次,也就是,单片机每3s扫描一次流量计的数据,同时进行运算费用,然后修改射频卡内的信息(修改余额)。余额不足会通过12864液晶显示器显示。整个系统的设计框图如图19.1所示。
图19.1 整个系统同的设计框图
本系统的主控采用STC12C5A60S2单片机,该单片机是增强型51单片机,ROM高达61KB,运算速度是普通51单片机的8倍。STC12C5A60S2兼容51单片机的指令、引脚,而且该单片机具有A/D转换功能、高速低功耗、抗干扰等特点。电磁阀采用12V六分管通水电磁阀,直流持续式工作模式,工作压力在0.02~0.8MPa,介质温度在1~85℃。并且导体与非导体之间应能承受AC2500V电压,1min不击穿以及产生飞弧等现象。流量计采用六分管高精度水流量传感器,频率F=26×Q(Q表示流量,单位为L/min),内径3.0mm,流量范围0.5~5L/min。射频卡采用RFID读卡模块和EHUOYAN IC卡。
本系统的设计分为3个具体实施阶段。
第一个阶段,如图19.2所示,识别IC卡,读取IC卡信息,检查余额,满足条件后打开电磁阀,准备读取流量计数据。如果余额不足,则产生提示。
图19.2 第一阶段
射频卡相关知识IC卡工作的基本原理是:射频读写器向IC卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,这样在电磁波激励下,LC谐振电路产生共振,从而使电容内有了电荷;在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内存储,当所积累的电荷达到2V时,此电容可作为电源为其他电路提供工作电压,将卡内数据发射出去或接受读写器的数据。
IC卡的外形与磁卡相似,它与磁卡的区别在于数据存储的媒体不同。磁卡是通过卡上条的磁场变化来存储信息的,而IC卡是通过嵌入卡中的电擦式可编程只读存储器集成电路芯(EEPROM)来存储数据信息的。
作为电子货币的IC卡,其上记录有大量重要信息,安全性是很重要的,作为IC卡应用系统开发者必须为IC卡系统提供合理有效的安全措施,以保证IC卡及其应用系统的数据安全。影响IC卡及应用系统安全的主要方式有:使用用户丢失或被窃的IC卡,冒充合法用户进入应用系统,获得非法利益;用伪造的或空白卡非法复制数据,进入应用系统;使用系统外的IC卡读写设备,对合法卡上的数据进行修改,改变操作级别等;在IC卡交易过程中,用正常卡完成身份认证后,中途变换IC卡,从而使卡上存储的数据与系统中不一致;在IC卡读写操作中,对接口设备与IC卡通信时所作交换的信息流进行截听、修改,甚至插入非法信息,以获取非法利益,或破坏系统。常用的安全技术有:身份鉴别和IC卡合法性确认、指纹鉴别技术、数据加密通信技术等。这些技术采用可以保证IC卡的数据在存储和交易过程中的完整性、有效性和真实性,从而有效地防止对IC卡进行非法读写和修改。总体上,IC卡的安全包括物理安全和逻辑安全两方面。
物理安全包括:IC卡本身的物理特性上的安全性,通常指对一定程度的应力、化学、电气、静电作用的防范能力;对外来的物理攻击的抵抗能力,要求IC卡应能防止复制、窜改、伪造或截听等。常采用的措施有:采用高技术和昂贵的制造工艺,使之无法被伪造;在制造和发行过程中,一切参数严格保密;制作时在存储器外面加若干保护层,防止分析其中内容,即很难破译;在卡内安装监控程序,以防止处理器或存储器数据总线和地址总线的截听。
常用的逻辑安全措施有:存储器分区保护,一般将IC卡中存储器的数据分成3个基本区:公开区、工作区和保密区;用户鉴别,用户鉴别又叫个人身份鉴别,一般有验证用户个人识别PIN、生物鉴别。
卡片有着16个扇区,每个扇区包含4个数据块,每个数据块具有16byte的存储容量。扇区被定义为扇区0~扇区15,数据块被分为数据块0~数据块3,整个卡共有64个数据块。
每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的。
第二个阶段,如图19.3所示,首先采集流量计数据,然后流量计产生的脉冲通过单片机计数。目前市场上常见的流量计是1L水共输出450个脉冲。1L水的质量是1kg,一个脉冲大概是2.2g水,利用单片机对脉冲数进行计数,每过一个脉冲扣除一定费用(单价×2.2即可)。实时监测IC卡内余额,如果余额不足,则触发单片机中断,等待关闭电磁阀,延迟1min后关闭电磁阀。
图19.3 第二阶段
第三阶段,如图19.4所示,监测IC卡状态,如果未识别到IC卡,则关闭电磁阀(防止使用者不关喷头直接拔卡)。
图19.4 第三阶段
制作过程
表19.1 制作所需材料
制作所需材料见表19.1,整个系统的电路图和PCB如图19.5所示。
图19.5 电路图和PCB图
PCB图是外加工的,需要注意的是,图中长方形白色框体是射频卡模块,尺寸可根据购买的射频卡模块尺寸进行修改。焊接电路板时,遵循“先贴片后插件,先低后高,先小后大”的原则,这样做会让你事半功倍,按照电路图焊接完成并通电之后的的系统可以进行简要的操作(见图19.6~图19.9)。
图19.6 驱动12864,没有用户,等待模式
图19.7 读到卡了,显示姓名、学号、钱包
图19.8 随着流量计脉冲个数增长,单片机进行计费,同时进行扣款操作,操作完毕显示当前余额
图19.9 用户移走卡,蜂鸣器长鸣一声,提示卡已移走
简单的测试之后,下位机就制作完成了,接下来就是进行上位机的编写,上位机(改变姓名、充值、初始化等操作依赖于模块)是用于改变射频卡信息的PC软件,我使用C#语言编写,第一次编写上位机软件,虽然界面很普通,但是功能还是比较完备的(见图19.10~图19.12)。
图19.10 没选择串口前所有的都是灰色表示不可操作
图19.11 选择串口后,按钮可操作更改框可以进行改写
此制作需要用到的射频卡通信设备(此设备需要和上位机搭配使用)如图19.13所示,设备上面黄色的纸是打印的,然后用双面胶贴上去,内部使用一个USB转TTL模块以及一个射频卡读写卡模块。
图19.12 单击读卡按钮后的显示
图19.13 此制作需要用到的的射频卡通信设备
程序部分
按照设计的流程图编写程序,由于程序过多,我不一一附上,只截取部分进行说明。下列程序是本制作要用到的命令数组、处理数组、显示数组等程序,也是上位机和下位机都需要的部分,需要注意的地方是,数组的个数和串口发送与接收命令的长度一定要搭配,否则会出错。比如某个命令的返回值的数组大小为10,如果我们在写串口中断处理函数的时候,没注意接收的个数,写成了9,那么处理函数会一直等待最后一个数,才满足跳出函数的条件,当然,你可以写个报错的函数,调试完成后关闭它。
//search card and get card serial number
uchar xdata ComSearchCard[5] = {0xAA,0xBB,0x02,0x20};// 寻卡,返回AA BB 06 20 92 BF 72 59 20
//read block No.x
uchar xdata ComReadBlock[13] = {0xAA, 0xBB, 0x0a, 0x21, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};// 读哪一块,第6位就是0x0几
//read block No.8
//uchar ComReadBlock6[13] = {0xAA, 0xBB, 0x0a, 0x21, 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
// write block No.8 with 0x01 to 0x0f
uchar xdata ComWriteBlock[29] = {0xAA, 0xBB, 0x1a, 0x22, 0x00, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,//0xff 是密码
0x02, 0x00, 0x01, 0x01, 0x00, 0x07, 0x00, 0x01,//
0x04, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00};// 要写的数据
//initialize block No.8 as a purse
uchar xdata ComIntiPurse[17] = {0xAA, 0xBB, 0x0e, 0x23, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0x00, 0x00};//初始化钱包。分区5为钱包
//read purse value of block No.5
uchar xdata ComReadPurse[13] = {0xAA,0xBB,0x0a, 0x24, 0x00, 0x05,0xff, 0xff, 0xff, 0xff, 0xff, 0xff};// 读取分区5的钱包 返回4字节的数据
// purse in block No.5 increase with value“2”
uchar xdata ComIncrPurse[17] = {0xAA,0xBB,0x0e, 0x25, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //增加钱包的余额
0x01, 0x00, 0x00, 0x00};//要增加的值
// purse in block No.5 decrease with value“1”
uchar xdata ComDecrPurse[17] = {0xAA,0xBB,0x0e, 0x26, 0x00, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,//扣费
0x01, 0x00, 0x00, 0x00};//要减少的值
提取数据的数组:
uchar xdata user_block8[12]={0}; //学号(8位)
uchar xdata user_card[4]={0}; //卡号
uchar xdata user_cash[4]={0}; //现金
uchar xdata user_name[6]={0}; //姓名
程序中有一个举足轻重的“指令选择”函数,由于程序太长,就不附上,有兴趣的朋友可以到我的QQ群下载。这个函数是一个带返回值的函数,整个系统的命令都由这个函数发出。下面的解释一目了然,以后如果需要升级本系统,在这个函数内部添加命令即可。
指令选择入口函数:
输入:j 1~8
输出:1或0
功能概述:
a. 确认返回数组的正确性(数组最后一个数据的异或校验以及数组的长度)。
b. 序号说明:
(1)寻卡,返回射频卡序列号;
(2)读取某个模块的值,返回16位数值;
(3)写某个模块,返回成功命令;
(4)初始化钱包,即定义制定射频卡分区为钱包返回成功命令;
(5)读取钱包的值;
(6)增加钱包的值;
(7)减少钱包的值;
(8)返回增加、减少后钱包的值。
由于这个制作的初步设想是在学校里使用的,因此价格基本稳定,就没有给管理员权限使用输入设备更改资费。更改资费需要改动源代码,当然,做成产品肯定需要设计输入设备,由于本次制作的用户就是我,所以就简化了。
更改资费的程序段如下:
EX0 = 0;
countflag = 0;//脉冲标志清零
feetemp = 0x01;//这里是扣的金额
feecount = feecount + feetemp;//计算使用总额,需要显示也可以显示的
ComDecrPurse[12] = feetemp;//写入扣钱金额
j = Command_choic(7);//100个脉冲减少一分钱
关于脉冲个数与消费金额关系的问题,在外部中断里去修改一下就好了,建议大家使用宏定义,直接在顶部修改。
count++;
if (count == 1) //这里更改脉冲个数
{
countflag = 1;
count = 0;
}
注:之所以使用双串口单片机是有原因的,因为一边要和模块通信,一边要打印出来数据观察是否正确,所以要使用两个串口,当然,此制作我用串口2与模块通信,这也是为什么用12C5A60S2的原因。
流量管理系统制作好了,现在就试着将它搭建到饮水机上进行测试。总的来说,就是先断开饮水机的水管,把电磁阀和流量计串连进去,再连接上即可。但连接的时候需要用一些胶布,以防止漏水,并避免饮水机发生漏电危险。
总结
此制作的射频卡读取模块,使用的是串口协议,它的所有命令都是以“AA BB”开头,最后一位数据是前面除开头以外的异或结果,串口收数据的时候本来就不知道收多长,这个版本的模块没有解决这个问题。例如,寻卡的命令是“AA BB 02 20 22”,“AA BB”为开头,22是前面02和20的异或结果。因此推荐大家使用其他协议,其他协议可以自己规定头和尾,检测的时候非常方便,当然也纯属个人意见。
居民楼漏水隐患待解决,基于Arduino的漏水报警器设想和理论探讨
小编在租房的时候,曾经遇到过一次水管爆裂,真是水漫金山,接到物业电话的我,火速赶到家里,打开门,我惊呆了,水已经没过了脚踝,邻居的天花板都泡掉了,最后损失了一笔钱了事,下图为一些其他居民漏水的惨状。
漏水
那么能不能利用Arduino开发一款漏水报警器那,我的设想是这样的:水传感器监测到漏水,Arduino声光报警,联动主进水电磁阀关闭,截断漏水源,同时通过通讯板向固定手机发送信息。
声光报警可以通过Arduino数字针脚输出电平,带动声光控制板;
电磁阀控制回路如下图
当arduino输出一个高或者低电平时,电磁阀K1线圈得到信号,电磁水阀门和K1的常开按钮串联在一个线路,当漏水时,可以通过电磁阀动作关闭水源。
对于向手机发送报警短信,可以通过Arduino配合GSM实现。
更多精彩,请关注我的文章:
你还在玩单片机,还在高价买PLC学习,你已经OUT了,说Arduino的前世今生
50元玩转Arduino,一块神奇好玩的电路板-Arduino的炫酷作品
万里长征第一步,如果用Arduino点亮发光二极管,炫酷流水灯
相关问答
用51 单片机 通过哪种电磁阀控制水流_汽配人问答[最佳回答]单片机控制电磁阀,冷水可以用普通的电磁阀,热水部分要用耐高温的电磁阀,否则寿命很短就会漏水。
高压测漏仪原理?燃气体的空气,通过气泵送到传感器时,检测元件...当地下输气管道发生腐蚀性穿孔、断裂必然产生气体的微量泄漏,在地面沟井、下水道等处缓慢扩散。检漏仪将含...
给推荐推荐!丰台有经验的暗管渗水维修,暗管渗水维修需要抢...[回答]对家电维修作用不大,虽然单片机在家电控制中很常见,但程序是看不见摸不着的,厂家一般也不公开,自己编难度又很大,一般都要认真检查外围器件,确认没...
电蒸锅的保护电路是怎样的?电蒸锅也叫电蒸笼,电蒸锅是一种在传统的木蒸笼、铝蒸笼、竹蒸笼等基础上开发出来的用电热蒸汽原理来直接清蒸各种美食的厨房生活电器。电蒸锅是一种用电热原理...
感应水龙头可以调节感应距离吗部分感应水龙头品牌的红外窗口采用单片机控制,电源指示灯在水控部分(装在台盆下方),如果无反应,则初步判断感应部分有故障,可更换红外探头,在这边建议对故障无法...
rtoto感应水龙头怎么自己维修?_住范儿家装官网1、有感应(指示灯亮)不出水:首先确定供电电源是否正常,现国内主要供电方式为交流220V变压为12V和6V;直流电6V(七号或五号碱性电池四节)和直流3V(两...
家居智能安全系统是怎么样的?随着社会的发展,人们为了提高生活质量,广泛的应用着各种能源"比如会用到燃气、电、水等"这些东西给人们带来方便的同时,也存在一定的安全隐患,可能会漏气、漏水、...
楼道门铃维修方法有哪些[回答]一般在住户对讲和楼下单元对讲之间会接一个隔离器或者转换器,你将所有住户对讲线先拆除,接一个好的住户对讲测试,行的话,就是某户对讲故障影响到了;...
洗衣机水位不准确的维修方法?1、首先洗衣机的水位传感器是一个LC电路,是和电脑板中电路共同组成一LC振荡电路,通过气压的大小来改变电感量,从而改变振荡电路的频率,电脑板中的单片机来检...
请问:电锅炉水位计上的阀门作用?拜托了帮个忙[回答]电锅炉72kw电蒸汽发生器和100kg/h燃气蒸汽发生器每一个钟头造成的蒸气量是一样的,仅仅然料不一样、系统软件不一样、热效不一样,由经历来辨别,72kw...