资源描述:
《基于android的智能家居系统设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
东莞理工学院毕业论文(设计)题目基于Android的智能家居系统设计——C语言功能模块及部分驱动 基于Android的智能家居系统设计——C语言功能模块及驱动部分摘要:我们最早可以追溯到1994年,智能家居已经进入中国市场,但是由于经济和技术的成本原因尚未普及。今年与人民生活水平的逐步提高,特别是嵌入式设备的快速发展,使智能家居不再像以前那么高不可攀了。智能家居项目,写这篇文章是基于安卓界面,通过C控制硬件。控制常见的家用电器如空调电灯,并通过一系列的室内温度和湿度自动监测以及实现安全的影响。由于这个项目的内容较多,所以是两种方式的分工来完成设计。详细摘要,基于智能家居通过JNI接受从JAVA数据,然后由C语言在各种硬件的行动以实现用户的需求,和硬件驱动程序编程的一部分。关键字:智能家居,JNI,C语言2 SmartHomesystemdesignbasedonAndroid——CLanguageFunctionModuleandDriveSectionAbstract:inearly1994,SmartHomehasenteredChinamarket,butwasn’tpopularbecausethehighcostofeconomyandtechnology.recently,withthegradualimprovementoflivingstandards,especiallytherapiddevelopmentofembeddeddevices,theSmartHomeismoreandmoreacceptablethanbefore.SmartHomeprojectinthispaper,iswritteninAndroidbasedinterface,throughtheCtocontrolthehardware.Toachievecontrolofcommonhouseholdappliancessuchaselectricairconditioning,temperatureandhumidityandthroughtheacquisitionofaseriesofcontrolroomandprotection.Owingtotheverybigproject,itisfinishbytwppeople’steamwork.Andinthispaper,SmartHomeinandatacamefromtheJAVAbyJNIbasedonClanguage,andthenbythevarioushardwareactionhasreachedthedemandoftheuser,andthehardwaredriveprogram.Keywords:SmartHome,JNI,Clanguage2 目录1绪论11.1研究背景和意义11.2本设计所完成的工作22总括42.1硬件42.1.1Cortex-A842.1.2拓展板52.2JNI53功能设计73.1主界面73.1.1温湿度监控显示73.1.2在家模式和外出模式的切换83.1.3进入安防界面93.2闹钟103.3灯光113.4窗帘123.4.1光感监控123.4.2控制窗帘123.5空调及排气扇133.5.1空调和排气扇的直接控制133.5.2温度控制空调143.5.3短信控制空调143.6安防153.6.1警报153.6.2切换识别ID卡以及电话号码154.驱动及界面包装174.1LED174.2GPRS174.3直流电机174.4蜂鸣器194.5RFID195.总结19致谢202 1绪论1.1研究背景和意义智能家居(英文:smarthome,homeautomation)是以住宅为平台,利用综合布线技术、网络通信技术、安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成,构建高效的住宅设施与家庭日程事务的管理系统,提升家居安全性、便利性、舒适性、艺术性,并实现环保节能的居住环境。智能家居是在互联网的影响之下物联化体现。智能家居通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、影音服务器、影柜系统、网络家电等)连接到一起,提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测、暖通控制、红外转发以及可编程定时控制等多种功能和手段。与普通家居相比,智能家居不仅具有传统的居住功能,兼备建筑、网络通信、信息家电、设备自动化,提供全方位的信息交互功能,甚至为各种能源费用节约资金。智能家居的概念起源很早,但一直未有具体的建筑案例出现,直到1984年美国联合科技公司(UnitedTechnologiesBuildingSystem)将建筑设备信息化、整合化概念应用于美国康涅狄格州(Connecticut)哈特佛市(Hartford)的CityPlaceBuilding时,才出现了首栋的“智能型建筑”,从此揭开了全世界争相建造智能家居派的序幕。国内现状智能家居作为一个新生产业,处于一个导入期与成长期的临界点,市场消费观念还未形成,但随着智能家居市场推广普及的进一步落实,培育起消费者的使用习惯,智能家居市场的消费潜力必然是巨大的,产业前景光明。正因为如此,国内优秀的智能家居生产企业愈来愈重视对行业市场的研究,特别是对企业发展环境和客户需求趋势变化的深入研究,一大批国内优秀的智能家居品牌迅速崛起,逐渐成为智能家居产业中的翘楚! 智能家居至今在中国已经历了近12年的发展,从人们最初的梦想47 ,到今天真实的走进我们的生活,经历了一个艰难的过程。[2]智能家居在中国的发展经历的四个阶段,分别是萌芽期/智能小区期、开创期、徘徊期、融合演变期。萌芽期/智能小区期(1994年-1999年) 这是智能家居在中国的第一个发展阶段,整个行业还处在一个概念熟悉、产品认知的阶段,这时没有出现专业的智能家居生产厂商,只有深圳有一两家从事美国X-10智能家居代理销售的公司从事进口零售业务,产品多销售给居住国内的欧美用户。开创期(2000年-2005年) 国内先后成立了五十多家智能家居研发生产企业,主要集中在深圳、上海、天津、北京、杭州、厦门等地。智能家居的市场营销、技术培训体系逐渐完善起来,此阶段,国外智能家居产品基本没有进入国内市场。徘徊期(2006-2010年) 2005年以后,由于上一阶段智能家居企业的野蛮成长和恶性竞争,给智能家居行业带来了极大的负面影响:包括过分夸大智能家居的功能而实际上无法达到这个效果、厂商只顾发展代理商却忽略了对代理商的培训和扶持导致代理商经营困难、产品不稳定导致用户高投诉率。行业用户、媒体开始质疑智能家居的实际效果,由原来的鼓吹变得谨慎47 ,市场销售也几年出来增长减缓甚至部分区域出现了销售额下降的现象。2005年-2007年,大约有20多家智能家居生产企业退出了这一市场,各地代理商结业转行的也不在少数。许多坚持下来的智能家居企业,在这几年也经历了缩减规模的痛苦。正在这一时期,国外的智能家居品牌却暗中布局进入了中国市场,而活跃在市场上的国外主要智能家居品牌都是这一时期进入中国市场的,如罗格朗、霍尼韦尔、施耐德、Control4等。国内部分存活下来的企业也逐渐找到自己的发展方向,例如天津瑞朗,青岛爱尔豪斯,海尔,科道等,用X10,深圳索科特做了空调远程控制,成为工业智控的厂家。融合演变期(2011-2020年) 进入2011年以来,市场明显看到了增长的势头,而且大的行业背景是房地产受到调控。智能家居的放量增长说明智能家居行业进入了一个拐点,由徘徊期进入了新一轮的融合演变期。 接下来的三到五年,智能家居一方面进入一个相对快速的发展阶段,另一方面协议与技术标准开始主动互通和融合,行业并购现象开始出来甚至成为主流。 接下来的五到十年,将是智能家居行业发展极为快速,但也是最不可琢磨的时期,由于住宅家庭成为各行业争夺的焦点市场,智能家居作为一个承接平台成为各方力量首先争夺的目标。谁能最终胜出,我们可以作种种分析,但最终结果,也许只有到时才知。但不管如何发展,这个阶段国内将诞生多家年销售额上百亿元的智能家居企业。5、爆发期进入到2014年以来,各大厂商已开始密集布局智能家居,尽管从产业来看,业内还没有特别成功的案例显现,这预示着行业发展仍处于探索阶段,但越来越多的厂商开始介入和参与已使得外界意识到,智能家居未来已不可逆转。目前来看,智能家居经过一年多产业磨合,已正处爆发前夜。业内人士认为,2015年随着合作企业已普遍进入到出成果时刻,智能家居新品将会层出不穷,业内涌现的新案例也会越来越多。[1]国内相关政策47 截止2013年,全球范围内信息技术创新不断加快,信息领域新产品、新服务、新业态大量涌现,不断激发新的消费需求,成为日益活跃的消费热点。我国市场规模庞大,正处于居民消费升级和信息化、工业化、城镇化、农业现代化加快融合发展的阶段,信息消费具有良好发展基础和巨大发展潜力。我国政府为了推动信息化、智能化城市发展也在2013年8月14日发表了关于促进信息消费扩大内需的若干意见,大力测发展宽带普及、宽带提速,加快推动信息消费持续增长,这都为智能家居、物联网行业的发展打下了坚实的基础。政策摘要:增强信息产品供给能力鼓励智能终端产品创新发展。面向移动互联网、云计算、大数据等热点,加快实施智能终端产业化工程,支持研发智能手机、智能电视等终端产品,促进终端与服务一体化发展。支持数字家庭智能终端研发及产业化,大力推进数字家庭示范应用和数字家庭产业基地建设。鼓励整机企业与芯片、器件、软件企业协作,研发各类新型信息消费电子产品。支持电信、广电运营单位和制造企业通过定制、集中采购等方式开展合作,带动智能终端产品竞争力提升,夯实信息消费的产业基础。[3]国外现状自从世界上第一幢智能建筑1984年在美国出现后,美国、加拿大、欧洲、澳大利亚和东南亚等经济比较发达的国家先后提出了各种智能家居的方案。智能家居在美国、德国、新加坡、日本等国都有广泛应用。1998年5月新加坡举办的“98亚洲家庭电器与电子消费品国际展览会”上,通过在场内模拟“未来之家”,推出了新加坡模式的家庭智能化系统。它的系统功能包括三表抄送功能、安防报警功能、可视对讲功能、监控中心功能、家电控制功能、有线电视接入、电话接入、住户信息留言功能、家庭智能控制面板、智能布线箱、宽带网接入和统软件配置等。根据美国该行业之专业顾问公司PARKS的统计资料显示:1995年,美国一个家庭要安装家庭自动化设备的平均费用在7000至9000美元之间。1995年美国家庭已使用先进家庭自动化设备的比率为0.33%,看来市场真正启动尚需时日。预计这五年内,家庭自动化的市场年平均增长率为8%。PARKS公司的资料亦显示:到2004年,家庭网络市场总额可达57亿美元。据国际专家预测,到2000年底国际智能家居的产品销售额可达24亿美元。2004年可达148亿美元。发展机遇智慧家居是今后家居领域发展的必然趋势,虽然市场推广才刚刚开始,但行业的竞争已经很激烈,光是宁波就有不下5家企业专门从事这方面开发。47 制造企业在产业调整和转型中,都需要运用到大数据。今后,数据将成为推进社会进步的第四生产力。市场潜力巨大,同时,智慧家居所依托的大数据分析,也是传统制造企业转型升级的重要途径。总论:比尔盖茨是国外第一个使用智能家居的家庭,至今快有三十年的历史了,智能家居控制系统也逐渐走进大家的视野。这两年随着wifi的普及,无线智能家居逐渐取代了有线产品,在无线领域国内并不落后于国外,同样使用最新Zigbee智能家居,但目前国内智能家居虽有潜力但发展缓慢,人们的消费观和消费能力并不充分。根据《中国智能家居设备行业发展环境与市场需求预测分析报告前瞻》分析,目前我国智能家居产品与技术的百花齐放,市场开始明显出现低、中、高不同产品档次的分水岭,行业进入快速成长期。面对中国庞大的需求市场,预计该行业将以年均19.8%的速率增长,在2015年产值达1240亿元。[4]发展智能家居最初的发展主要以灯光遥控控制、电器远程控制和电动窗帘控制为主,随着行业的发展,智能控制的功能越来越多,控制的对象不断扩展,控制的联动场景要求更高,其不断延伸到家庭安防报警、背景音乐、可视对讲、门禁指纹控制等领域,可以说智能家居几乎可以涵盖所有传统的弱电行业,市场发展前景诱人,因此和其产业相关的各路品牌不约而同加大力度争夺智能家居业务,市场渐成春秋争霸之势。47 (以上图片来自百度的搜索)1.2本设计所完成的工作本文根据系统分为6个界面,包括主界面、灯光界面、闹钟界面、窗帘界面、空调及排气界面、安防界面,其中用户最先能看到的是主界面,从主界面可以进入其他的5个二级界面。如图1.1所示47 图1-1主界面除了作为其他界面的入口,还包括当前的温湿度显示,选择在家和外出模式的切换。其中当外出模式切换到在家模式和进入安防设置的时候需要用到RFID认证。在灯光界面中的按钮是能够判断灯光的状态的,因此在灯光界面中会不断刷新并上传灯光的状态以便LED灯和按键的状态保持一致。47 闹钟界面中我们提供一个定时闹钟可以设定在24小时内使蜂鸣器动作一次。并且可以再闹钟发出声响之前取消。在空调界面中由于也需要用到显示温度,可以通过温度控制空调的开启,另外由于硬件上的限制,空调在演示中也是以LED灯的形式演示。窗帘界面可以提供两种控制窗帘的方法,包括手动直接控制窗帘和通过光照值控制窗帘的开关,为了方便用户设定合适的光照值,界面中有对当前光感的监控。安防系统需要通过RFID的认证才能进入,此界面主要提高的安防功能是红外和烟雾警报,警报的方式都分别分为蜂鸣器警报和短信警报,而且此界面也可以对已绑定的手机号码和RFID卡进行更换。本系统的界面使用Android写成,把用户需要求的数据传到C语言层,最后由C语言层操控硬件。而C语言和JAVA之间的通信侧是通过JNI来完成的。(如图1-2)图1-247 2总括2.1硬件本文所用到的主要硬件有:搭载Cortex-A8的GEC210嵌入式开发板,7英寸电阻屏,以及一块硬件拓展版。下面是智能家居系统原理图。2.1.1Cortex-A8本开发板GEC210搭载的主芯片为Cortex-A8,又名“蜂鸟”,是三星推出的一款适用于智能手机和平板计算机等多媒体设备的应用处理器,Cortex-A8和S5PC110功能一样,110小封装适用于智能手机,210封装较大,主要用于平板计算机和上网本。47 图2-1Cortex-A8采用了ARMCortexTM-A8内核,ARMV7指令集,主频可达1GHZ,64/32位内部总线结构,32/32KB的数据/指令一级缓存,512KB的二级缓存,可以实现2000DMIPS(每秒运算2亿条指令集)的高性能运算能力。ARMcortex-A8CPU原理如图2-1所示。2.1.2拓展板47 拓展版主要是为了拓展在GEC210上所没有的硬件需求,以满足智能家居的实验需要。具体包括:红外模块、继电器模块、步进电机、直流电机、气体传感器、温湿度传感器、光敏感测器、GPRS模块和RFID模块。原理图及IO引脚分配如图2-2所示:图2-22.1.3RFID模块芯片拓展版所用的RFID具体型号为MFRC522,是应用于13.56MHz非接触式通信中高集成度读写卡系列芯片中的一员。是NXP公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携式手持设备研发的较好选择。MFRC522利用了先进的调制和解调概念,完全集成了在13.56MHz下所有类型的被动非接触式通信方式和协议。支持ISO14443A的多层应用。其内部发送器部分可驱动读写器天线与ISO14443A/MIFARE卡和应答机的通信,无需其它的电路。接收器部分提供一个坚固而有效的解调和解码电路,用于处理ISO14443A兼容的应答器信号。数字部分处理ISO14443A帧和错误检测(奇偶&CRC)。此外,它还支持快速CRYPTO1加密算法,用于验证MIFARE系列产品。MFRC52247 支持MIFARE?更高速的非接触式通信,双向数据传输速率高达424kbit/s。2.2JNIJNI是JavaNativeInterface的缩写,中文名JAVA的本地调用。从Java1.1开始,JavaNativeInterface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java虚拟机实现。JNI在程序中作用的是Java和C的翻译,在本设计中起到的作用是,让C语言层得知Java的调用,以及把各种硬件信息通过实时刷新的方式不断反馈到Java中。关系如图2-3示:47 图2-347 3功能设计3.1主界面3.1.1温湿度监控显示显示温湿度是智能家居的最基本功能,通过荧幕用户可以随时从中获知当前的温度和湿度。由于温湿度显示并不需要触发事件,因此打开程序的时候就会自动触发。温湿度的显示需要不断地刷新,也为了方便其他数值的传递,我们定义了一个叫cflags的数组,定义clags的[1][2]是用于存放温湿度的数值。另外光感应驱动也在这里打开,方便在同一个地方把需要随时刷新的值都得到并及时更新到cflags里面去。在监控温湿度的线程中,首先根据驱动给的借口,取得温湿度传感器的档描述符fdtemperature,通过IO控制函数temperature_ioctl(fdtemperature,&cflags[1]);还有emperature_ioctl(fdtemperature,&cflags[0]);不断循环并取得当前的温湿度数值。在取得数值之后,通过安卓里面的handler随时刷新数值,而C层需要做的就是不断更新数组里面的所有数据并通过JNI传到上层以达到界面层和运算层的实时通信。首先需要在初始化时把HANDLER的属性对象保存起来,先定义两个全局变量jobjectg_obj=NULL;和JavaVM*g_vm=NULL;然后在JNI执行初始化是进行环境变量的保存(*env)->GetJavaVM(env,&g_vm);和g_obj=(*env)->NewGlobalRef(env,obj);在更新线程中释放之前保存的全局变量以便找到JAVA中的对象即对应的JAVA数组并转换上传,具体操作是:jclassgasdevclazz=(*g_env)->GetObjectClass(g_env,g_obj);jfieldIDfieldID=(*g_env)->GetFieldID(g_env,gasdevclazz,"flags","[I");47 jflags=(*g_env)->GetObjectField(g_env,g_obj,fieldID);jclassiclass=(*g_env)->GetObjectClass(g_env,g_obj);jmethodIDmethodId=(*g_env)->GetMethodID(g_env,iclass,"HandlerArray","(I)V");3.1.2在家模式和外出模式的切换由于在出门的时候用户经常需要关闭很多的用电器,整合一个外出模式就能为用户提供极大的便利。外出系统的主要功能是在用户切换到外出功能的10秒后,关闭室内的所有可控制用电器并打开所有可用警报的短信通知。在家模式和外出模式,根据界面需求,只设置一个触发动作的界面,具体操作是当用户按下外出模式按钮C语言层接受到触发命令,在C语言层通过利用pthread_create创建两个线程:第一个线程首先利用线程分离函数pthread_detach(pthread_self())进行线程的分离,使用sleep(10)等待10秒后,若10秒之内判断到外出模式的标志位cflags[3]依然是1,就通过包装过的驱动界面把用电器关闭,把标志红外入侵警报的cflags[4]和标志有毒气体警报的clags[5]都设置成短信通知,并把所有存储用电器状态值的cflags中的相关数值进行刷新,最后关闭线程;另一个线程则是负责不断监听RFID,也是先通过分离线程,然后使用while(1)不断循环,在循环体内打开rfid驱动,每0.5秒启动一次,用if判断语句当识别到用户绑定的ID卡时切换为在家模式把红外警报和气体警报标志位置成关闭状态,并关闭线程。工作原理流程图如3-1所示。47 等待10秒用户点击切换成外出模式关闭用电器并打开警报是否刷正确的ID卡切换成在家模式NY图3-1图3-13.1.3进入安防界面在进入安防界面的时候需要用到RFID卡的认证,为上层界面提供了一个触发界面,具体操作是当接收到界面传来的进入安防界面动作时,在C语言层开辟一个安防进入的线程,利用for循环轮询,每次循环相隔0.5秒,然后用if语句把存储有绑定的有效rfid卡ID的cfags[17]与rfid识别到的卡号进行比对,当一致时把cfags[6]置成ID卡号表示进入安防界面成功,如果在5秒内未能识别正确的ID卡号,就把cfags[6]置成1表示进入安防界面失败。如流程图3-2所示。47 NYYN点击进入安防界面弹出刷卡提示是否超过10秒是否识别正确ID卡进入安防界面失败成功进入安防界面图3-23.2闹钟闹钟是智能家居中一个重要的功能,此闹钟可以设定在24小时内使蜂鸣器发出一次声响,并且能够随时取消并重新设置。此界面给上层提供的界面是传递一个字符串,通过算法把字符串提取成数字并作为设定时间。若当前时间和设定时间一致则蜂鸣器动作。每次判断蜂鸣器是否动作之前都需要先判断标志位,看看用户是否取消闹钟。是的话就停止减少时间并跳出该段程序。具体操作是在初始化的时候先建立好闹钟线程(后面会说到闹钟线程还整合了其他功能),然后分离线程,通过time_ttp;和structtm*s_tm;定义时间结构体并且通过tp=time(NULL);和s_tm=47 localtime(&tp);两个函数取得当前时间,同时通过以下if语句判断:if(((cflags[16]/10000)==1)&&((s_tm->tm_hour)==(cflags[16]%10000/100))&&((s_tm->tm_min)==(cflags[16]%100)))其中cflags[16]中,后面四位是表示用户设定的时间和分钟,第一位是指是否设定闹钟的标志位,如果标志闹钟的clags[16]不为0而当前的时分与用户设定的时分又是一致的话,就直接通过蜂鸣器的包装驱动设置蜂鸣器的合适占空比和周期,并持续动作10秒,之后则把闹钟标志位clags[16]置0。该流程如图3-3所示:NYYN用户输入一个字符串串转换成设定时间是否取消闹钟是否到达设定时间闹钟取消蜂鸣器动作图3-33.3灯光灯光的直接控制就是通过用户直接点击上层按钮,传到下层直接打开驱动进行操作,操作完成后刷新标志位。可以每次控制一个LED灯或者是一次控制所有的LED灯,方便用户控制。47 在灯光界面我们给上层界面只需要提供一个界面,传进来一个int型数,就可以知道用户的意图,通过if语句判断,当传进来的数是13或者14,我们就把对应的房间或者客厅LED灯取反,如果传进来的数是0,就把所有LED灯关掉,1则是打开所有的LED灯,在开关后必须把标志灯光状态的标志位更新。另外,出于环保的考虑,我们默认设置了,当光照值大于4000的时候,灯光会自动关闭。3.4窗帘3.4.1光感监控用户在灯光界面可以看到当前的光照值,以便对光感控制窗帘中的光感强度有更具体的概念。由于这个监控也是不需要任何的触发动作,当用户切换到此页面是就会不断刷新数值,因此也不提供任何界面,而刷新光感的具体动作也是通过同一个HANDLER不断地取得在驱动中获取的当前光照值并上传到上层界面。3.4.2控制窗帘在窗帘界面提供直接窗帘的界面,只需要传递一个整数,0的时候打开,1的时候关闭,用户可以根据当前的光照值设定当光照值大于某设定值时,窗帘进行关闭动作,以及当前光照值少于设定值时,窗帘开启并屋内的灯光。具体操作也是在初始化的时候就建立并分离线程,用while(1)每隔两秒判断一次,我们把预设光感值cflags[9]初始值设为最大值5000,低于设定值开用语句if((cflags[7]==2)&&(cflags[8]==0)&&(cflags[9]>cflags[10]))进行判断,高于设定值关则用也是用一个类似的语句来判断,具体是:if((cflags[7]==1)&&(cflags[8]==1)&&(cflags[9]=3000)||(j==0)))这一判断语句判断是否打开了蜂鸣器警报并打开蜂鸣器的驱动接口,在其中又有两个判断语句if((j==0)&&(cflags[4]!=0))和if((k>=3000)&&(cflags[5]!=0))分别用来判断硬件的状态,当接受到信号时蜂鸣器动作。而短信警报则需要用if((k>=3000)&&(cflags[5]==2)&&((cflags[18]/10000)>=3600))和if((j==0)&&(cflags[4]==2)&&((cflags[18]%10000)>=3600))来分别判断是否触发短信警报,而每两次相同类型的短息警报,我们也有两个判断体去控制最少间隔10分钟才会再次触发警报以免短信的费用过高。47 3.6.2切换识别ID卡以及电话号码切换绑定号码会把原来保存的电话号码清除并更新为用户输入的新号码,以在需要发短信的时候使用。提供的界面会在上层界面接受一个字符串,只需通过memset()清空字符串和strcpy()复制字符串两个函数就可以直接把电话号码的字符串内容替换掉。RFID卡的切换,需要在10秒内将有效的新卡放到RFID传感器上,当切换成功时会有文字框提示。操作是首先在接口程序创建一个换卡的线程,打开RFID驱动用dowhile循环5次,当识别到有效的新ID卡替换掉掉旧的cflags[17]储存的ID卡号,并把标志换卡状态的cflags[19]置位成表示成功的2,失败的话就把cflags[19]置位成表示失败的1。47 4.驱动及界面包装我们全部驱动采用的驱动模型是字符驱动。字符驱动是linux里面最为简单的一种驱动模型。这里为了使用缩短开发周期,我们注册了比较方便的杂项设备驱动的写法来写led灯的驱动。杂项设备(misc)是linux里面已经写好的一个设备,我们只要把驱动注册到该设备中,那么不用多余的语句,linux就会帮我们挂在驱动,创建驱动设备节点。4.1LED粗略介绍下led灯设备驱动的编写流程:1.在把led_ini和led_exit两个函数设定位驱动初始化函数和驱动卸载函数。2.在led_init函数中,我们要申请led的gpio口并注册,最后我们需要把定义好的杂项设备的结构体(my_misc)注册到杂项设备。3.定义用界面(用户程控LED亮灭),这里我们使用了ioctl函数控制LED灯.用户使用ioctl函数讲需要的操作的灯和熄灭信息传进来就能控制led了。4.定义卸载函数led_exit释放刚刚申请了的gpio,最后我们取消驱动与杂项设备取消关联状态。47 4.2GPRSGPRS是一个sim卡通信模块,同过它我们可以发短信,打电话。开发板与GPRS模块通信使用的是串口2.同样在使用串口2时,我们需要按需求利用ioctl改变串口2的工作方式和串列传输速率。然后利用writer函数向串口2写入相关命令就可以使用GPRS模块了。例如“AT+CMGS="目的手机号码" 短信内容+”为向某手机发送短信。47 4.3直流电机直流电机驱动也是使用字符设备,并且注册的是杂项设备,所以这里就不再累述驱动的编写流程。这里主要叙述直流电机的驱动控制流程直流电机使用了两个gpio。这里命名为gpio1,gpio2.当gpio1,gpio2都为低电平时或都为高电平时直流电机停转。当gpio1高电平,gpio2低电平直流电机正转,当gpio1低电平,gpio2高电平直流电机反转所以我们只需要利用ioctl控制两个gpio口的电平转换就能控制直流电机的运行状态。步进电机步进电机驱动同样步进电机驱动使用字符设备中的砸向设备。步进电机控制流程如下:这里我们需要使用到4个gpio口。我们定义为gpio1,gpio2,gpio3,gpio4。47 开始时,开关gpio2接通电源,gpio1、gpio3、gpio4断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。当开关gpio3接通电源,gpio2、gpio1、gpio4断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。所以按顺序通过ioctl每隔一段时间给一个gpio口高电平,其他低电平,这样就可以使步进电机顺转或反转了。47 4.4蜂鸣器蜂鸣器驱动使用的也是字符设备中的杂项设备模型。以下为蜂鸣器的控制流程:首先蜂鸣器使用了一个gpio口控制他的开关,然后使用到了pwm的技术,那么pwm最为关键的就是它的周期与占空比,在a8中有专门的设置周期与占空比的寄存器。那么我们只需要通过writer函数改写周期与占空比,然后使用ioctl函数打开关闭蜂鸣器。就可以让蜂鸣器响起我们需要的响声效果。47 4.5RFIDRFID就是现在市面上比较流行的刷卡门禁。我们使用RFID是同过串口读取RFID模块中的数据的,因为linux内核已近写好串口驱动,我们这里就不用再写一遍,我们只需要按需求通过ioctl改变串口的串列传输速率和工作方式,然后利用read函数读取数据就行了。RFID使用的是串口1。47 RFID原理简易图5.总结智能家居是系统性的产品,主要有控制器和执行器组成。其中该系统的通讯模式、系统构架、系统功能等是关键的。市场主流智能家居产品的通讯模式大概有10多种。其中不乏各种国际标准和国家标准的。所以,你断难取舍源自你题目太大而无法落地。用Zigbee方式做家居内的I/O控制,有成熟的250KZigbee解决方案,如果你水平高,可以尝试做1MZigbee的I/O+简单音视频智能家居系统。论文好办,解决了物理模型后,直接把解决方案中的芯片介绍60%+你的开发感受40%写进去即可。补充说明:简易智能联动控制产品设计,也可以考虑“人体红外感应”,可广泛应用于走道、玄关、卫厨、衣柜等处灯光甚至设备开关控制。资料、IC、方法等可以百度“电子设计KT-0003”,20块钱1个。如果能将433Mhz的无线收发(市面很多解决方案,关键是这种融合的思路是一种创新)做进去,还能实现逻辑联动。47 致谢经过长期的忙碌和工作,本次毕业设计已经接近尾声,作为一个本科生的毕业设计,由于经验的匮乏,难免有许多考虑不周全的地方,如果没有导师的督促指导,以及一起工作的同学们的支持,想要完成这个设计是难以想象的。在这里首先要感谢我的指导黄景旺老师。黄老师平日里工作繁多,但在我做毕业设计的每个阶段,从查阅资料到设计草案的确定和修改,中期检查,后期详细设计,装配草图等整个过程中都给予了我悉心的指导。我的设计较为复杂烦琐,但是黄老师仍然细心地纠正图纸中的错误。除了敬佩黄老师的专业水平外,他的治学严谨和科学研究的精神也是我永远学习的榜样,并将积极影响我今后的学习和工作。其次要感谢我的同学对我无私的帮助,特别是在软件的使用方面,正因为如此我才能顺利的完成设计,我要感谢我的母校——东莞理工学院,是母校给我们提供了优良的学习环境;另外,我还要感谢那些曾给我授过课的每一位老师,是你们教会我专业知识。在此,我再说一次谢谢!谢谢大家!!!。47 参考文献:[1]智能家居控制系统周洪、胡文山、张立明、卢亦焱中国电力出版社(2006-01出版)[2]智能家居设计与施工顾牧君同济大学出版社(2004-10出版)[3]妙妍;智能家居—家庭自动化[N];中国建设报;2003年[4]陈培料;智能家居控制系统[D];华东师范大学;2010年[5]赵舒迪;徐熙平;王维;;基于ARM嵌入式技术和模糊控制的光学调制系统设计[J];长春理工大学学报(自然科学版);2010年03期[6]李建勇;杜清珍;任献伟;吴金涛;;基于ARM的智能家居安防监控报警系统的设计[J];机械与电子;2008年10期[7]文全刚.嵌入式Linux操作系统原理与应用.北京:北京航空航天大学出版社2011.66-249.[8]谭浩强.C程序设计[M].北京:清华大学出版社.2010.16-354.[9] Borko H, Bernier C. L. Indexing concepts and methods[M]. New York: Academic Pr., 1978.167-168. [10] SajalK.Das.MobilityandResourceManagementinSmartHomeEnvironments.LectureNotesinComputerSecience..2004,1109-1111附JNI源代码:47 #include#include"Myhead.h"#include#include#include#include#include#include#include#include#include#include#include#includevolatileintcflags[30]={0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};jintArrayjflags;charshoujihaoma[20]="0";jobjectg_obj=NULL;JavaVM*g_vm=NULL;sem_tsemcl;sem_tsemc2;pthread_mutex_tgprs_rfid_mutex;voidinitall(){intfd=ledopen();LOGI("%d...........1/n",fd);inti,j=1;for(i=1;i<9;i++)ledset(fd,i,&j);ledclose(fd);LOGI("%d...........2/n",fd);cflags[11]=0;cflags[13]=0;cflags[14]=0;cflags[3]=0;cflags[4]=0;cflags[6]=0;cflags[5]=0;cflags[7]=0;47 cflags[8]=0;cflags[9]=5000;cflags[10]=0;cflags[12]=0;cflags[15]=30;cflags[16]=0;cflags[17]=-1;cflags[18]=36003600;cflags[19]=0;fd=light_open();light_ioctl(fd,&j);light_close(fd);cflags[10]=j;fd=beeopen();beeoff(fd);beeclose(fd);fd=motor_open();motor_stop(fd);motor_close(fd);sem_init(&semcl,0,1);sem_init(&semc2,0,1);pthread_mutex_init(&gprs_rfid_mutex,NULL);return;}void*main_pthread(void*argc){pthread_detach(pthread_self());JNIEnv*g_env;if((*g_vm)->AttachCurrentThread(g_vm,&g_env,NULL)!=JNI_OK){returnNULL;}intfdtemperature=temperature_open();intfdlight=light_open();intfdled=ledopen();jclassgasdevclazz=(*g_env)->GetObjectClass(g_env,g_obj);47 jfieldIDfieldID=(*g_env)->GetFieldID(g_env,gasdevclazz,"flags","[I");jflags=(*g_env)->GetObjectField(g_env,g_obj,fieldID);jclassiclass=(*g_env)->GetObjectClass(g_env,g_obj);jmethodIDmethodId=(*g_env)->GetMethodID(g_env,iclass,"HandlerArray","(I)V");while(cflags[0]!=2){temperature_ioctl(fdtemperature,&cflags[1]);light_ioctl(fdlight,&cflags[10]);cflags[10]=4095-cflags[10];(*g_env)->SetIntArrayRegion(g_env,jflags,0,30,cflags);(*g_env)->CallVoidMethod(g_env,g_obj,methodId,10);if((cflags[15]/100!=0)&&(cflags[15]%100DetachCurrentThread(g_vm);cflags[0]=1;return(void*)0;}void*setctrlcl1(void*argc);void*naozhong1(void*argc);void*Mysocket(void*argc);void*shoumsg(void*argc){pthread_detach(pthread_self());47 while(1){sleep(10);pthread_mutex_lock(&gprs_rfid_mutex);if(ReceiveMes("1")==-2){DeleteMes("1");pthread_mutex_unlock(&gprs_rfid_mutex);continue;}intj;for(j=0;j<3;j++)DeleteMes("1");charbuf[23]="+86";strcat(buf,shoujihaoma);if(strcmp(gprs_mesbuf[0],buf)!=0){pthread_mutex_unlock(&gprs_rfid_mutex);continue;}if(strcmp(gprs_mesbuf[2],"openair")==0){intledfd=ledopen();inti=0;ledset(ledfd,8,&i);ledclose(ledfd);cflags[11]=1;SendMes("openairok",shoujihaoma);}pthread_mutex_unlock(&gprs_rfid_mutex);}return(void*)0;}JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_initall(JNIEnv*env,jobjectobj,jintArrayintArray){if(cflags[0]==0){47 initall();cflags[0]=3;}else{cflags[0]=2;while(cflags[0]!=1);}jflags=intArray;(*env)->SetIntArrayRegion(env,jflags,0,16,cflags);(*env)->GetJavaVM(env,&g_vm);g_obj=(*env)->NewGlobalRef(env,obj);pthread_tpt1;pthread_create(&pt1,NULL,main_pthread,NULL);if(cflags[0]==3){pthread_tpt2;pthread_create(&pt2,NULL,setctrlcl1,NULL);pthread_tpt3;pthread_create(&pt3,NULL,naozhong1,NULL);pthread_tpt4;pthread_create(&pt4,NULL,shoumsg,NULL);pthread_tpt5;pthread_create(&pt5,NULL,Mysocket,NULL);}return;};JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_zidongmoshi(JNIEnv*env,jobjectobj,jinti){cflags[3]=i;}47 JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_setlight(JNIEnv*env,jobjectobj,jinti){cflags[9]=i;}void*setctrlcl1(void*argc){pthread_detach(pthread_self());intfd=stepmotor_open();intj;while(1){sleep(2);if((cflags[7]==1)&&(cflags[8]==1)&&(cflags[9]cflags[10])){if(sem_trywait(&semcl)<0)continue;for(j=0;j<12;j++)stepmotor_forward(fd,20);cflags[8]=1;sem_post(&semcl);}if((cflags[8]==1)&&(cflags[10]>=4000)){intfd=ledopen();j=1;ledset(fd,6,&j);ledclose(fd);cflags[13]=0;}47 }stepmotor_close(fd);return(void*)0;}JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_setctrlcl(JNIEnv*env,jobjectobj,jinti){cflags[7]=i;}void*setctrlcl2(void*argc){pthread_detach(pthread_self());inti=(int)argc;intfd=stepmotor_open();intj;if(i==1){for(j=0;j<12;j++)stepmotor_forward(fd,20);}else{for(j=0;j<12;j++)stepmotor_rollback(fd,20);}stepmotor_close(fd);cflags[8]=i;sem_post(&semcl);return(void*)0;}JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_setctrlcl2(JNIEnv*env,jobjectobj,jinti){47 if(i==cflags[8])return;if(sem_trywait(&semcl)<0)return;pthread_tpt1;pthread_create(&pt1,NULL,setctrlcl2,(void*)i);return;}JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_setled(JNIEnv*env,jobjectobj,jinti){intfd=ledopen();intj;if(i==13){cflags[13]=!cflags[13];j=!cflags[13];ledset(fd,6,&j);}if(i==14){cflags[14]=!cflags[14];j=!cflags[14];ledset(fd,5,&j);}if(i==0){j=1;ledset(fd,5,&j);ledset(fd,6,&j);cflags[13]=0;cflags[14]=0;}if(i==1){j=0;ledset(fd,5,&j);ledset(fd,6,&j);cflags[13]=1;cflags[14]=1;}ledclose(fd);47 }void*naozhong1(void*argc){pthread_detach(pthread_self());time_ttp;structtm*s_tm;intfd=beeopen();intfd2=hongwai_open();intfd1=gas_open();intfd3=motor_open();intfd4=ledopen();intj,k;while(1){tp=time(NULL);s_tm=localtime(&tp);gas_iotcl(fd1,&k);if((k>3000)&&(cflags[12]!=2)){motor_foreward(fd3);cflags[12]=1;}elseif(cflags[12]==1){motor_stop(fd3);cflags[12]=0;}if(((cflags[16]/10000)==1)&&((s_tm->tm_hour)==(cflags[16]%10000/100))&&((s_tm->tm_min)==(cflags[16]%100))){beeon(fd);beeDutyCycle(fd,0.5);beeCycle(fd,1.0);sleep(10);beeoff(fd);cflags[16]=cflags[16]%10000;}hongwai1_iotcl(fd2,&j);47 if(((cflags[4]!=0)||(cflags[5]!=0))&&((k>=3000)||(j==0))){beeon(fd);if((j==0)&&(cflags[4]!=0)){beeDutyCycle(fd,0.5);beeCycle(fd,0.5);}if((k>=3000)&&(cflags[5]!=0)){beeDutyCycle(fd,0.5);beeCycle(fd,0.5);}if((k>=3000)&&(cflags[5]==2)&&((cflags[18]/10000)>=3600)){cflags[18]=cflags[18]%10000;pthread_mutex_lock(&gprs_rfid_mutex);SendMes("gasorfirewarning",shoujihaoma);pthread_mutex_unlock(&gprs_rfid_mutex);}if((j==0)&&(cflags[4]==2)&&((cflags[18]%10000)>=3600)){cflags[18]=cflags[18]/10000*10000;pthread_mutex_lock(&gprs_rfid_mutex);SendMes("invade",shoujihaoma);pthread_mutex_unlock(&gprs_rfid_mutex);}if((j==0)&&(cflags[4]!=0)){inti=0;for(j=0;j<50;j++){ledset(fd4,7,&i);i=!i;usleep(200000);}}if((k>=3000)&&(cflags[5]!=0)){inti=0;for(j=0;j<50;j++)47 {ledset(fd4,7,&i);i=!i;usleep(200000);}}hongwai1_iotcl(fd2,&j);beeoff(fd);//关bee}if((cflags[18]%10000)<3600)cflags[18]+=1;if((cflags[18]/10000*10000)<3600)cflags[18]+=10000;sleep(2);}beeclose(fd);gas_close(fd1);motor_close(fd);hongwai_close(fd2);}JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_setnaozhong(JNIEnv*env,jobjectobj,jinti){cflags[16]=i;}JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_setkongtiao(JNIEnv*env,jobjectobj,jinti){intj,fd=ledopen();intfd1=motor_open();switch(i){case0:cflags[11]=1;j=0;ledset(fd,8,&j);break;case1:cflags[11]=0;j=1;ledset(fd,8,&j);break;case2:cflags[12]=2;47 motor_rollback(fd1);break;case3:cflags[12]=0;motor_stop(fd1);break;}motor_close(fd1);ledclose(fd);}JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_setanfang(JNIEnv*env,jobjectobj,jinti){intfd=hongwai_open();intj;intfd1=gas_open();switch(i){case3:hongwai1_iotcl(fd,&j);cflags[4]=0;break;case2:hongwai1_iotcl(fd,&j);cflags[4]=1;break;case1:hongwai1_iotcl(fd,&j);cflags[4]=2;cflags[18]=cflags[18]/10000*10000+3600;break;case6:gas_iotcl(fd1,&j);cflags[5]=0;break;case5:gas_iotcl(fd1,&j);cflags[5]=1;break;case4:gas_iotcl(fd1,&j);cflags[5]=2;cflags[18]=36000000+cflags[18]%10000;break;47 }gas_close(fd1);hongwai_close(fd);}JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_sethaoma(JNIEnv*env,jobjectobj,jstringstr){constchar*tmp=(*env)->GetStringUTFChars(env,str,0);memset(shoujihaoma,0,sizeof(shoujihaoma));strcpy(shoujihaoma,tmp);}void*huanka(void*argc){inti=0,j=0;do{i=rfid();j++;}while((i==0)&&(j<5));if(i!=0){cflags[17]=i;cflags[19]=2;}elsecflags[19]=1;return(void*)0;}JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_huifuflags(JNIEnv*env,jobjectobj,jintno,jintdata){cflags[no]=data;}JNIEXPORTjintJNICALLJava_com_example_CtrHome_GasDev_setrfid(JNIEnv*env,jobjectobj){inti=0;pthread_tpt1;pthread_create(&pt1,NULL,huanka,NULL);47 returni;}void*anfangjinru(void*argc){pthread_detach(pthread_self());inti,j;for(i=0;i<10;i++){usleep(500000);if(rfid()==cflags[17]){cflags[6]=cflags[17];returnNULL;}}cflags[6]=1;returnNULL;}JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_anfangjinru(JNIEnv*env,jobjectobj){cflags[6]=0;pthread_tpt1;pthread_create(&pt1,NULL,anfangjinru,NULL);}void*waichumoshi(void*argc){pthread_detach(pthread_self());while(1){if(rfid()==cflags[17]){cflags[4]=1;cflags[5]=1;cflags[3]=0;returnNULL;}usleep(500000);}}47 void*waichumoshi2(void*argc){pthread_detach(pthread_self());sleep(10);if(cflags[3]==0)returnNULL;intfd=ledopen();inti,j=1;for(i=1;i<9;i++)ledset(fd,i,&j);ledclose(fd);cflags[13]=0;cflags[14]=0;cflags[11]=0;fd=beeopen();beeoff(fd);beeclose(fd);fd=motor_open();motor_stop(fd);motor_close(fd);cflags[12]=0;fd=stepmotor_open();cflags[7]=0;if(cflags[8]==1){sem_wait(&semcl);for(j=0;j<12;j++)stepmotor_rollback(fd,20);cflags[8]=0;sem_post(&semcl);}stepmotor_close(fd);cflags[4]=2;cflags[5]=2;cflags[18]=36003600;cflags[15]=cflags[15]%100+100;returnNULL;47 }JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_waichumoshi(JNIEnv*env,jobjectobj){pthread_tpt1;pthread_create(&pt1,NULL,waichumoshi,NULL);pthread_tpt2;pthread_create(&pt2,NULL,waichumoshi2,NULL);}JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_setwendu(JNIEnv*env,jobjectobj,jinti){if(i>100)return0;cflags[15]=cflags[15]/100*100+i;}JNIEXPORTvoidJNICALLJava_com_example_CtrHome_GasDev_setwendu1(JNIEnv*env,jobjectobj,jinti){cflags[15]=cflags[15]%100+i*100;}47