ZYL太原理工物联网大三课程设计实验报告环境监测.docx
《ZYL太原理工物联网大三课程设计实验报告环境监测.docx》由会员分享,可在线阅读,更多相关《ZYL太原理工物联网大三课程设计实验报告环境监测.docx(18页珍藏版)》请在冰点文库上搜索。
ZYL太原理工物联网大三课程设计实验报告环境监测
课程设计
课程名称:
物联网感知课程设计
设计名称:
环境监测系统
专业班级:
物联1403学号:
2014002091
学生姓名:
赵羽龙
指导教师:
呼克佑
2016年12月23日
太原理工大学课程设计任务书
学生姓名
赵羽龙专业班级
物联1403
课程名称
物联网感知课程设计
设计名称
环境监测系统
设计周数2
设计任务主要设计参数
运用已学的编程工具及物联网实验箱设计一个《环境监测》系统,该系统可实现如下功能:
1.读取环境的温度、湿度通过串口通信,读取至电脑程序界面显示。
2.根据在程序界面设置温度、湿度的上下限值,完成显示相应的温湿度调节机器的工作状态。
3.将监测到的温湿度值保存至文本文件。
设计的基本要求如下:
(1)选择合适的传感器来完成温度、湿度数据的采集。
(2)制作相应的显示界面,将采集的变量值实时显示设计的扩展要求如下:
判断温度过高过低、湿度过高过低时,通过电机控制空调、加湿器的启停。
设计内容设计要求
1、收集技术资料:
理解设计任务、查阅相关资料、搭建开发平台。
2、确定总体设计思想:
方案论证比较、确定总体设计方案。
3、感知层和传输层的设计:
感知模块的选择、传输模式与接口程序的设计。
4、应用层的设计:
各模块的功能说明、程序流程、代码编写。
5、系统调试与运行:
验证各项功能的实现。
6、书写设计报告:
按照课程设计报告的要求,编写设计报告。
主要参考资料
1、徐勇军.物联网实验教程.北京:
机械工业出版社.2011
2、李刚.疯狂JAVA讲义.电子工业出版社。
2016
3、KathySierra&BertBates.HeadFirs中t.国电力出版社.2016
学生提交归档文件
封面—任务书—目录—课程设计报告-参考文献
注:
1.课程设计完成后,学生提交的归档文件应按照:
封面—任务书—说明书—图纸的顺序进行装订上交(大张图纸不必装订)。
2.可根据实际内容需要续表,但应保持原格式不变。
指导教师签名:
日期:
一.功能分析
二.概要设计
1.系统组成
2.传感器选型
三.详细设计
1.硬件连接
2.程序设计
3.界面设计
四.系统说明
五.设计总结
1
1
1
1
1
1
1
3
3
4
4..
六.附录
程序设计课程设计报告
专业:
物联网工程班级:
1403姓名:
赵羽龙学号:
2014002091完成日期:
2016/12/23题目:
设计一个环境监测系统。
一.功能分析
环境监测系统主要包括对环境变量的采集和显示。
(1)选择合适的传感器来完成温度、湿度数据的采集。
(2)制作相应的显示界面,将采集的变量值实时显示。
(3)扩展功能:
判断温度过高过低、湿度过高过低时,通过电机控制空调、加湿器的启停。
二.概要设计1.系统组成
系统大体组成包括:
传感器模块、数据传送模块和电机控制模块。
系统框图如图1所示。
由于传感器模块没有外接电路,因此需要通过中间的协调器将数据转为串口形式发送到PC机上。
图1系统框图
2.传感器选型
选择SHT10单片数字温湿度传感器来监测环境。
SHT10采用CMOSens专利技术将温度湿度传感器、A/D转换器及数字接口无缝结合,使传感器具有体积小、响应速度快、接口简单、性价比高等特点。
电路连接时,接口简单,两线连接,SHT10的两线串行接口(bidirectional2-wire)在传感器信号读取和电源功耗方面都做了优化处理,其总线类似I2C总线但并不兼容I2C总线。
三.详细设计1.硬件连接
SHT10共有4个引脚,除了电源和地,数据和时钟引脚分别连接单片机P06、P07。
图2系统硬件框图
2.程序设计
IO口功能选择
(1)端口初始化程序staticvoidGPIOInit(void)
P0SEL&=~(1<<6);//时钟接口初始化,
P0DIR|=(1<<6);//IO口方向选择P0SEL&=~(1<<7);//数据接口初始化
P0DIR|=(1<<7);//IO口方向选择
}功能:
初始化SHT10接口;入口参数:
无;返回值:
无
(2)传感器采集程序
staticuint16ReadSHT10(uint8param){
doubletemp;
uint8i;
uint16result;uint16SORH=0;DATA_OUTPUT;DATA_HIGH;SCK_OUTPUT;SCK_LOW;
//通讯复位
for(i=0;i<10;i++)SCK_HIGH;MicroWait(30);SCK_LOW;MicroWait(30);
}
功能:
读取SHT10的温湿度值;入口参数:
0x00,温度;0x01,湿度;返回值:
温湿度值。
图3传感器工作时序图
SHT10工作时,要通过SCK引脚模拟时序来完成,因此,读传感器的数据时,需要单片机控制SCK产生一系列时序,配合DATA的变化以完成温湿度的数据采集。
对于采集到的湿度值需要通过以下的公式进行换算:
同样,温度值要经过以下换算,才能得到实际值,这些都在传感器的读写程序里完成
3.界面设计
(1)选择eclipse软件工具,建立工程。
(2)设计显示界面。
选用java的swing、awt组件设计界面。
界面采用flowlayout与gridlayout嵌套布局。
按照环境监测系统功能的需要添加组件。
四.系统说明本系统搭建了一个温湿度的采集显示环境,能够采集周围环境中的温度、湿度值,并且实时在PC机上显示。
PC机实时显示界面如图:
五.设计总结
系统采用SHT10单片数字温湿度传感器将温湿度采集集成在一起,数据的读取要采用时序控制来进行。
采集变量的实时显示由JAVA编制界面来完成。
我负责界面的设计和功能的实现。
首先选择eclipse软件工具,建立工程。
选用java的swing、awt组件设计界面。
根据功能需求将界面采用flowlayout与gridlayout嵌套布局。
按照环境监测系统功能的需要添加组件。
1.建立一个窗体,采用flowlayout布局。
2.添加一个标签,当作程序名称添加至窗体的North。
期间学习了设置文字的大小颜色。
3.将Center采用gridlayout,分为一行两列。
分别在两列中添加温度面板和湿度面板。
对布局更加熟悉。
4.分别在温度面板和湿度面板中添加当前值、上限值、下限值、及相应的调节机器的状态的标签和对应的显示的文本框。
5.对两个面板的当前值、上限值、下限值设置监听。
期间加深了对监听的设置和实现的理解。
6.添加串口通信面板和操作面板并对他们实现监听。
期间和学习了串口通信。
7.完成异常的抛出处理。
8.调用主函数即可完成界面的显示和相应功能。
在实验中遇到很多不懂的问题,通过书籍、上网查资料进行学习解决问题。
队友给我的帮助很大。
在本次实验中增强了问题的处理能力、加深了对传感器感知,熟练了Java的编程能
力。
六.附录
源程序文件名清单:
TempAndHum.h//传感器程序
Coordinator.h//协调器程序
//界面显示程序
(程序的实现需
主函数的类代码。
共有5个包分别实现异常处理、串口管理、界面设计、数据处理、方法实现。
要从网络下载配置串口通信的包)实验结果已经老师检查,成功实现要求功能。
下面仅给出初始化界面的类和packagecom.zyl;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.PrintWriter;
importgnu.io.SerialPort;
importgnu.io.SerialPortEvent;
importgnu.io.SerialPortEventListener;
importjava.text.*;
importjava.awt.*;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.util.List;
importjavax.swing.border.EtchedBorder;
importjavax.swing.border.TitledBorder;
importcom.yang.serialport.exception.NoSuchPort;
importcom.yang.serialport.exception.NotASerialPort;
importcom.yang.serialport.exception.PortInUse;
importcom.yang.serialport.exception.SerialPortParameterFailure;
importcom.yang.serialport.exception.TooManyListeners;
importcom.yang.serialport.manage.SerialPortManager;
importcom.yang.serialport.utils.ByteUtils;
importcom.yang.serialport.utils.ShowUtils;
importjava.awt.Color;
importjavax.swing.BorderFactory;
importjavax.swing.JButton;
importjavax.swing.JComboBox;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
//窗口初始化
publicclassCshextendsJFrameimplementsData{publicstaticDoublesdz=0.00;
publicstaticDoublewdz=0.00;
booleanthereIsSomeOne=false;booleantheDoorIsOpen=false;
/**
程序界面宽度
*/
publicstaticfinalintWIDTH=500;
*程序界面高度
*/
publicstaticfinalintHEIGHT=360;
//privateJTextAreadataView=newJTextArea();
//privateJScrollPanescrollDataView=newJScrollPane(dataView);
//串口设置面板
privateJPanelserialPortPanel=newJPanel();
privateJLabelserialPortLabel=newJLabe串l("口");
privateJLabelbaudrateLabel=newJLabe波l("特率");
privateJComboBoxcommChoice=newJComboBox();
privateJComboBoxbaudrateChoice=newJComboBox();
//操作面板
privateJPaneloperatePanel=newJPanel();
privateJButtonserialPortOperate=newJButton打("开串口");
privateListcommList=null;
privateSerialPortserialport;
publicCsh(){initComponents();actionListener();
initData();
}
privatevoidinitComponents(){
//数据显示//dataView.setFocusable(false);
//串口设置serialPortPanel.setBorder(BorderFactory.createTitledBorde串r(口"设置"));serialPortPanel.setVisible(true);
serialPortLabel.setForeground(Color.gray);serialPortPanel.add(serialPortLabel);
commChoice.setFocusable(false);serialPortPanel.add(commChoice);
baudrateLabel.setForeground(Color.gray);serialPortPanel.add(baudrateLabel);
baudrateChoice.setFocusable(false);serialPortPanel.add(baudrateChoice);
//操作operatePanel.setBorder(BorderFactory.createTitledBord操er(作""));operatePanel.setBounds(200,220,285,100);
serialPortOperate.setFocusable(false);serialPortOperate.setBounds(45,60,90,20);JLabela=newJLabel("");operatePanel.add(a);
operatePanel.add(serialPortOperate);
JLabelb=newJLabel("");operatePanel.add(b);
}
@SuppressWarnings("unchecked")privatevoidinitData(){
commList=SerialPortManager.findPort();
//检查是否有可用串口,有则加入选项中
if(commList==null||commList.size()<1){
ShowUtils.warningMessage没("有搜索到有效串口!
");
}else{
for(Strings:
commList){
commChoice.addItem(s);
}
}
baudrateChoice.addItem("9600");
baudrateChoice.addItem("19200");
baudrateChoice.addItem("38400");
baudrateChoice.addItem("57600");
baudrateChoice.addItem("115200");
}
privatevoidactionListener(){
serialPortOperate.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
if("打开串口".equals(serialPortOperate.getText())
&&serialport==null){openSerialPort(e);
}else{
closeSerialPort(e);
}
}
});
/**
打开串口
*@paramevt
*点击事件
*/
privatevoidopenSerialPort(java.awt.event.ActionEventevt){
//获取串口名称
StringcommName=(String)commChoice.getSelectedItem();
//获取波特率
intbaudrate=9600;
Stringbps=(String)baudrateChoice.getSelectedItem();baudrate=Integer.parseInt(bps);
//检查串口名称是否获取正确if(commName==null||commName.equals("")){
ShowUtils.warningMessage没("有搜索到有效串口!
");
}else{
try{
serialport=SerialPortManager.openPort(commName,baudrate);if(serialport!
=null){
//dataView.setText(串"口已打开"+"\r\n");serialPortOperate.setText(关"闭串口");
}
}catch(SerialPortParameterFailuree){
e.printStackTrace();
}catch(NotASerialPorte){
e.printStackTrace();
}catch(NoSuchPorte){
e.printStackTrace();
}catch(PortInUsee){
e.printStackTrace();
ShowUtils.warningMessage串("口已被占用!
");
}
}
try{
SerialPortManager.addListener(serialport,newSerialListener());}catch(TooManyListenerse){
e.printStackTrace();
}
}
/**
关闭串口
*@paramevt
*点击事件
*/
privatevoidcloseSerialPort(java.awt.event.ActionEventevt){SerialPortManager.closePort(serialport);//dataView.setText("串口已关闭"+"\r\n");serialPortOperate.setText打("开串口");
}
privateclassSerialListenerimplementsSerialPortEventListener{
/**
处理监控到的串口事件
*/
publicvoidserialEvent(SerialPortEventserialPortEvent){
switch(serialPortEvent.getEventType()){
caseSerialPortEvent.BI:
//10通讯中断ShowUtils.errorMessage与("串口设备通讯中断");break;
caseSerialPortEvent.OE:
//7溢位(溢出)错误
caseSerialPortEvent.FE:
//9帧错误
caseSerialPortEvent.PE:
//8奇偶校验错误
caseSerialPortEvent.CD:
//6载波检测
caseSerialPortEvent.CTS:
//3清除待发送数据
caseSerialPortEvent.DSR:
//4待发送数据准备好了
caseSerialPortEvent.RI:
//5振铃指示
caseSerialPortEvent.OUTPUT_BUFFER_EMPTY:
//2输出缓冲区已清空break;
caseSerialPortEvent.DATA_AVAILABLE:
//1串口存在可用数据byte[]data=null;
try{
if(serialport==null){ShowUtils.errorMessage串("口对象为空!
监听失败!
");
}else{
data=SerialPortManager.readFromPort(serialport);Stringtemp=ByteUtils.byteArrayToHexString(data,true);System.out.println(temp+"\r\n");
@SuppressWarnings("unused")Filefp=newFile("e:
\\a.txt");
if(((data[5]&0xff)>0)&&((data[5]&0xff)<20))
{
Doubleda=(double)(data[5]&0xff);if(((data[5]&0xff)>0)){
Doubledb=(double)(data[6]&0xff);
Doubledc=(double)((da*256)+db)/100;
wdz=dc;
//System.out.println(dc);System.out.println(wdz);
new
FileOutputStreamfosFileOutputStream("e:
\\a.txt",true);//true表示在文件末尾追加
fos.write("温度值:
".getBytes());fos.write(Double.toString(wdz).getBytes());fos.write("\n".getBytes());fos.close();//流要及时关闭
tf1.setText(Double.toString(wdz));
}
}if(((data[7]&0xff)>0)&&((data[7]&0xff)<20))
{
Doubleda=(double)(data[7]&0xff);if(((data[5]&0xff)>0))
{
Doubledb=(double)(data[8]&0xff);Doubledc=(double)((da*256)+db)/100;sdz=dc;
//System.out.println(dc);//System.out.println(sdz);tf6.setText(Double.toString(sdz));
new
FileOutputStreamfos
FileOutputStream("e