物联网感知课程设计_第1页
物联网感知课程设计_第2页
物联网感知课程设计_第3页
物联网感知课程设计_第4页
物联网感知课程设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录TOC\o"1-2"\h\u30710物联网感知课程设计 116817一.功能分析 16779二.概要设计 1254351.系统组成 1285302.传感器选型 113751三.详细设计 118531.通信模块程序设计框图 1148052.程序设计 212288四.系统说明 922874五.设计总结 1022698六.附录 10PAGEPAGE6物联网感知课程设计环境监测系统程序设计课程设计报告题目:设计一个环境监测系统。一.功能分析环境监测系统主要包括对环境变量的采集和显示。选择温湿度传感器来完成温度、湿度数据的采集。选择协调器串口发送程序。(3)采用java语言制作相应的显示界面,将采集的变量值实时显示并给出相应提示。二.概要设计1.系统组成系统大体组成包括:传感器模块、数据传送模块和电机控制模块。系统框图如图1所示。由于传感器模块没有外接电路,因此需要通过中间的协调器将数据转为串口形式发送到PC机上。 Zigbee传输协调器温、湿度传感器PC显示串口传输电机图1系统框图2.传感器选型选择SHT10单片数字温湿度传感器来监测环境。SHT10采用CMOSens专利技术将温度湿度传感器、A/D转换器及数字接口无缝结合,使传感器具有体积小、响应速度快、接口简单、性价比高等特点。电路连接时,接口简单,两线连接,SHT10的两线串行接口(bidirectional2-wire)在传感器信号读取和电源功耗方面都做了优化处理,其总线类似I2C总线但并不兼容I2C总线。三.详细设计1.通信模块程序设计框图1.打开串口(逻辑串口号:根据设备管理器的端口)1.打开串口(逻辑串口号:根据设备管理器的端口)2.配置串口参数(波特率、校验位、起始位、停止位)2.配置串口参数(波特率、校验位、起始位、停止位)3.设置读写超时时间4.设置串口底层接收、发送缓冲区大小4.设置串口底层接收、发送缓冲区大小5.设置串口事件(数据可读事件、启动发送数据事件、工作线程结束事件等)5.设置串口事件(数据可读事件、启动发送数据事件、工作线程结束事件等)6.启动串口后台工作线程6.启动串口后台工作线程2.程序设计packageorg.serial;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.util.Enumeration;importjava.util.TooManyListenersException;importjava.awt.FlowLayout;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JTextField;importgnu.io.CommPortIdentifier;importgnu.io.PortInUseException;importgnu.io.SerialPort;importgnu.io.SerialPortEvent;importgnu.io.SerialPortEventListener;importgnu.io.UnsupportedCommOperationException;/***@项目名称:illegalsms*@文件名称:SerialPort.java*@所在包:org.serial*@功能描述:*串口类*@创建者:*@创建日期:2016-12-23*@修改记录:*/@SuppressWarnings("serial")publicclassDSerialPortextendsJFrameimplementsRunnable,SerialPortEventListener{ privateStringappName="协调器数据接收";privateinttimeout=2000;//open端口时的等待时间privateintthreadTime=0;privateCommPortIdentifiercommPort;privateSerialPortserialPort;privateInputStreaminputStream;privateOutputStreamoutputStream;/***@方法名称:listPort*@功能描述:列出所有可用的串口*@返回值类型:void*/@SuppressWarnings("rawtypes")publicvoidlistPort(){ CommPortIdentifiercpid;Enumerationen=CommPortIdentifier.getPortIdentifiers();System.out.println("nowtolistallPortofthisPC:"+en);while(en.hasMoreElements()){cpid=(CommPortIdentifier)en.nextElement();if(cpid.getPortType()==CommPortIdentifier.PORT_SERIAL){System.out.println(cpid.getName()+","+cpid.getCurrentOwner());}}}/***@方法名称:selectPort*@功能描述:选择一个端口,比如:COM1*@返回值类型:void*@paramportName*/@SuppressWarnings("rawtypes")publicvoidselectPort(StringportName){mPort=null;CommPortIdentifiercpid;Enumerationen=CommPortIdentifier.getPortIdentifiers();while(en.hasMoreElements()){cpid=(CommPortIdentifier)en.nextElement();if(cpid.getPortType()==CommPortIdentifier.PORT_SERIAL&&cpid.getName().equals(portName)){mPort=cpid;break;}}openPort();}/***@方法名称:openPort*@功能描述:打开SerialPort*@返回值类型:void*/privatevoidopenPort(){ if(commPort==null)log(String.format("无法找到名字为'%1$s'的串口!",commPort.getName()));else{log("端口选择成功,当前端口:"+commPort.getName()+",现在实例化SerialPort:");try{serialPort=(SerialPort)commPort.open(appName,timeout);log("实例SerialPort成功!");}catch(PortInUseExceptione){thrownewRuntimeException(String.format("端口'%1$s'正在使用中!",commPort.getName()));}} try{ serialPort.setSerialPortParams(115200,SerialPort.DATABITS_8,//设置串口读写参数 SerialPort.STOPBITS_1,SerialPort.PARITY_NONE); }catch(UnsupportedCommOperationExceptione){}}/***@方法名称:checkPort*@功能描述:检查端口是否正确连接*@返回值类型:void*/privatevoidcheckPort(){if(commPort==null)thrownewRuntimeException("没有选择端口,请使用"+"selectPort(StringportName)方法选择端口");if(serialPort==null){thrownewRuntimeException("SerialPort对象无效!");}}/***@方法名称:write*@功能描述:向端口发送数据,请在调用此方法前先选择端口,并确定SerialPort正常打开!*@返回值类型:void*@parammessage*/publicvoidwrite(Stringmessage){checkPort();try{outputStream=newBufferedOutputStream(serialPort.getOutputStream());}catch(IOExceptione){thrownewRuntimeException("获取端口的OutputStream出错:"+e.getMessage());}try{outputStream.write(message.getBytes());log("信息发送成功!");}catch(IOExceptione){thrownewRuntimeException("向端口发送信息时出错:"+e.getMessage());}finally{try{outputStream.close();}catch(Exceptione){}}}/***@方法名称:startRead*@功能描述:开始监听从端口中接收的数据*@返回值类型:void*@paramtime监听程序的存活时间,单位为秒,0则是一直监听*/publicvoidstartRead(inttime){checkPort();ints;s=serialPort.getBaudRate();System.out.println("波特率为"+s);try{inputStream=newBufferedInputStream(serialPort.getInputStream());}catch(IOExceptione){thrownewRuntimeException("获取端口的InputStream出错:"+e.getMessage());}try{serialPort.addEventListener(this);}catch(TooManyListenersExceptione){thrownewRuntimeException(e.getMessage());}serialPort.notifyOnDataAvailable(true);log(String.format("开始监听来自'%1$s'的数据",commPort.getName()));if(time>0){this.threadTime=time*1000;Threadt=newThread(this);t.start();log(String.format("监听程序将在%1$d秒后关闭。。。。",threadTime));}}/***@方法名称:close*@功能描述:关闭SerialPort*@返回值类型:void*/publicvoidclose(){serialPort.close();serialPort=null;commPort=null;}publicvoidlog(Stringmsg){System.out.println(appName+"-->"+msg);}/***数据接收的监听处理函数*/@OverridepublicvoidserialEvent(SerialPortEventarg0){switch(arg0.getEventType()){caseSerialPortEvent.BI:/*Breakinterrupt,通讯中断*/caseSerialPortEvent.OE:/*Overrunerror,溢位错误*/caseSerialPortEvent.FE:/*Framingerror,传帧错误*/caseSerialPortEvent.PE:/*Parityerror,校验错误*/caseSerialPortEvent.CD:/*Carrierdetect,载波检测*/caseSerialPortEvent.CTS:/*Cleartosend,清除发送*/caseSerialPortEvent.DSR:/*Datasetready,数据设备就绪*/caseSerialPortEvent.RI:/*Ringindicator,响铃指示*/caseSerialPortEvent.OUTPUT_BUFFER_EMPTY:/*Outputbufferisempty,输出缓冲区清空*/break;caseSerialPortEvent.DATA_AVAILABLE:/*Dataavailableattheserialport,端口有可用数据。读到缓冲数组,输出到终端*/byte[]readBuffer=newbyte[16];try{while(inputStream.available()>0){@SuppressWarnings("unused") intnumBytes=inputStream.read(readBuffer);}outputStream.write("xiaogang".getBytes());Stringhex;StringBufferresult=newStringBuffer(); for(inti=0;i<readBuffer.length;i++){ hex=Integer.toHexString(readBuffer[i]&0xFF); if(hex.length()==1){ hex='0'+hex; } result.append(hex.toUpperCase()); }Strings=newString(result);int[]x=newint[4];int[]y=newint[4];for(inti=0;i<4;i++){ Strings1=s.substring(10+i,10+i+1); if(s1.equals("A")) x[i]=10; elseif(s1.equals("B")) x[i]=11; elseif(s1.equals("C")) x[i]=12; elseif(s1.equals("D")) x[i]=13; elseif(s1.equals("E")) x[i]=14; elseif(s1.equals("F")) x[i]=15; else x[i]=Integer.parseInt(s1); Strings2=s.substring(14+i,14+i+1); if(s2.equals("A")) y[i]=10; elseif(s2.equals("B")) y[i]=11; elseif(s2.equals("C")) y[i]=12; elseif(s2.equals("D")) y[i]=13; elseif(s2.equals("E")) y[i]=14; elseif(s2.equals("F")) y[i]=15; else y[i]=Integer.parseInt(s2);}@Overridepublicvoidrun(){ try{ Thread.sleep(threadTime);serialPort.close();log(String.format("端口''监听关闭了!",commPort.getName()));}catch(Exceptione){e.printStackTrace();} }四.系统说明本系统搭建了一个温湿度的采集显示环境,能够采集周围环境中的温度、湿度值,并且实时在PC机上显示。PC机实时显示界面如图:系统采用SHT10单片数字温湿度传感器将温湿度采集集成在一起,数据的读取要采用时序控制来进行。采集变量的实时显示由JAVA编制界面来完成。并且在图形化界面温湿度上下界及理想温湿度处输入数值,温湿度采集过程中能对数据进行判断并给出五.设计总结这次选题选择了与日常生活息息相关的基于物联网的温湿度环境检测系统,一开始连这个系统该分为哪三个模块以及各自该做些什么都不清楚,但后来逐渐清楚了可以分为上位机、下位机和通信三个模块,而我此次负责通信模块,即将温湿度传感器的数据通过发送模块传到上位机实现通信。这部分的代码老师给出了其中一部分(其中一部分库文件比较老,因此需要安装64位机的GNU库文件),我补写了剩下的一些,其实这里面最难的就是十六进制转换为十进制的那段代码了,所幸并不是无迹可寻,中途也遇到过很多问题,但通过查询相关书籍、请教同学以及上网搜索都逐一解决了,因此最终还是编写成功了。本来还尝试扩展功能譬如当温度过高启用电机降温,但由于时间较短,又因为本人能力有限,这部分代码就没有编写。这次课设虽然时间短但是学到的东西一点儿也不少,对于java编程和与硬件的连接通信也有了一定的感悟,小组成员也分工有序,配合默契,相信下次我们可以实现扩展功能,使这个系统更加完善。六.附录源程序清单:packageorg.serial;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.util.Enumeration;importjava.util.TooManyListenersException;importjava.awt.FlowLayout;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JTextField;importgnu.io.CommPortIdentifier;importgnu.io.PortInUseException;importgnu.io.SerialPort;importgnu.io.SerialPortEvent;importgnu.io.SerialPortEventListener;importgnu.io.UnsupportedCommOperationException;/***@项目名称:illegalsms*@文件名称:SerialPort.java*@所在包:org.serial*@功能描述:*串口类*@创建者:*@创建日期:2016-12-23*@修改记录:*/@SuppressWarnings("serial")publicclassDSerialPortextendsJFrameimplementsRunnable,SerialPortEventListener{ privateStringappName="协调器数据接收";privateinttimeout=2000;//open端口时的等待时间privateintthreadTime=0;privateCommPortIdentifiercommPort;privateSerialPortserialPort;privateInputStreaminputStream;privateOutputStreamoutputStream;publicstaticintwendu1;publicstaticintwendu2;publicstaticintshidu1;publicstaticintshidu2;publicstaticbooleanopen;publicstaticdoublew1;publicstaticdoublew2;publicstaticdoubles1;publicstaticdoubles2;publicstaticdoublewx;publicstaticdoublesx;JFramef=newJFrame("环境温度检测");JButtonbutton1=newJButton("温度:"); JButtonbutton2=newJButton("湿度:"); JButtonbutton3=newJButton("温度下界:"); JButtonbutton4=newJButton("温度上界:"); JButtonbutton5=newJButton("理想温度:"); JButtonbutton6=newJButton("湿度上界:"); JButtonbutton7=newJButton("湿度下界:"); JButtonbutton8=newJButton("理想湿度:"); JTextFieldtf1; JTextFieldtf2; JTextFieldtf3; JTextFieldtf4; JTextFieldtf5; JTextFieldtf6; JTextFieldtf7; JTextFieldtf8; JTextFieldtf9; JTextFieldtf10; /***@方法名称:listPort*@功能描述:列出所有可用的串口*@返回值类型:void*/@SuppressWarnings("rawtypes")publicvoidlistPort(){ CommPortIdentifiercpid;Enumerationen=CommPortIdentifier.getPortIdentifiers();System.out.println("nowtolistallPortofthisPC:"+en);while(en.hasMoreElements()){cpid=(CommPortIdentifier)en.nextElement();if(cpid.getPortType()==CommPortIdentifier.PORT_SERIAL){System.out.println(cpid.getName()+","+cpid.getCurrentOwner());}}}/***@方法名称:selectPort*@功能描述:选择一个端口,比如:COM1*@返回值类型:void*@paramportName*/@SuppressWarnings("rawtypes")publicvoidselectPort(StringportName){mPort=null;CommPortIdentifiercpid;Enumerationen=CommPortIdentifier.getPortIdentifiers();while(en.hasMoreElements()){cpid=(CommPortIdentifier)en.nextElement();if(cpid.getPortType()==CommPortIdentifier.PORT_SERIAL&&cpid.getName().equals(portName)){mPort=cpid;break;}}openPort();}/***@方法名称:openPort*@功能描述:打开SerialPort*@返回值类型:void*/privatevoidopenPort(){ if(commPort==null)log(String.format("无法找到名字为'%1$s'的串口!",commPort.getName()));else{log("端口选择成功,当前端口:"+commPort.getName()+",现在实例化SerialPort:");try{serialPort=(SerialPort)commPort.open(appName,timeout);log("实例SerialPort成功!");}catch(PortInUseExceptione){thrownewRuntimeException(String.format("端口'%1$s'正在使用中!",commPort.getName()));}} try{ serialPort.setSerialPortParams(115200,SerialPort.DATABITS_8,//设置串口读写参数 SerialPort.STOPBITS_1,SerialPort.PARITY_NONE); }catch(UnsupportedCommOperationExceptione){}}/***@方法名称:checkPort*@功能描述:检查端口是否正确连接*@返回值类型:void*/privatevoidcheckPort(){if(commPort==null)thrownewRuntimeException("没有选择端口,请使用"+"selectPort(StringportName)方法选择端口");if(serialPort==null){thrownewRuntimeException("SerialPort对象无效!");}}/***@方法名称:write*@功能描述:向端口发送数据,请在调用此方法前先选择端口,并确定SerialPort正常打开!*@返回值类型:void*@parammessage*/publicvoidwrite(Stringmessage){checkPort();try{outputStream=newBufferedOutputStream(serialPort.getOutputStream());}catch(IOExceptione){thrownewRuntimeException("获取端口的OutputStream出错:"+e.getMessage());}try{outputStream.write(message.getBytes());log("信息发送成功!");}catch(IOExceptione){thrownewRuntimeException("向端口发送信息时出错:"+e.getMessage());}finally{try{outputStream.close();}catch(Exceptione){}}}/***@方法名称:startRead*@功能描述:开始监听从端口中接收的数据*@返回值类型:void*@paramtime监听程序的存活时间,单位为秒,0则是一直监听*/publicvoidstartRead(inttime){checkPort();ints;s=serialPort.getBaudRate();System.out.println("波特率为"+s);try{inputStream=newBufferedInputStream(serialPort.getInputStream());}catch(IOExceptione){thrownewRuntimeException("获取端口的InputStream出错:"+e.getMessage());}try{serialPort.addEventListener(this);}catch(TooManyListenersExceptione){thrownewRuntimeException(e.getMessage());}serialPort.notifyOnDataAvailable(true);log(String.format("开始监听来自'%1$s'的数据",commPort.getName()));if(time>0){this.threadTime=time*1000;Threadt=newThread(this);t.start();log(String.format("监听程序将在%1$d秒后关闭。。。。",threadTime));}}/***@方法名称:close*@功能描述:关闭SerialPort*@返回值类型:void*/publicvoidclose(){serialPort.close();serialPort=null;commPort=null;}publicvoidlog(Stringmsg){System.out.println(appName+"-->"+msg);}/***数据接收的监听处理函数*/@OverridepublicvoidserialEvent(SerialPortEventarg0){switch(arg0.getEventType()){caseSerialPortEvent.BI:/*Breakinterrupt,通讯中断*/caseSerialPortEvent.OE:/*Overrunerror,溢位错误*/caseSerialPortEvent.FE:/*Framingerror,传帧错误*/caseSerialPortEvent.PE:/*Parityerror,校验错误*/caseSerialPortEvent.CD:/*Carrierdetect,载波检测*/caseSerialPortEvent.CTS:/*Cleartosend,清除发送*/caseSerialPortEvent.DSR:/*Datasetready,数据设备就绪*/caseSerialPortEvent.RI:/*Ringindicator,响铃指示*/caseSerialPortEvent.OUTPUT_BUFFER_EMPTY:/*Outputbufferisempty,输出缓冲区清空*/break;caseSerialPortEvent.DATA_AVAILABLE:/*Dataavailableattheserialport,端口有可用数据。读到缓冲数组,输出到终端*/byte[]readBuffer=newbyte[16];try{while(inputStream.available()>0){@SuppressWarnings("unused") intnumBytes=inputStream.read(readBuffer);}outputStream.write("xiaogang".getBytes());Stringhex;StringBufferresult=newStringBuffer(); for(inti=0;i<readBuffer.length;i++){ hex=Integer.toHexString(readBuffer[i]&0xFF); if(hex.length()==1){ hex='0'+hex; } result.append(hex.toUpperCase()); }Strings=newString(result);int[]x=newint[4];int[]y=newint[4];for(inti=0;i<4;i++){ Strings1=s.substring(10+i,10+i+1); if(s1.equals("A")) x[i]=10; elseif(s1.equals("B")) x[i]=11; elseif(s1.equals("C")) x[i]=12; elseif(s1.equals("D")) x[i]=13; elseif(s1.equals("E")) x[i]=14; elseif(s1.equals("F")) x[i]=15; else x[i]=Integer.parseInt(s1); Strings2=s.substring(14+i,14+i+1); if(s2.equals("A")) y[i]=10; elseif(s2.equals("B")) y[i]=11; elseif(s2.equals("C")) y[i]=12; elseif(s2.equals("D")) y[i]=13; elseif(s2.equals("E")) y[i]=14; elseif(s2.equals("F")) y[i]=15; else y[i]=Integer.parseInt(s2);}wendu1=(4096*x[0]+256*x[1]+16*x[2]+x[3])/100;wendu2=(4096*x[0]+256*x[1]+16*x[2]+x[3])%100;shidu1=(4096*y[0]+256*y[1]+16*y[2]+y[3])/100;shidu2=(4096*y[0]+256*y[1]+16*y[2]+y[3])%100;if(wendu1>0&&wendu1<100){System.out.println(wendu1+"."+wendu2+"°"+""+shidu1+"."+shidu2+"%"); tf1.setText(String.valueOf(wendu1+"."+wendu2+"°")); tf2.setText(String.valueOf(shidu1+"."+shidu2+"%")); }if(open=true){ w1=Double.parseDouble(tf3.getText()); w2=Double.parseDouble(tf4.getText()); wx=Double.parseDouble(tf5.getText()); s1=Double.parseDouble(tf6.getText()); s2=Double.parseDouble(tf7.getText()); sx=Double.parseDouble(tf8.getText()); if(wendu1>0&&wendu1<100&&shidu1>0&&shidu1<100){ tf1.setText(String.valueOf(wendu1+"."+wendu2+"°")); tf2.setText(String.valueOf(shidu1+"."+shidu2+"%")); if(wendu1>=w1&&wendu1<wx){ tf9.setText(String.valueOf("当前温度低于舒适温度")); } if(wendu1>wx&&wendu1<=w2){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论