版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章绪论1.1课题研究背景及意义随着社会的不断发展,生活质量的提高,人们对于自己所居住的室内环境有了不断的追求,现代所采用的装修材料中有很多含有有害物质,这些有害物质挥发为气体导致室内环境质量下降,直接危害到人体的身体健康。但是各类室内装饰及装修材料中往往含有大量的甲醛等有害物质,这些有害物质在室内久久不能散去,直接对人们的身体健康造成了影响。如果人们生活在PM2.5或者甲醛超高的地方,可能就会造成不同程度的头晕、恶心、失眠等症状,这是因为甲醛对于人们的神经系统有一系列的干扰。目前市场上的室内环境监测仪种类繁多,相对功能比较单一化,同时价格也较贵,所以对功能多元化的多参数综合环境监测系统的设计有所需要[1]。现代生活中,人们对于身体健康更为注重,尽管对家具、建材等各类装修所需材料的环保性要求更高,但是仍然避免不了受到甲醛等有害气体的影响。由于甲醛无色无味,但是对身体健康影响较大,所以在室内安全甲醛测量仪和通风设备,可有效增加人们的健康指数。在我国,对于环境监测系统的研究开始较晚,大约始于20世纪的80年代,当时的生产力水平较低,科技并不发达,技术设备也比较落后,因此对环境系统的研究能力及水平也有限,大部分相关的设备都需要从国外引进,而且研究的经费较高,对于研究者的素质要求也高,环境监测系统很难大规模的推广和使用,近年来,我国吸收借鉴了国外的先进技术,在此基础上加以改进,已经取得了较大的成效,研究环境监测的工作人员目前已经熟练掌握了环境技术,取得了突飞猛进的发展。随着科技及传感器技术的不断发展,将单片机技术应用到环境的检测中的设计也在不断的研究和发展中[2]。由此可见,对于室内控制质量的检测是非常有必要的。因此本设计针对室内环境的技术指标需求,使用pm2.5传感器和VOC传感器对室内pm2.5和甲醛体监测为主要手段,对有害气体进行数据采样后根据预设值可在手机上进行数据显示,同时将数据通过蓝牙模块反馈至手机中。1.2课题研究现状随着科技及传感器技术的不断发展,将单片机技术与无线技术相结合的环境监测系统也在不断的研究和发展中。广西民族大学的邢凯在基于单片机的室内无线环境监测系统设计与应用一文中,针对人们长期居住的室内及工作场所设计了一款以STC89C52单片机作为核心的无线环境监测系统,该系统利用DHT21温湿度传感器实时采集室内的温湿度,MS1100传感器实时检测甲醛浓度,将检测到的数据通过NRF905无线收发模块以无线的方式发送到PC端来处理,并可将数据处理显示,如果检测到温湿度值或者甲醛浓度已经高于设定的标准值时,蜂鸣器发出报警,避免空气污染对人体出现的危害。该系统可进行无线传输,可靠性高,适用于室内环境的测量与监控[3]。2017年王永顺,闫等人在基于nRF905的无线环境监测系统设计与实现的文章中,介绍了一款采用NRF905无线收发模块作为无线传输模块的温度、湿度检测与传输系统,该系统所采用的单片机型号为STC89C52单片机,利用精度较高的DS18B20传感器和DHT11传感器分别检测温度和湿度,再将采集到的温度及湿度数据通过NRF905传输给接收部分,通过OLED屏实时显示数据。该系统具有传输速率高、软硬件设计简单,通信稳定等特定[4]。国外目前已经开始发展研究长光程吸收光谱仪,这种设备以激光光源为基础进行检测,灵敏度更高,但是目前处于测试的阶段。同时,激光雷达等可以在距离较远的范围内进行实时测量的技术,已经应用到环境检测中,可以实时测量范围较广的区域,得到了国际范围内的重视,已经成为空气环境监测方面的系统发展的目标,给环境监测的创新提供了新方向[5]。另外将卫星测试、地面观测相结合,向轨迹模型、空气质量预报模型构建天地空一体化的大气环境监测和预报系统,可对大气环境形成一个立体的、全方位的认识,这也是目前环境空气质量自动监测系统的发展趋势之一。综上所述,将单片机技术与无线技术相结合的环境系统会不断的向微型化、高稳定性、抗干扰性、易开发的方向迅速发展。1.3本文研究内容及章节安排本文主要研究的是一种可以准确检测室内空气质量,对室内的PM2.5浓度及甲醛浓度进行检测,并将检测到的数据通过蓝牙模块发送给手机APP端实时监控,主要对系统的功能、软件部分、硬件设计都做了详细的介绍,论文的具体章节安排如下所示:第一章是绪论,主要对空气质量监测系统的研究背景、研究意义、论文的研究内容和章节如何安排做阐述,为其余章节做铺垫。第二章是系统的方案设计,主要对空气质量监测系统的硬件结构组成做了详细的说明,并绘制系统结构图,通过对元器件特性、性价比、功能等各方面条件的可对比,选择出最佳元器件方案。第三章为系统的电路设计,主要对空气质量监测系统的各电路做详细的介绍,每个电路如何连接做了详细的说明。第四章为系统的软件设计,主要对系统的主程序如何设计、各模块子程序如何设计做了简要介绍,并根据主程序的流程绘制出主程序流程图,各模块的工作流程绘制出子程序流程图。第五章为系统的测试,在完成系统的硬件设计及软件设计后,可对实物的功能进行测试并将实物的演示步骤拍照记录,系统调试成功。第六章为总结,主要对系统完成了哪些功能进行总结并对存在的问题、不足及可扩展的功能进行展望。
第二章系统方案设计在本章中将对系统功能进行分析,并根据系统功能对系统的总体框图进行设计,再对完成系统功能所需的元器件型号进行选择。2.1系统功能需求室内环境的质量对于人体的身心健康有着直接的影响,在不外出的情况下,室内的光照、温度都对舒适性有着较大的影响,因此,对于室内环境的实时检测可以给人们提供很大的参考。根据目前人们对于室内环境监测系统的需求,本设计预计实现以下功能:室内环境质量监测仪采用单片机和Java开发的APP作为的核心控制部,其主要实现功能如下:1、PM2.5检测功能:采用pm2.5检测模块实时采集室内的pm2.5浓度;2、甲醛检测功能:采用甲醛传感器实时检测室内的甲醛浓度;3、与手机APP连接功能:通过无线传输模块将系统与手机APP相连接,检测到的PM2.5浓度与甲醛浓度可通过手机APP显示出来;4、报警功能:通过按键可设置甲醛浓度及PM2.5浓度的上限,在任一项数据过高时,蜂鸣器会发出声光报警,手机APP也会提示浓度过高;5、电子钟功能:通过DS1302时钟芯片对时间进行存储,显示屏会显示当前的时间,时间可以通过按键校正。2.2系统总体框图设计根据以上功能需求分析,系统需要实现PM2.5检测功能、甲醛检测功能、与手机APP的连接功能、报警功能及电子钟功能。本系统为室内环境质量监测仪,系统由电源模块、主控制器模块、PM2.5检测模块、甲醛检测模块、按键模块、AD检测模块、DS1302时钟模块组成。系统总体框图设计如图2-1所示。
电源模块电源模块PM2.5传感器主控制器PM2.5传感器主控制器显示模块显示模块甲醛传感器AD转换模块甲醛传感器AD转换模块通信模块手机APP通信模块手机APPDS1302DS1302报警模块报警模块图2-1系统整体框图设计2.3主要器件选择与论证根据以上对室内环境质量监测仪的功能要求概述及系统总体框图的设计,需要对系统所需核心器件进行选择,下面将对主控器、PM2.5检测模块、AD转换模块、甲醛检测模块、显示模块及通信模块选择出两种方案进行对比,从传感器模块的参数、性能、价格等各方面实行方案对比,选择出最佳型号器件。2.3.1主控芯片的选择与论证方案一:FPGA的开发与传统的单片机、PC机相比较有着很多的不同。对于FPGA的开发,主要以运算的方式为主,采用硬件来实现对语言的描述。相对于个各结构的单片机、PC机,在开发必须从顶层设计、软硬件的调试、逻辑实现等多方面着手,开发入门非常困难[6]。方案二:单片机是一种常见的主控制芯片,与其它芯片相比,单片机的体积小、功耗低、使用更为方便、控制力强,这些优点促使单片机成为仪器、仪表、现代通信设备等多方面的主控芯片,运用非常广泛。单片机可以方便的与计算机实现数据的互相通信,且单片机编程较为简单,支持C语言、汇编等多种语言,入门简单,且具有超高性价比[7]。通过对比,单片机入门容易,编程简单,FPGA开发极为复杂,不容易开发,因此通过对比选择单片机作为系统的主控芯片。2.3.2主控制器的选择与论证方案一:STM32F103C8T6单片机属于ARM内核版本的单片机,有32位的闪存,运行及工作的速度都很快,接口较为简单,具有实时性、高性能、功耗低、所需电压低的优点,单片机具有很强的集成性,开发更为简单,STM32F103C8T6单片机采用是内核为ARMCORTEX-M,外设也属于一流水平,功耗和集成度方面也有着不俗的一面,但是开发难度较大,不适用于单片机初学者使用[8]。方案二:STC89C52RC单片机是STC公司在近些年来退出的一款CMOS8的单片机,具有低功耗、高性能的热点。虽然单片机内部所使用的内核依然是51系列单片机经典的内核MCS-51,但是在传统的51单片机上有所改善,CPU有为8位,开发容易,可以为嵌入式应用系统提供有效灵活的开发方案。结论:通过以上的对比,虽然STM32F103C8T6单片机的性能更为强大,外设一流,但单片机的开发难度较大,而STC89C52单片机不但在性价比上高于STM32单片机,且编程简单,容易开发,因此选择STC89C52单片机。2.3.3PM2.5检测模块的选择与论证方案一:MQ2烟雾传感器可以灵敏的检测到可燃气体,且反应较快,在使用中的稳定性极强,且连线简单,无论是软件控制还是硬件控制都很方便。另外,MQ2传感器也可以检测液化气体、天然气等,即使是多种气体混合在一起,MQ2也可以轻而易举的排除掉其它气体,检测出混合气体中的可燃气体。方案二:夏普GP2Y1010AU0F传感器采用光学检测的方式可以灵敏的检测出空气内的粉尘、PM2.5等有害气体,空气中的粉尘类的有害颗粒会反射出光,传感器恰好利用了这一反射原理,准确的检测出空气中的粉尘,即使是非常微小的烟草、烟雾的颗粒也能被检测到,非常适用于空气净化[9]。结论:MQ2传感器在检测烟雾及可燃气体方面更为灵敏,但是无法检测出PM2.5浓度,夏普GP2Y1010AU0F传感器可准确的检测出空气中的PM2.5浓度,因此选择方案二中的GP2Y1010AU0F传感器。2.3.4通信模块的选择与论证方案一:ESP8266WIFI模块,是常见的一种无线模块之一,具有体积小、价格低廉、检测距离远等优点,仅仅指甲盖大小的传感器可镶嵌于各种产品中,内部含有LWIP协议实现WIFI搜索连接,兼容P模式、STA模式与AP+STQ这3种无线模式,AT指令方便实时发送与接收,方便用户使用开发,但是只有在有网络热点的情况下才能使用,如果没有网络则不能启动模块与系统之间的无线连接。方案二:蓝牙模块HC-05的协议为标准的V2.0协议,不同的波特率可以匹配不同的设备,用户可根据相对应的波特率进行选择,蓝牙的连接状态通过观察即可得出,未连接状态下模块的指示灯是快闪的状态,在连接设备的状态下指示灯会有节奏的慢闪,蓝牙连接后可进入AT指令。蓝牙技术目前使用已经非常广泛,大部分手机、电脑等设备均可与蓝牙相连接[10]。结论:通过综合的比较,ESP8266WIFI模块与蓝牙模块HC-05均可实现无线传输,WIFI模块在有网络热点的情况下才可以使用,HC-05仅可用于具有蓝牙装置的设备,可实现点对点通信,适用于与手机APP通信,因此选用方案二中的蓝牙模块。2.3.5显示模块的选择与论证方案一:ZLG7290数码管内部含有显示RAM,可以自动实现动态显示,将所需要显示的内容在数码管上实时显示。ZLG7290数码管与单片机通过内部的I2C串行接口相连接,无论是8位数码管还是64位独立的LED灯均可驱动。采用数码管作为显示器件的设备在数字上更为直观,如果需要显示数字,可选择该显示模块[11]。方案二:LCD1602液晶显示模块与单片机相连接所采用的是标准的16引脚接口,在硬件电路的设计与焊接中较为方便。可用于显示字符、字母及数字等多种显示模式。内部显示是由几个5*7或5*11的点阵字符构成的,无论是每位字符还是每行之间都有字符间隔与行间隔。体积小、超薄轻巧,且可以显示丰富的内容。结论:ZLG7290数码管更适用于显示数字,如果在本设计的现实中只显示数字,用户无法判断是哪种气体浓度。而LCD1602可显示字符、数字,显示内容更为丰富,在使用过程中更为方便,因此选择方案二中的LCD1602液晶显示屏。2.3.6甲醛检测模块的选择与论证方案一:CJMCU-100甲醛传感器主要用于对甲苯、苯、甲醛等挥发性有机化合物,传感器属于半导体类型,灵敏度极高稳定性好,精度在0.1ppm,可以轻松侦测0.1ppm以上的气体,如果在空气检测中需要检测甲醛等有机挥发气体,小巧的体积可广泛用于各设备上容易镶嵌,价格便宜,是一款高灵敏、高性价比的甲醛检测模块[12]。方案二:KB03型空气质量检测模块是一种半导体气敏元件,可用于检测一氧化碳、酒精、氨气、烟雾等挥发气体,在检测的过程中具有很高的灵敏度,长期稳定性优异,在出场时就已经标定校准,使用中无需再校准。传感器寿命长、使用功耗较低。但是在甲醛检测方面较弱,灵敏度不高。结论:通过两种传感器的对比,CJMCU-100甲醛传感器可专门用于检测空气中的甲醛浓度,KB03型空气质量检测模块检测甲醛方面较弱,本系统中需要检测甲醛,因此通过对比选择CJMCU-100甲醛传感器。2.3.7AD转换模块的选型方案一:ADC0832转换芯片是一款具有8位分辨率的A/D转换芯片,256级的最高分辨率可以满足大部分的模拟换转换需求。模块的模拟输出电压在0-5V之间,通过仅32μS就可以实现转换,内部的双数据输出可减少模拟转换的误差,转换速度快并具有很强的稳定性[13]。方案二:PCF8591是一款单独供电的低功耗A/D转换芯片,模块具有4个模拟输入接口、1个模拟输出接口和1个I2C总线的接口。PCF8591内部引脚可用于实现硬件地址的编程,并可以在无需额外硬件的情况下允许同一个I2C总线接入器件,但是电路较为复杂,稳定性不强。结论:通过对两款模块的比较,ADC0832转换模块具有很强的稳定性,并能满足本系统中对于模拟转换的要求,PCF8591需要单独供电且电路复杂,因此选择方案一中的ADC0832转换模块。
第三章系统硬件电路的设计通过元器件的选型,根据各型号器件的引脚功能对系统的硬件电路进行设计,系统硬件电路主要包括STC89C52单片机的最小系统电路设计、LCD1602液晶显示屏显示电路设计、蓝牙模块的电路设计、PM2.5传感器的电路设计、甲醛传感器的电路设计及步进电机的电路设计。下面将对各器件及传感器电路如何连接做详细的介绍。3.1单片机最小系统电路设计系统所采用的核心控制单片机型号为STC89C52,STC89C52单片机的特点如下,FLASH有8K,内部RAM为512字节,I/O口线为32位,单片机的外部中断有4个,内部存储有4KB,可进行全双工工作。另外单片机也具有掉电保存、节点等功能。CPU在空闲的模式下停止工作,但CPU内部的定时器、中断、串口等可继续保持工作状态,而在掉电保护的模式下,单片机停止工作,振荡器将不再发生作用,直到单片机接收到下一个中断指令或者硬件被复位。单片机的最高运作频率可达到35MHZ,另外单片机程序可直接使用串口下载。3.1.1晶振电路设计在本系统中,STC89C52单片机所连接的晶振电路的作用的非常大的,主要作用为连接单片机内部的电路产生时钟的频率,从而提高单片机的运行速度,晶振为单片机提供的时钟的频率直接影响到单片机的处理和运行速度,因此,晶振电路所提供的时钟频率也是单片机执行指令的基础[14]。在晶振电路的设计中,单片机的XTAL2引脚与XTAL1引脚分别连接11.0592晶振引脚的两端,连接30PF的电容滤波,再连接系统电路的GND端,共同组成晶振电路。晶振电路设计如图3.1所示。图3-1晶振电路设计3.1.2复位电路设计在本系统中添加了一个复位电路,单片机的复位电路简而言之就是将单片机的电路进行初始化,在单片机的内部对单片机复位后就会把一些寄存器和存储设备恢复到厂商的预设值。如果单片机的程序有120行,在程序运行到60行时程序突然卡死或者系统出现停电问题,这时候单片机内部的数据就有丢失的可能,有些数据可以不回丢失,如果想要下次再上电时系统正常运行,因此在上电后单片机内部就会重新初始化,这个过程就可以理解成为复位的过程,上电复位可以保证单片机每次开始后可以从固定的相同状态开始工作,与电脑、手机重启的过程是一样的。在程序运行时,如果遇到意外的干扰出现死机的现象,或者程序启动后出现乱码的现象,那么就可以通过按键进行复位,按下复位按键后事程序重新启动,这种就是手动复位。STC89C52单片机复位电路的原理为在单片机的复位引脚RST外部连接电阻和电容及按键,实现上电后通过按键复位。在本系统中,采用了按键复位的方式对系统程序进行复位,在单片机的RST引脚连接了10UF的电容与10K的电阻,按下按键后系统程序就会实现重启。图3-2为系统复位电路设计。图3-2系统复位电路设计3.1.3电源电路设计电源电路在单片机的系统中的作用是至关重要的,为保证电子设计的完整性,需要以安全、可靠、稳定的电源为基础。为克服单片机在运行过程中系统受到干扰后的出现乱码或死机现象,配置一个可靠稳定的电源模块是重要的手段之一。电源电路是电子设备中不可缺少的供电电路,本系统中所采用的ST89C52单片机采用5V电源为系统供电[15]。图3-3为系统电源电路设计。图3-3电源电路设计3.2显示电路设计空气质量检测器采用LCD1602液晶显示屏作为显示器件,用于显示PM2.5传感器所检测到的PM2.5浓度及甲醛传感器检测到的甲醛浓度及系统的工作状态等信息内容。用户通过该器件可了解到室内空气质量中PM2.5及甲醛的数值,如果浓度过高及时作出相应应对措施,保障身体健康。LCD1602液晶显示屏所连接的I/O口为单片机的P0口,由于P0口的驱动能力较弱,因此连接了1K的排阻,也就是上拉电阻。字符的显示,采用LCD1602液晶显示字符的过程较为复杂,每个字符都是有6*8或者8*8的点阵组成,因此既要找到显示位置所对应的显示RAM,又要使每个字节的不同位为“1”,对应的RAM区为8字节,当判断到这8个字节的不同位为“1”,其它的字节不同位为“0”,不同位为“1”的字节点亮,为“0”的不亮,这样就是可以组成需要显示的某个字符。LCD1602液晶显示IP内带字符发生器控制,显示字符就比较简单,直接在LCD上找到需要显示的行列的对应地址,将字符对应的代码送到设立的光标即可实现显示[16]。图3-4LCD1602显示电路设计LCD1602显示电路设计如图3.4所示。LCD1602液晶显示屏与STC89C52单片机的电路中采用16个引脚分别与单片机相连接,每个引脚对应的功能不一致,与单片机的引脚电路连接设计也不同。STC89C52单片机的P0口驱动能力不强,在运行中的电流较弱会影响到模块显示的清晰度,因此连接了1K的排阻,增强了I/O口的驱动能力。LCD1602的D0引脚-D7引脚属于控制引脚,分别连接单片机的P0.0口-P0.7口,实现单片机对LCD1602的控制。RS、RW与E这3个引脚分别为读、写和使能端,分别连接单片机的P2.5口-P2.7口。VL连接滑动变阻器用于调节LCD1602液晶显示屏的亮度,VSS与VDD分别连接系统电路的电端与地端。3.3按键电路设计室内环境质量监测仪采用独立按键来设置系统的时间,及甲醛浓度、PM2.5浓度的上限,在单片机系统的制作及智能设备的设计中,独立式键盘的应用是非常多的。这种独立式的键盘所采用的软件驱动非常简单,具有硬件焊接与软件编程简单的特点,但是在所采用的按键较多时,连线就会变得复杂,且需要占用大量的单片机I/O口。当按键按下后,会拉低对应I/O的电压与GND导通,单片机通过按键扫描程序就会读到对应的I/O为低电平,反之为高。所以,通过判断单片机I/O口的高低电平就可以很直观的知道按键的打开和关闭。系统共有4个按键,分别连接单片机的P1.0口、P1.1口、P1.2口和P1.3口。通过按键可设置温度的最高值,当超过所设定的最高温度时,蜂鸣器开始报警。按下K1可进入时间设置,按下K2可设置定时间,按下K3可设置温度的上限,通过按键4可选择系统模式。图3-5为按键电路设计。图3-5按键电路图3.4PM2.5传感器电路设计夏普GP2Y1010AU0F传感器的检测原理为传感器的中心有一个小洞,在空气自由流过时会定向的发射LED光,如果经过小洞的空气中含有PM2.5,就会折射过来的光线,通过空气中的粉尘类的有害颗粒会反射出光,传感器恰好里用了这一反射原理。夏普GP2Y1010AU0F传感器实物图如图3.6所示。图3.6夏普GP2Y1010AU0F传感器实物图如图3.6所示,1蓝色线为LED灯的正极,2绿色线为LED灯的GND,3白色线为LED灯,4黄色线S-GND,5黑色线VO,6红色线为VCC。在与单片机相连接的电路中,V-LED、LED-GND与S-GND引脚连接220UF的电容及150欧姆的电阻再连接系统的VCC电源端,LED引脚连接单片机的P1.6口,VCC连接整个电路的正极,VO引脚连接单片机的P1.7引脚。在LED灯点亮的瞬间,检测到空气中的PM2.5浓度。图3-7为夏普GP2Y1010AU0F传感器电路设计。图3-7夏普GP2Y1010AU0F传感器电路设计3.5甲醛检测电路设计系统中所采用的CJMCU-100甲醛传感器是一种半导体传感器,所采用的材料属于表面离子式的气敏材料。当与空气中的甲醛等有害气体相接触时,半导体中的电阻受到甲醛的影响而发生变化,从而引起传感器表面导电率的变化,利用这一点变化就可以获得甲醛存在的信息。检测到的甲醛浓度越高,传感器的导电率就会随之变得更大,而输出的电阻就越低,此时输出的模拟信号(甲醛浓度)就越大[17]。CJMCU-100甲醛传感器的GND引脚连接系统电路的地端,VCC引脚连接系统电路的电端,AOUT引脚连接ADC0832的IN1引脚,实现ADC0832对甲醛浓度的采集与数字转换。甲醛检测电路设计如图3-8所示。图3-8甲醛检测电路设计3.6蓝牙通信模块电路设计蓝牙通信模块可以很方便的与单片机相连接,实际接线只用到4根线即可实现连接。通电后,在尚未实现蓝牙连接之前,模块上的LED灯会不停闪烁,一旦成功的与手机或者计算机等蓝牙装置,LED灯将会进入长亮的状态。蓝牙无线通信模块有两种工作方式,一个是命令响应工作模式,另一个是自动连接工作模式。在命令响应工作模式下,使用者通过向模块发送AT工作指令来对模块的控制参数进行设定和下达控制指令。蓝牙模块的4个引脚分别为电源、地、传送和接收,在与蓝牙装置的通讯中接收(RXD)所传入的数据转化成无线信号实现信号的发送,或者是将传送(TXD)所接收到的无线数据传送给单片机,而蓝牙模块本身是不解读数据的。控制蓝牙模块的指令为AT指令,AT指令不是通过蓝牙实现实现无线传输,而是通过模块的接收引脚和发送引脚实现数据的传输。蓝牙模块只有在AT的模式下,才能实现AT指令的接收。HC-05模块在与手机APP相连接之前,处于AT模式状态,上电后即可进入AT模式。蓝牙模块采用9600bps的波特率对数据进行传输[12]。在本系统电路的设计中,蓝牙模块的VCC连接整个电路的VCC端(电端),GND(地端)连接整个电路的地端,接收(RXD)连接单片机的P3.0口,传送(TXD)连接单片机的P3.1口,实现与单片机之间数据的相互通信。HC-05蓝牙模块电路设计如图3-9所示。图3-9HC-05蓝牙模块电路设计 3.7ADC0832电路设计ADC0832与单片机的连接下,需要4个引脚,分别是CS引脚(使能端)、SCLK引脚(时钟引脚)、DI引脚(信号输入)与DO(信号输出)引脚,由于DO引脚与DI引脚与单片机通信是双向的,但是通信时不能同时有效,因此在电路的设计中将D0引脚与DI引脚相连接同时连接单片机的引脚。ADC0832芯片在未工作的情况下,CS输入引脚的电平为高电平,芯片处于禁用的状态,其它三个引脚的电平无限制[14]。在进行AD转换时,CLK会提供给芯片时序,芯片开始工作,DI与DO引脚会通过DI引脚对数据信号选择。在本电路中,ADC0832用于采集夏普GP2Y1010AU0F传感器和甲醛传感器所采集到的PM2.5浓度和甲醛浓度,然后将数据通过蓝牙HC-05传送到手机APP。其中模块的CS使能端连接单片机的P3.6口,SCLK时钟引脚连接单片机的P3.4口,DI引脚与DO引脚并联到P3.5口,GND连接整个电路的地端,VCC引脚连接整个电路的电端。图3-10为ADC0832采集芯片电路设计。图3-10ADC0832芯片电路设计3.8蜂鸣器报警电路设计在检测到当前的PM2.5浓度或者甲醛浓度过高时,系统会驱动蜂鸣器发出声光报警。蜂鸣器报警电路的原理为电路是由NPN三极管、蜂鸣器及LED灯构成的,其中三级管的基极(中间引脚)是由单片机的I/O进行控制的,在单片机I/O口出现高电平是三极管被导通,从而使整个电路接通,蜂鸣器实现发声,当单片机的I/O口处于低电平的状态下,蜂鸣器电路断开,报警结束[15]。在本设计中的蜂鸣器报警电路,三极管的基级与单片机的P2.0口相连接,由单片机控制,正极连接蜂鸣器的负极再连接整个电路的VCC(电端),负极连接LED灯的正极再连接整个电路的GND端,在P2.0口处于高电平时,控制三极管打开,蜂鸣器报警电路实现报警。蜂鸣器报警电路如图3-11所示。图3-11蜂鸣器报警电路设计3.9DS1302时钟芯片电路设计系统采用DS1302时钟芯片来实现时间存储,即使在系统电源关闭又重启的情况下,也可以保证时间的准确性。DS1302时钟芯片有两个电源引脚,分别为VCC1和VCC2,一个是主电源,一个是后备电源,也就是在主电源关闭的情况下,后备电源供电,保证时钟的持续运行。而X1和X2引脚是晶振的引脚,与单片机晶振电路一样,可以连接外部晶振,为模块提供时序,DS1302时钟芯片所连接的是32.768MHZ的晶振。模块的RST为片选引脚,通过该引脚可实现数据的传送,CE、I/O及SCLK分别为数据的输出、与单片机通信及输入端,3个引脚分别需要连接单片机的I/O口,实现与单片机的通信,在本电路中CE、I/O与SLK引脚分别连接的是单片机的P2.3口、P2.2口和P2.1口。DS1302时钟芯片电路设计如图3-12所示。图3-12DS1302时钟芯片电路设计
第四章软件设计4.1开发环境及工具介绍在室内环境质量监测仪的软件代码的编程与设计中,包括单片机程序设计和手机APP的程序设计,其中单片机程序是由KEIL软件来编程,C语言编写代码,手机APP程序是由MyEclipse软件编程,JAVA语言编写。Java开发语言:java编程语言是SUN公司上世纪九十年代的产物,到现在依然在广泛使用,它吸取了C++强大功能的同时去掉了一些它们的复杂特性,不如指针之类的,并增加了强大的web编程支持,才使得我们今天可以用java开发本系统。MyEclipse:MyEclipse是基于eclipse而来,是应用广泛的企业级开发环境,可应用于javaEE、javaweb等开发。是目前很流行的跨平台的集成开发环境,同时可编写、编译、运行、调试代码一站式全部完成。KEIL软件:KEIL软件是一种可以兼容单片机C语言开发的程序开发的软件系统。KEIL可以为各类语言、链接器和库管理提供完整的开发方案,在集成的开发环境中将这些部分组成在一起,实现软件编程。C语言:本系统中所采用的编程语言为C语言,结构上、功能上与可读性等方面都有较强的优势,更容易使用。代码质量与汇编语言相比生成效率更高,代码编写更简洁,描述迅速,可读性好,因此使用较广。4.2单片机部分主程序设计单片机部分的主程序也称为main函数,是程序编写时的框架。单片机软件部分主要实现传感器对雾霾及甲醛的检测以及对手机app数据的接收,判断接收到数据是否在手机APP所设置阈值内,若接收数据异常驱动蜂鸣器报警。主程序首先经过初始化串口及定时器,读取PM2.5浓度、甲醛后连接WIFI成功后,发送数据后接收数据,判断检测到的PM2.5浓度是否超过手机APP所设置的上限,超过上限蜂鸣器报警。系统主程序设计如图4-1所示。
开始开始初始化显示屏初始化显示屏初始化串口初始化串口读取PM2.5读取PM2.5读取甲醛读取甲醛接收数据接收数据显示显示YY设置阈值读取按键设置阈值读取按键NNY温度过高Y温度过高蜂鸣器报警蜂鸣器报警NNY甲醛过高Y甲醛过高蜂鸣器报警蜂鸣器报警NN发送数据发送数据图4-1系统主程序设计
4.3手机APP端程序设计及APP开发4.3.1手机端程序设计手机APP界面通过JAVA语言开发的,通过蓝牙模块接收单片机系统的PM2.5传感器所测得的PM2.5浓度及甲醛浓度实时显示,并在PM2.5与甲醛浓度过高时出现文字提醒。程序在开始后首先需要初始化串口,连接蓝牙连接成功后实现手机界面的显示,接收下位机发送的数据并显示,PM2.5与甲醛浓度过高时出现提示。手机APP端程序设计如图4-2所示。开始开始初始化串口初始化串口连接蓝牙连接蓝牙N接收数据N接收数据YY手机界面显示手机界面显示N接收数据N接收数据浓度过高YY显示提示显示提示结束结束图4-2手机APP端流程设计4.3.2手机APP的开发室内环境质量监测仪手机APP端主要起到控制及显示的作用,开发环境为Eclipse,编写语言为JAVA语音。与单片机系统中开发的KEIL软件环境编程,C语言来编写程序是一样的。编译手机APP软件的过程如下:(1)首先创建工程文件,需要双击打开eclipse.exe的工程文件,这时会出现eclipse的界面,直接创建一个工程文件即可。如图4-3所示。图4-3创建工程文件(2)可在软件中查找工程目录,在工程目录下的菜单找到Res目录,在Res目录的菜单下对Layout文件进行查找,找到Layout文件后打开main.xml文件。在main.xml文件的目录下就可以对手机APP软件进行程序的编写了。编译界面如图4-4所示。图4-4手机编译界面手机APP的编程语言为JAVA,因此需要在“BTClient.java”这个目录下对源代码进行编写,完成手机APP代码的编写。如图4-5所示。图4-5源代码编程在完成手机APP源代码的编写以及APP界面的绘制后,就可以对编写好的源代码进行编译了,编译通过后会直接生成一个APK文件,在bin的目录下可找到生成好的APK文件。APK文件生成如图4-6所示。图4-6生成APK文件将生成好的APK文件下载到安卓系统的手机,在手机上安装,然后打开APK软件即可实现运行,即可对手机APP的功能进行测试。
第五章系统调试通过硬件电路设计及程序的编写与设计后,就可以对硬件电路的连接和程序编写进行调试。软件与硬件的调试及软硬件的综合调试都是实物制作过程中非常重要的环境。任何实物的硬件在焊接好之后都需要对各模块及各电路进行测试,确保没有问题后再进行软件编写,因此硬件环境的测试也可以说是软件编写的良好基础。以正确的方式对软件及硬件进行调试,可避免很多不必要的错误,提高实物运行的成功率,确保完成所有功能。在完成系统的电路设计和程序设计后,即可对电路及程序进行调试,这是实物制作中非常重要的一个环节。5.1单片机软件调试系统程序开发环境为KEIL4软件,程序编写完成后可进入软件自带的编译器中查找代码编写是否有错误,如果检查出错误可进行更改然后编译程序。如果程序编译失败,可进入断点调试,在断点调试的工具栏中逐句对程序进行调试。在断点调试完成后,点击编译按钮对程序进行编译。程序编译如图5-1所示。图5-1程序编译在编程中错误检查是必不可少的一项,有事因为疏忽就会出现语法错误,在变异后编译器就会提示相关的错误信息。例如,即使少写一个‘:’,都会导致程序编译失败。由于第一次编写程序,出现的错误较多。程序编译错误如图5-2所示。图5-2错误检查经过反复查找错误与修改,终于完成了程序的编写,就可以对程序进行编译了,编译成功后会提示“0error”(即无错误),那么就可以生成后缀为.hex镜像文件。如图5-3所示。图5-3程序编译通过然后通过烧写软件将编译好的镜像文件下载到单片机中运行即可,由此程序的软件部分调试完成。在软件调试戏中遇到了一下问题:1、编译不通过问题:在编写好代码后,屡次出现编译不通过的现象,经过仔细的检查,发现是在编译过程中未选择createhexfile,因此就未镜像文件就不能生成,所以编译程序的过程中,这些都是要重点留意的。2、变量未定义产生的错误:在对程序进行编写的过程中,我们要自主对一些变量进行定义,假如没有对其进行设置,后续将产生错误的情况。3、最后的检查:烧录完成,再次核对实物的功能是否满足要求,在对设计的程序进行给电,观察是否达到预期功能,如果未达标准,在分程序检测,发现问题并予以修正,直到保障程序完全无误。
5.2JAVA开发手机APP调试在使用eclipse.exe开发手机APP时,可能会遇到一些开发方面的问题,同时采用JAVA语言开发时也会出现一些编程或者编译方面的错误。首先需要双击eclipse.exe打开软件,进行编程。软件运行如图5-4所示。图5-4软件运行图标在使用JAVA的编程中,需要定义privateTextViewdis_6,在定义时即使少写一个‘;’,软件也会将错误的位置进行自动提示。如图5-5所示。图5-5错误示意图手机APP与单片机系统通信时,可以按照需要在APP程序中定义通信数据的指令,对于每条发送的指令进行监听,当v.getId()监听到触发信号的指令时,会将对应的信号指令传送给单片机。发送指令示意图,如图5-6所示。图5-6数据发送手机APP通过编写好的按键指令发送指令信息到单片机系统,单片机系统接收到指令信息后解析数据,发送到手机APP进行代码解析,显示相应的内容,在每次接收到数据指令时,手机APP都需要对数据进行解析。接收数据处理函数,如图5-7所示。图5-7接收数据执行函数在完成手机APP代码编写后,即可在工具栏点击运行来运行手机APP,点击编译后运行,实现代码的编译。如图5-8所示。图5-8编译示意图在代码编译成功后,即可弹出模拟器的界面,点击bin目录,在目录下即可生成手机APK的文件,再倒入安卓手机中安装。手机APP代码软件部分调试完毕。如图5-9所示。图5-9编译调试完成5.3硬件调试硬件调试主要是指对系统硬件电路的焊接与调试,根据单片机引脚、元器件个引脚性能等方面进行研究后,采用Altiumdesigner绘制完成电路图,再根据电路图焊接实物的电路。在焊接过程中也需要注意元器件的正负极及电路的导通情况,万用表是必不可少的电路检查工具。通过万用表可检查电路是否确实导通,如果电路未导通就需要对电路再逐一检查,如果有虚焊现象就需要再确认是哪个电路或者元器件的引脚出现了虚焊现象,对虚焊部分进行补锡操作。然后再检查元器件的正负极是否有接反的现象,如果有接反现象所导致的结果是较为严重的,可能会导致传感器无法正常工作,严重时会直接烧毁元器件。在确认电路无任何问题后,才能将软件代码烧写进单片机,接通电源,查看实物功能。
5.4实物功能展示5.4.1实物成品展示室内环境质量监测仪系统采用洞洞板制作,以LCD1602液晶显示屏作为显示模块,STC89C52单片机作为主控器,PM2.5传感器实时检测PM2.5浓度,甲醛传感器检测甲醛浓度,通过蓝牙模块将检测到的数据发送到手机APP,并实现手机APP对PM2.5浓度及甲醛浓度的显示。系统实物成品展示如图5-10所示。图5-10实物成品展示5.4.2显示功能展示系统所采用的供电电源为5V,系统上电后,蓝牙模块显示屏会亮起,LCD1602液晶显示屏会显示当前检测到的PM2.5浓度及甲醛浓度,当前的时间等信息。系统显示功能展示如图5-11所示。图5-11显示功能展示5.4.3按键设置上限通过按键可以设置PM2.5浓度及甲醛浓度的上限,如果检测到的PM2.5的浓度或者甲醛浓度超过了用户所设置的上限值时,会自动报警。按键设置上限功能展示如图5-12所示。图5-12按键设置上限5.4.4手机APP功能展示手机APP端与单片机部分采用蓝牙模块进行连接,实现手机端与系统的通信。连接成功后,APP界面会显示当前的PM2.5浓度、甲醛浓度的开关等信息。图5-12手机界面显示5.4.5报警功能展示在设置完毕PM2.5浓度及甲醛浓度上限后,如果检测到的PM2.5浓度或者甲醛超过设置的上限时,蜂鸣器会发出声光报警,同时手机APP端所显示的也会出现浓度过高的提示,提醒用户注意防范。有害气体浓度过高报警如图5-13所示。图5-13报警功能展示
结论通过对系统软件的调试、手机APP调试及实物功能的测试,实现了基于Java的室内空气质量检测器的所有功能。具体总结如下:(1)系统实现了对雾霾中PM2.5浓度、甲醛浓度的实时检测,完成了手机APP的开发并可以通过蓝牙与系统相连接实现与手机之间数据的传输,电路简单,实用性强,更为智能化。(2)系统硬件组成有蓝牙模块、STC89C52单片机、夏普GP2Y1010AUOFPM2.5传感器、甲醛传感器、DS1302时钟芯片电路、蜂鸣器、LED灯等元器件,采用AD软件对系统的电路进行绘制。(3)系统软件部分包括主程序设计、手机APP端的程序设计及手机APP的开发部分,单片机程序部分采用KEIL软件,C语言编程,手机APP部分采用JAVA语言编写。另外系统功能还有一些可以改善的地方,例如可在单片机部分增加空气净化器,如果PM2.5浓度或者甲醛浓度过高,自动启动空气净化器对空气进行净化。通过这次的毕业设计,也发现了自身的不足,应提高自己的实践能力,不能纸上谈兵。
参考文献[1]王明霞,杨秀菊,罗刘敏.基于单片机的无线室内环境检测仪设计[J].电脑知识与技术,2018,14(11):269-270.[2]陈达.基于单片机的室内环境监测设计[J].电子测试,2018(Z1):25-26.[3]邢凯.基于单片机的室内无线环境监测系统设计与应用[D].广西民族大学,2014.[4]刘缤璐,王永顺,闫丽红.基于nRF905的无线环境监测系统设计与实现[J].工业和信息化教育,2017(08):89-94.[5]甄智,陆中宏.基于STC89C52单片机的室内环境监测预警系统设计[J].工业技术与职业教育,2017,15(03):16-18.[6]陈东杰,许中石.单片机的室内环境监测系统设计探讨[J].信息技术与信息化,2017(05):131-133.[7]晁松杰.基于STC89C52单片机室内监控系统设计[J].信息记录材料,2017,18(03):5-6.[8]李智岩,刘玥,柳娟,唐莹玮,吕佳蓉,吴宝春.基于单片机的室内环境监测系统设计[J].信息技术与信息化,2016(12):60-62.[9]黄磊.基于单片机的室内环境监测系统的研究与应用[J].电子世界,2016(08):74.[10]刘璋.STM32单片机在室内环境监测系统中的运用研究[J].数字技术与应用,2016(02):20.[11]胡晓芳.基于AVR单片机的室内环境检测系统[J].自动化技术与应用,2014,33(07):117-119+123.[12]黎冠,马婕,卜祥丽.STM32单片机在室内环境监测系统中的应用[J].自动化仪表,2014,35(07):29-31.[13]许海峰,王驰骏,王德育,丁辉,张明玉.基于AVR单片机的室内环境监测系统的设计与测试[J].赤峰学院学报(自然科学版),2011,27(12):48-50.[14]于波.基于单片机的室内环境监测系统设计[D].中国海洋大学,2011.[15]KyleA.O'Connell,UtpalSmart,IrvanSidik,AwalRiyanto,NiaKurniawan,EricN.Smith.Diversificationofbent-toedgeckos(Cyrtodactylus)onSumatraandwestJava[J].MolecularPhylogeneticsandEvolution,2019,134.[16]KonstantinsGusarovs.AnAnalysisonJavaProgrammingLanguageDecompilerCapabilities[J].AppliedComputerSystems,2018,23(2).[17]GirishMaskeriRama,RaghavanKomondoor,HimanshuSharma.Refinementinobject-sensitivitypoints-toanalysisviaslicing[J].ProceedingsoftheACMonProgrammingLanguages,2018,2(OOPSLA).
附录一实物图附录二电路图
附录三程序#include<reg51.h>#include"beep.h"#include"delay.h"#include"lcd1602.h"#include"adc0832.h"#include"key.h"#include"ds1302.h"#defineucharunsignedchar#defineuintunsignedintsbitLED=P1^7;//led指示灯intPM25_up=80;//烟雾浓度上线unsignedcharPM25=0;//烟雾浓度intVOC_up=40;//VOC浓度上线unsignedcharVOC=0;//VOC浓度unsignedchardht11t_up=30;//dht11温度上限unsignedchardht11h_up=60;//dht11湿度上限voidset_PM25(){Lcd1602_Com(0x80);Lcd1602_Data('P');Lcd1602_Data('M');Lcd1602_Data('2');Lcd1602_Data('5');Lcd1602_Data('u');Lcd1602_Data('p');Lcd1602_Data('>');Lcd1602_Data('0'+PM25_up/100);Lcd1602_Data('0'+(PM25_up%100)/10);Lcd1602_Data('0'+PM25_up%10);for(;;){//按键按下变量加if(key_2==0){while(key_2==0){PM25_up++;if(PM25_up>=255)PM25_up=255;Lcd1602_Com(0x87);Lcd1602_Data('0'+PM25_up/100);Lcd1602_Data('0'+(PM25_up%100)/10);Lcd1602_Data('0'+PM25_up%10);delay_10ms(10);//延时0.2s}}//按键按下变量减if(key_3==0){while(key_3==0){PM25_up--;if(PM25_up<=0)PM25_up=0;Lcd1602_Com(0x87);Lcd1602_Data('0'+PM25_up/100);Lcd1602_Data('0'+(PM25_up%100)/10);Lcd1602_Data('0'+PM25_up%10);delay_10ms(10);//延时0.2s}}//跳出循环if(key_4==0){while(key_4==0);Lcd1602_Com(0x86);//地址Lcd1602_Data('');break;}}}voidset_VOC(){Lcd1602_Com(0x80);Lcd1602_Data('V');Lcd1602_Data('O');Lcd1602_Data('C');Lcd1602_Data('');Lcd1602_Data('u');Lcd1602_Data('p');Lcd1602_Data('>');Lcd1602_Data('0'+VOC_up/100);Lcd1602_Data('0'+(VOC_up%100)/10);Lcd1602_Data('0'+VOC_up%10);for(;;){//按键按下变量加if(key_2==0){while(key_2==0){VOC_up++;if(VOC_up>=255)VOC_up=255;Lcd1602_Com(0x87);Lcd1602_Data('0'+VOC_up/100);Lcd1602_Data('0'+(VOC_up%100)/10);Lcd1602_Data('0'+VOC_up%10);delay_10ms(10);//延时0.2s}}//按键按下变量减if(key_3==0){while(key_3==0){VOC_up--;if(VOC_up<=0)VOC_up=0;Lcd1602_Com(0x87);Lcd1602_Data('0'+VOC_up/100);Lcd1602_Data('0'+(VOC_up%100)/10);Lcd1602_Data('0'+VOC_up%10);delay_10ms(10);//延时0.2s}}//跳出循环if(key_4==0){while(key_4==0);Lcd1602_Com(0x86);//地址Lcd1602_Data('');break;}}}voidset_value(){set_ds1302();//设置系统时间if(key_2==0){while(key_2==0);Lcd1602_Com(0x01);set_PM25();Lcd1602_Com(0x01);set_VOC();Lcd1602_Com(0x01);}}voiddisplay(){Lcd1602_Com(0x80);Lcd1602_Data('2');Lcd1602_Data('0');Lcd1602_Data('0'+DS1302_Time[6]/16);Lcd1602_Data('0'+(DS1302_Time[6]&0x0f));Lcd1602_Data('-');Lcd1602_Data('0'+DS1302_Time[4]/16);Lcd1602_Data('0'+(DS1302_Time[4]&0x0f));Lcd1602_Data('-');Lcd1602_Data('0'+DS1302_Time[3]/16);Lcd1602_Data('0'+(DS1302_Time[3]&0x0f));Lcd1602_Data('');Lcd1602_Data('M');Lcd1602_Data('0'+PM25/100);Lcd1602_Data('0'+PM25%100/10);Lcd1602_Data('0'+PM25%10);Lcd1602_Data('');Lcd1602_Com(0xc0);if(DS1302_Time[5]==0) //星期7在DS1302存储是0需要转换一下Lcd1602_Data('7');elseLcd1602_Data('0'+(DS1302_Time[5]&0x07));Lcd1602_Data('');Lcd1602_Data('0'+DS1302_Time[2]/16);Lcd1602_Data('0'+(DS1302_Time[2]&0x0f));Lcd1602_Data(':');Lcd1602_Data('0'+DS1302_Time[1]/16);Lcd1602_Data('0'+(DS1302_Time[1]&0x0f));Lcd1602_Data(':');Lcd1602_Data('0'+DS1302_Time[0]/16);Lcd1602_Data('0'+(DS1302_Time[0]&0x0f));Lcd1602_Data('');Lcd1602_Data('V');Lcd1602_Data('0'+VOC/100);Lcd1602_Data('0'+VOC%100/10);Lcd1602_Data('0'+VOC%10);Lcd1602_Data('');}voidsend_data(){// SBUF=0xf1;// while(!TI);//等待发送完成信号(TI=1)出现// TI=0;//SBUF=0xf0;while(!TI);//等待发送完成信号(TI=1)出现TI=0;SBUF=PM25;while(!TI);//等待发送完成信号(TI=1)出现TI=0;SBUF=VOC;while(!TI);//等待发送完成信号(TI=1)出现TI=0;if(PM25>PM25_up){SBUF=0x01;while(!TI);//等待发送完成信号(TI=1)出现TI=0;}else{SBUF=0x00;while(!TI);//等待发送完成信号(TI=1)出现TI=0;}if(VOC>VOC_up){SBUF=0x01;while(!TI);//等待发送完成信号(TI=1)出现TI=0;}else{SBUF=0x00;while(!TI);//等待发送完成信号(TI=1)出现TI=0;}}//报警判断voidwarn(){//浓度超限if((PM25>PM25_up)||(VOC>VOC_up)){beep(20);}send_data();//发送数据}#definebaudrate9600UL#definefosc11059200UL//其中,UL是不能省略的,代表长整型。voidUsartConfiguration(){// SCON=0X50; //设置为工作方式1SCON=0x50;TMOD=0X21; //设置计数器工作方式2PCON=0X80; //波特率加倍TH1=256-(fosc*2)/(baudrate*12*32); //9600TL1=256-(fosc*2)/(baudrate*12*32)-1;ET0=1; //打开TO定时器TR0=1; //开启中断TH0=(65536-5000)/256;TL0=(65536-5000)%256;ES=1; //打开接收中断EA=1; //打开总中断TR1=1; //打开计数器}voidmain(){UsartConfiguration();//初始化串口和定时器Lcd1602_Init();//初始化LCD1602液晶显示屏Buzzer=0;//蜂鸣器不响while(1){set_value();//读取按键get_ds1302();//获取DS1302获取时间VOC=get_adc0832(0);//获取VOC浓度if(VOC>40)VOC-=40;elseVOC=0;display();//显示warn();//烟雾判断delay_10ms(10); //延时200ms}}/**********定时器0中断服务程序***************/voidtimer0(void)interrupt1{intj;// x++;TH0=(65536-8881)/256;//定时10usTL0=(65536-8881)%256;LED=0;for(j=0;j<30;j++);//延时0.28msPM25=get_adc0832(1);//开启ADC采集// FlagStar=1;for(j=0;j<5;j++);// TR0=0;// EA=0;LED=1;//关闭传感器LED}voidUsart()interrupt4{RI=0;//清除接收中断标志位}APP程序代码:packagecom.test.BTClient;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.util.UUID;importcom.test.BTClient.DeviceListActivity;//importandroid.R;importandroid.app.Activity;importandroid.app.AlertDialog;importandroid.bluetooth.BluetoothAdapter;importandroid.bluetooth.BluetoothDevice;importandroid.bluetooth.BluetoothSocket;importandroid.content.DialogInterface;importandroid.content.Intent;importandroid.content.pm.ActivityInfo;importandroid.graphics.Color;importandroid.os.Bundle;importandroid.os.Environment;importandroid.os.Handler;importandroid.os.Message;importandroid.view.LayoutInflater;importandroid.view.View.OnClickListener;//importandroid.view.Menu;//如使用菜单加入此三包//importandroid.view.MenuInflater;//importandroid.view.MenuItem;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.ScrollView;importandroid.widget.SeekBar;importandroid.widget.TextView;importandroid.widget.Toast;publicclassBTClientextendsActivityimplementsOnClickListener{ privatefinalstaticintREQUEST_CONNECT_DEVICE=1;//宏定义查询设备句柄 privatefinalstaticStringMY_UUID="00001101-0000-1000-8000-00805F9B34FB";//SPP服务UUID号 privateInputStreamis;//输入流,用来接收蓝牙数据 //privateTextViewtext0;//提示栏解句柄privateEditTextedit0;//发送数据输入句柄privateTextViewdis_1;//接收数据显示句柄privateTextViewdis_2;//接收数据显示句柄privateTextViewdis_3;//接收数据显示句柄//privateScrollViewsv;//翻页句柄privateStringsmsg="";//显示用数据缓存privateStringfmsg="";//保存用数据缓存publicStringfilename="";//用来保存存储的文件名BluetoothDevice_device=null;//蓝牙设备BluetoothSocket_socket=null;//蓝牙通信socketboolean_discoveryFinished=false;booleanbRun=true;booleanbThread=false;privateBluetoothAdapter_bluetooth=BluetoothAdapter.getDefaultAdapter();//获取本地蓝牙适配器,即蓝牙设备 privateButtonbut_1; privatebyte[]tempData=newbyte[1024];//串口临时数据 charstart=0;//开始停止 intpm25_up=100;//上线 String[]values_1=newString[32];///**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);dis_2=(TextView)findViewById(R.id.textView2);//得到数据显示句柄dis_3=(TextView)findViewById(R.id.textView3);//得到数据显示句柄 //如果打开本地蓝牙设备不成功,提示信息,结束程序if(_bluetooth==null){ Toast.makeText(this,"无法打开手机蓝牙,请确认手机是否有蓝牙功能!",Toast.LENGTH_LONG).show();finish();return;}//设置设备可以被搜索newThread(){ publicvoidrun(){ if(_bluetooth.isEnabled()==false){ _bluetooth.enable(); } } }.start();}//发送按键响应publicvoidonSendButtonClicked(Viewv){ inti=0; intn=0; try{ OutputStreamos=_socket.getOutputStream();//蓝牙连接输出流 //byte[]bos=edit0.getText().toString().getBytes(); byte[]bos="asdfsdfsd".getBytes();//.getBytes(); for(i=0;i<bos.length;i++){ if(bos[i]==0x0a)n++; } byte[]bos_new=newbyte[bos.length+n]; n=0; for(i=0;i<bos.length;i++){//手机中换行为0a,将其改为0d0a后再发送 if(bos[i]==0x0a){ bos_new[n]=0x0d; n++; bos_new[n]=0x0a; }else{ bos_new[n]=bos[i]; } n++; } os.write(bos_new); }catch(IOExceptione){ } }//接收活动结果,响应startActivityForResult()publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){ switch(requestCode){ caseREQUEST_CONNECT_DEVICE://连接结果,由DeviceListActivity设置返回 //响应返回结果if(resultCode==Activity.RESULT_OK){//连接成功,由DeviceListActivity设置返回//MAC地址,由DeviceListActivity设置返回Stringaddress=data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);//得到蓝牙设备句柄_device=_bluetooth.getRemoteDevice(address);//用服务号得到sockettry{ _socket=_device.createRfcommSocketToServiceRecord(UUID.fromString(MY_UUID));}catch(IOExceptione){ Toast.makeText(this,"连接失败!",Toast.LENGTH_SHORT).show();}//连接socket Buttonbtn=(Button)findViewById(R.id.Button03);try{ _socket.connect(); Toast.makeText(this,"连接"+_device.getName()+"成功!",Toast.LENGTH_SHORT).show(); btn.setText("断开");}catch(IOExceptione){ try{ Toast.makeText(this,"连接失败!",Toast.LENGTH_SHORT).show(); _socket.close(); _socket=null; }catch(IOExceptionee){ Toast.makeText(this,"连接失败!",Toast.LENGTH_SHORT).show(); } return;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 五年级数学上《小数除法竖式计算题》练习
- 昆明医科大学《民族器乐欣赏》2023-2024学年第一学期期末试卷
- 江苏医药职业学院《乒乓球教学与实践》2023-2024学年第一学期期末试卷
- 湖南三一工业职业技术学院《宠物医学》2023-2024学年第一学期期末试卷
- 湖北中医药大学《营养护理学》2023-2024学年第一学期期末试卷
- 【物理】《力》(教学设计)-2024-2025学年人教版(2024)初中物理八年级下册
- 重庆工商职业学院《市场营销模拟实验》2023-2024学年第一学期期末试卷
- 郑州电力高等专科学校《项目管理设计与创业精神》2023-2024学年第一学期期末试卷
- 浙江警官职业学院《化工热力学实验》2023-2024学年第一学期期末试卷
- 中国民用航空飞行学院《舞台实践》2023-2024学年第一学期期末试卷
- 牧场物语-矿石镇的伙伴们-完全攻略
- 2024-2030年中国汤圆行业销售动态及竞争策略分析报告
- 2024年中国智能客服市场研究报告-第一新声
- 人教版六年级上册解方程练习300道及答案
- 《健全全过程人民民主制度体系》课件
- 住院证明模板
- 园区物业管理合同协议书
- 《人体损伤致残程度分级》
- 港口流体装卸工职业技能竞赛理论考试题库500题(含答案)
- QCT1067.5-2023汽车电线束和电器设备用连接器第5部分:设备连接器(插座)的型式和尺寸
- 轮式智能移动操作机器人技术与应用-基于ROS的Python编程 课件 第4章 机器人运动应用实例
评论
0/150
提交评论