基于温湿度传感器物联网应用实时数据处理系统开发.docx
《基于温湿度传感器物联网应用实时数据处理系统开发.docx》由会员分享,可在线阅读,更多相关《基于温湿度传感器物联网应用实时数据处理系统开发.docx(12页珍藏版)》请在冰豆网上搜索。
基于温湿度传感器物联网应用实时数据处理系统开发
《无线传感器网络实用教程》课程设计
基于温湿度传感器物联网应用实时
数据处理系统开发_
系别计算机科学系
专业通信工程
班级一
学号XXXXXXXXXXX
组次X
姓名XXX
指导教师XXX
评定成绩
起止日期2012年10月8日至2012年10月29日
摘要3
第2章温湿度传感器的简介4
1、开发环境6
2、开发内容6
3、技术路线7
1)实时数据存储7
2)实时数据发送8
摘要
物联网是新一代信息技术的重要组成部分。
其英文名称是“TheInternetofthings”。
由此,顾名思义,“物联网就是物物相连的互联网”。
这有两层意思:
第一,物联网的核心和基础仍然是互联网,是在互联网基础上的延伸和扩展的网络;第二,其用户端延伸和扩展到了任何物品与物品之间,进行信息交换和通信。
因此,物联网的定义是通过(RFID)、红外感应器、、等信息传感设备,按约定的协议,把任何物品与互联网相连接,进行信息交换和通信,以实现对物品的智能化识别、定位、跟踪、监控和管理的一种网络。
而温湿度传感器是由于温度与湿度不管是从物理量本身还是在实际人们的生活中都有着密切的关系,所以温湿度一体的传感器就会相应产生。
温湿度传感器是指能将温度量和湿度量转换成容易被测量处理的电信号的设备或装置。
市场上的温湿度传感器一般是测量温度量和相对湿度量。
第1章课程设计的目的与要求
课程设计目的
物联网是一种新概念和新,它使新一代IT技术更加充分地应用于各行各业之中。
它的问世打破了过去将基础设施与IT设施分开的传统观念,将建筑物、公路、铁路和网站、网络、数据中心合为一体,是信息化和工业化融合的重要切入点。
温湿度与人们的生活关系密切,所以物联网在温湿度实时数据处理系统的开发将有很大的前景。
在我们的日常生活中无处不在,控制好温湿度可以使我们生活、生产的更好。
温湿度传感器物联网应用实时数据处理系统开发可以帮我们实现对温湿度以实时数据让我们明了的知道。
从而更好的控制温湿度、达到我们所需的标准。
要达到的目的:
1.可以在ubuntu上实现自动接收由传感器取得、传来的实时数据。
2.并ubuntu上能边接收边连续往linux发送从传感器取得的实时数据。
3.还要确保发送过的数据不会再次发送。
4.Linux能接收到ubuntu发过来的实时数据并通过动态网页曲线图实时显示接收过来的数据。
课程设计要求
1.通过ubuntu连接传感器实验箱收集由传感器测得的实时数据存入sqlite3数据库。
2.然后通过ubuntu发送到linux、接收并用动态网页显示代表数据变化的曲线。
第2章温湿度传感器的简介
由于温度与湿度不管是从物理量本身还是在实际人们的生活中都有着密切的关系,所以温湿度一体的传感器就会相应产生。
温湿度传感器是指能将温度量和湿度量转换成容易被测量处理的电信号的设备或装置。
市场上的温湿度传感器一般是测量温度量和相对湿度量。
温度:
度量物体冷热的物理量,是国际单位制中7个基本物理量之一。
在生产和科学研究中,许多物理现象和化学过程都是在一定的温度下进行的,人们的生活也和他密切相关。
湿度:
湿度很久以前就与生活存在着密切的关系,但用数量来进行表示较为困难。
对湿度的表示方法有绝对湿度、相对湿度、露点、湿气与干气的比值(重量或体积)等等。
日常生活中最常用的表示湿度的物理量是空气的相对湿度。
用%RH表示。
在物理量的导出上相对湿度与温度有着密切的关系。
一定体积的密闭气体,其温度越高相对湿度越低,温度越低,其相对湿度越高。
其中涉及到复杂的热力工程学知识。
有关湿度的一些定义:
相对湿度:
在计量法中规定,湿度定义为“物象状态的量”。
日常生活中所指的适度为相对湿度,用RH%表示。
总之,即气体中(通常为空气中)所含水蒸气量(水蒸气压)与其空气相同情况下饱和水蒸气量(饱和水蒸汽压)的百分比。
绝对湿度:
指单位容积的空气里实际所含的水汽量,一般以克为单位。
温度对绝对湿度有着直接影响,一般情况下,温度越高,水蒸气发得越多,绝对湿度就越大;相反,绝对湿度就小。
饱和湿度:
在一定温度下,单位容积,空气中所能容纳的水汽量的最大限度。
如果超过这个限度,多余的水蒸气就会凝结,变成水滴,此时的空气湿度变称为饱和湿度。
空气的饱和湿度不是固定不变的,它随着温度的变化而变化。
温度越高,单位容积空气中能容纳的水蒸气就越多,饱和湿度就越大。
露点:
指含有一定量水蒸气(绝对湿度)的空气,当温度下降到一定程度时所含的水蒸气就会达到饱和状态(饱和湿度)并开始液化成水,这种现象叫做凝露。
水蒸气开始液化成水时的温度叫做“露点温度”简称“露点”。
如果温度继续下降到露点以下,空气中超饱和的水蒸气就会在物体表面上凝结成水滴。
此外,风与空气中的温湿度有密切关系,也是影响空气温湿度变化的重要因素之一。
选择的注意事项:
①、选择测量范围
和测量重量、温度一样,选择湿度传感器首先要确定测量范围。
除了气象、科研部门外,搞温、湿度测控的一般不需要全湿程(0-100%RH)测量。
②、选择测量精度
测量精度是湿度传感器最重要的指标,每提高—个百分点,对湿度传感器来说就是上一个台阶,甚至是上一个档次。
因为要达到不同的精度,其制造成本相差很大,售价也相差甚远。
所以使用者一定要量体裁衣,不宜盲目追求“高、精、尖”。
如在不同温度下使用湿度传感器,其示值还要考虑温度漂移的影响。
众所周知,相对湿度是温度的函数,温度严重地影响着指定空间内的相对湿度。
温度每变化0.1℃。
将产生0.5%RH的湿度变化(误差)。
使用场合如果难以做到恒温,则提出过高的测湿精度是不合适的。
多数情况下,如果没有精确的控温手段,或者被测空间是非密封的,±5%RH的精度就足够了。
对于要求精确控制恒温、恒湿的局部空间,或者需要随时跟踪记录湿度变化的场合,再选用±3%RH以上精度的湿度传感器。
而精度高于±2%RH的要求恐怕连校准传感器的标准湿度发生器也难以做到,更何况传感器自身了。
相对湿度测量仪表,即使在20—25℃下,要达到2%RH的准确度仍是很困难的。
通常产品资料中给出的特性是在常温(20℃±10℃)和洁净的气体中测量的。
③、考虑时漂和温漂
在实际使用中,由于尘土、油污及有害气体的影响,使用时间一长,电子式湿度传器会产生老化,精度下降,电子式湿度传感器年漂移量一般都在±2%左右,甚至更高。
一般情况下,生产厂商会标明1次标定的有效使用时间为1年或2年,到期需重新标定。
④、其它注意事项
湿度传感器是非密封性的,为保护测量的准确度和稳定性,应尽量避免在酸性、碱性及含有机溶剂的气氛中使用。
也避免在粉尘较大的环境中使用。
为正确反映欲测空间的湿度,还应避免将传感器安放在离墙壁太近或空气不流通的死角处。
如果被测的房间太大,就应放置多个传感器。
有的湿度传感器对供电电源要求比较高,否则将影响测量精度。
或者传感器之间相互干扰,甚至无法工作。
使用时应按照技术要求提供合适的、符合精度要求的供电电源。
传感器需要进行远距离信号传输时,要注意信号的衰减问题。
当传输距离超过200m以上时,建议选用频率输出信号的湿度传感器。
第3章课程设计实现方案
一、开发环境
1.硬件(详细介绍所涉及硬件的详细内容)
Pc机、温湿度传感器、传感器实验箱、连接所需的各种线。
2.软件(详细介绍所涉及软件的详细内容)
MDK414(arm平台编译烧录代码软件)、KeilC51v750a_Full(C51平台编译软件)、STC手动下载(C51烧录代码软件)、R340(串口线连接USB驱动)、ubuntu操作系统、linux操作系统。
3.其它
二、开发内容
1.项目开发详细内容(包括传感器的配置、传感器烧录、数据的实时收集、实时数据的存储、实时数据的传输、实时数据在服务器端的接受及存储-TCPServer及MySql、数据库及Web服务器安装、利用JSP曲线动态显示实时数据)
首先烧录整合好的温湿度传感器的代码。
接着连接传感器取得数据。
然后在ubuntu中编译并运行Com_Sensor程序获取传感器实验箱的数据。
在Ubuntu11编译并运行senddata.c把数据发送到linux.Linux通过TCPServer服务器接收数据并存入MySQL数据库。
最后将接收到的数据通过Linuxweb服务器以jsp曲线动态显示实时数据。
2.网络拓扑图(包括传感器、网关、传输网络、TCPServer服务器、数据库服务器、静态及动态Web服务器、Web服务器客户端;并详细标注设备名称及IP地址等详细信息;并详细叙述网络拓扑图流程)
三、技术路线
1.实时数据存储(如何安装及使用Sqlite3,给出存储实时数据的Sqlite3数据表格的详细的数据列及数据类型)
安装步骤:
aptitudeupdate
aptitudeinstalllibsqlite3-dev
aptitudeinstallsqlite3
数据类型CREATETABLESdata(idint,datetimedatetime,Temperaturefloat,Humidityfloat,flagintdefault0);
+-------------+-------------+------+-----+---------+-------+
|Field|Type|Null|Key|Default|Extra|
+-------------+-------------+------+-----+---------+-------+
|id|int|NO||||
|dateTime|varchar(50)|NO||||
|Temperature|float|NO||||
|Humidity|float|NO||||
|flag|int(11)|YES||0||
+-------------+-------------+------+-----+---------+-------+
2.实时数据发送(说明如何实现自动连续发送实时数据、说明如何保证已经成功发送的数据不能再次发送、给出实时数据发送的源代码;是否遇到问题及如何解决)
发送源代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineBUFSIZE1024
/*
*error-wrapperforperror
*/
voiderror(char*msg){
perror(msg);
exit(0);
}
char*MyStrcat(char*a,char*b)
{
inti=0;
char*p=a,*q=b,*c,*cc;
while(*p++)i++;
while(*q++)i++;
p=a;q=b;i++;
c=(char*)malloc(i*sizeof(char));
cc=c;
while(*p)*cc++=*p++;
while(*q)*cc++=*q++;
*cc=0;
returnc;
}
intmain(intargc,char**argv){
intsockfd,portno,n;
structsockaddr_inserveraddr;
structhostent*server;
char*hostname;
charbuf[BUFSIZE];
intretval,retval2;
intq_cnt=5,q_size=150,ind=0;
char**queries=malloc(sizeof(char)*q_cnt*q_size);
sqlite3_stmt*stmt;
sqlite3*handle;
char*d;
charsentstr[1024];
charwhitespace[]="$";
charendofline[]="#";
charendofsentstr[]="\n";
char*sql;
if(argc!
=3){
fprintf(stderr,"usage:
%s\n",argv[0]);
exit(0);
}
hostname=argv[1];
portno=atoi(argv[2]);
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
error("ERRORopeningsocket");
server=gethostbyname(hostname);
if(server==NULL){
fprintf(stderr,"ERROR,nosuchhostas%s\n",hostname);
exit(0);
}
bzero((char*)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
bcopy((char*)server->h_addr,
(char*)&serveraddr.sin_addr.s_addr,server->h_length);
serveraddr.sin_port=htons(portno);
if(connect(sockfd,&serveraddr,sizeof(serveraddr))<0)
error("ERRORconnecting");
retval=sqlite3_open("Seninfo.db",&handle);
if(retval)
{
printf("Databaseconnectionfailed\n");
return-1;
}
printf("Connectionsuccessful\n");
queries[ind++]="SELECT*fromSdatawhereflag==0";
retval=sqlite3_prepare_v2(handle,queries[ind-1],-1,&stmt,0);
if(retval)
{
printf("SelectingdatafromDBFailed\n");
return-1;
}
intcols=sqlite3_column_count(stmt)-1;
printf("cols=%d\n",cols);
memset(sentstr,0,sizeof(sentstr));
while
(1)
{
retval=sqlite3_step(stmt);
if(retval==SQLITE_ROW)
{
constchar*val2=(constchar*)sqlite3_column_text(stmt,0);
sql=sqlite3_mprintf("updateSdatasetflag=1whereid='%s'",val2);
sqlite3_exec(handle,sql,0,0,0);
for(intcol=0;col{
constchar*val=(constchar*)sqlite3_column_text(stmt,col);
d=MyStrcat(sentstr,val);
strcpy(sentstr,d);
d=MyStrcat(sentstr,whitespace);
strcpy(sentstr,d);
printf("%s=%s\t",sqlite3_column_name(stmt,col),val);
}
d=MyStrcat(sentstr,endofline);
strcpy(sentstr,d);
printf("\n");
}
elseif(retval==SQLITE_DONE)
{
printf("sentstr=%s",sentstr);
printf("Allrowsfetched\n");
}
else
{
printf("Someerrorencountered\n");
return-1;
}
d=MyStrcat(sentstr,endofsentstr);
strcpy(sentstr,d);
n=write(sockfd,sentstr,strlen(sentstr));
if(n<0)
error("ERRORwritingtosocket");
printf("Waiting5seconds\n");
sleep
(1);
bzero(sentstr,BUFSIZE);
n=read(sockfd,sentstr,BUFSIZE);
if(n<0)
error("ERRORreadingfromsocket");
printf("Echofromserver:
%s\n",sentstr);
memset(sentstr,0,sizeof(sentstr));
close(sockfd);
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
error("ERRORopeningsocket");
server=gethostbyname(hostname);
if(server==NULL)
{
fprintf(stderr,"ERROR,nosuchhostas%s\n",hostname);
exit(0);
}
bzero((char*)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
bcopy((char*)server->h_addr,
(char*)&serveraddr.sin_addr.s_addr,server->h_length);
serveraddr.sin_port=htons(portno);
if(connect(sockfd,&serveraddr,sizeof(serveraddr))<0)
error("ERRORconnecting");
}
return0;
}
将实时接收的数据标记为0,已经发送的数据标记为1,当数据检测到为1是时就拒绝发送。
这样就不会重复发送。
问题:
对于如何保证已经成功发送的数据不能再次发送纠结了很久没有结果、后来请教了同学才解决了问题。
第4章课程设计结果
第5章结论与体会
在做本次课程设计的过程中,我感触最深的当属查阅大量资料。
为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。
我们是在做《基于温湿度传感器物联网应用实时数据处理系统开发》的课程设计,我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。
其次,我发现在学习的过程中带着问题去学效率很高,这是我做这次课程设计的又一收获。
要做好一个课程设计,就必须做到:
在设计程序之前,对所设计的题目有一个系统的了解,知道包括哪些方面;要有一个清晰的思路和一个完整的流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。