您的位置:首页 > 业界新闻

基于互联网的温度采集系统

2013-07-17 21:13 218 查看


1 绪论...
1

1.1 课题背景...
1

1.2 研究内容...
1

1.3 发展前景...
1

1.4 研究意义...
2

2. 开发平台介绍...
2

2.1 开发环境...
2

2.2 操作平台及开发软件介绍...
2

2.2.1 操作平台...
2

2.2.2 开发平台及相关软件介绍...
2

2.3 系统实现所需关键技术...
3

2.3.1 Socket编程...
3

2.3.2 嵌入式Linux 驱动...
3

2.3.3 Linux应用程序移植步骤...
3

3. 需求分析...
3

3.1 引言...
3

3.2 功能需求...
3

3.2.1 整体功能模块...
3

3.2.2 系统构件图...
4

3.2.3 系统部署图...
5

3.2.4 系统功能清单...
5

3.3 性能需求...
5

3.4 故障处理及其它专门处理要求...
6

4.详细设计...
6

4.1 概述...
6

4.2 服务器模块...
6

4.2.1  模块功能说明...
6

4.2.2  服务器类的设计...
6

4.2.3  操作时序...
7

4.2.4 界面设计...
8

4.3 开发板模块...
9

4.3.1 模块说明...
9

4.3.2客户端类设计...
9

4.4 驱动模块...
9

4.4.1 驱动模块说明...
9

4.4.2DS18B20 驱动...
10

4.4.3 报警功能...
10

4.5 采集点硬件设计...
11

4.5.1 硬件设计说明...
11

4.5.2 硬件电路...
11

4.6 系统采用的自定义协议...
11

4.7 读取多点温度序列号算法...
12

4.7.1 读取序列号整体流程...
12

4.7.2 搜索算法介绍...
13

4.7.3 算法实现...
13

4.7.4 搜索算法流程图...
14

4.7.5 搜索算法核心代码...
15

5. 测试...
18

5.1 测试说明...
18

5.2 测试过程...
18

5.3 测试结果...
18

5.3.1 开发板温度显示测试结果...
18

5.3.2 开发板报警功能和打开LED灯...
19

5.3.3关闭LED灯...
19

5.3.4服务器报警...
19

6. 结论...
20

参考文献:...
20

 

 

基于互联网的温度采集系统

摘    要:随着物联网和嵌入式技术的发展,其应用范围越来越广泛。本系统采用1-wire总线技术,通过DS18B20温度传感器采集温度,将温度信息发送到客户端。客户端基于ARM S3C2440微处理器架构和Linux操作系统,使用Qt库开发温度显示界面,并将温度信息通过TCP协议传送到服务器。服务器使用QT库开发图形显示界面,显示温度并控制客户端的行为。实现了具有传输控制功能的多点温度采集系统。经测试,该系统稳定性好,能实现客户端的远程自动控制。

关键词:Linux;1-wire总线;TCP协议

1 绪论

1.1 课题背景

随着社会的发展,科学技术在不断进步的同时也带动了测量技术的发展,现代控制设备相比以前,它们在性能和结构发生了巨大的变化。我们已经进入了高速发展的信息时代,测量技术已经成为了社会的主流,被广泛且深入的应用到各个领域[1]。

1.2 研究内容

本系统主要研究内容主要有以下几点:                         

(1) 基于1-wire总线协议和互联网的多点温度采集。

(2) 读多个DS18B20 序列号算法的研究。

(3) Linux-ARM平台Qt应用程序的移植。

1.3 发展前景

温度采集器是可以通过温度传感器与单片机组合使用能测试温度的仪器,该系统结构简单,抗干扰能力强,适合恶劣环境下进行现场温度测量,并具有远程采集温度信息的能力,有广泛的应用前景[2]。

1.4 研究意义

多路温度采集系统已被广泛应用于温度测量或与其相关的可转换为温度量或供电故障监控的工业、农业、环保、安全监控等系统工程中。考虑到许多工业环境中对多点温度进行监控,一般需要测量几十个点以上,而且很多都需要远距离无线控制[3]。

2. 开发平台介绍

2.1 开发环境

硬件平台

CPU:Intel® Pentium® Processor E5200 (2M Cache, 2.50 GHz, 800 MHz FSB)

内存:2G。

软件平台

操作系统:Windows XP , fedora 10。

开发工具:Qt Creater, vmware workstation, Keil 4, arm-linux-gcc , make。

调试工具:sockit , 串口调试助手 , minicom;

2.2 操作平台及开发软件介绍

2.2.1
操作平台

采用Client/Server结构,服务器采用基于windows XP 操作系统,客户端采用Qt库的进行图形界面界面的设计。

2.2.2
开发平台及相关软件介绍

(1) Qt Creater

Qt是一个跨平台的C++图形用户界面库[4],Qt支持所有的UNIX类系统。

(2)Keil4

Keil是的微控制器软件开发平台,它的界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。

2.3
系统实现所需关键技术

2.3.1 Socket 编程

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。它把复杂的TCP /IP协议族隐藏在Socket接口后面,对用户来说,他们只需要使用接口,而底层的东西就让Socket去组织数据,以符合指定的协议。

2.3.2 嵌入式Linux 驱动

嵌入式设备随着电子计算机技术的发展已经越来越普遍并且越来越受欢迎。计算机软件和集成电路技术的发展,为嵌入式产业带来巨大的机遇与与挑战,Linux以其稳定,高效,易定制,硬件广泛支持等特点,迅速成为当今计算机领域的一匹黑马,驱动程
4000
序是高级应用程序与硬件设备之间的桥梁,驱动程序开发是软硬件结合的技术[5]。

2.3.3 Linux应用程序移植步骤

(1) 建立交叉编译环境。

(2) 交叉编译目标板的Linux内核。

(3) 交叉编译Linux应用程序。

(4) 将应用程序传到目标板。

3. 需求分析

3.1 引言     

需求分析主要用于归纳系统总体的功能及非功能方面的需求,为下一阶段的设计分析提供依据和约束。

3.2 功能需求

3.2.1 整体功能模块

(1) 服务器模块功能包括:温度显示, 报警提示, LED控制。

(2) 客户端模块功能包括:温度显示。

(3) 驱动模块功能包括:

① LED_IO控制。

② 蜂鸣器控制。

③ DS18B20温度的读取。

系统整体功能模块如图3-1所示:

 

 

 

 

 

 

 

 

 

 

 

3.2.2 系统构件图

系统主要由3部分构件组成:

(1)PC端服务器。

(2)基于ARM,Linux的客户端。

(3)由DS18B20组成的传感器部件。

系统构件图如图3-2所示:

 

      

 

 

 

 

 

 

 

 

 

3.2.3 系统部署图

系统部署如图3-2所示:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

             

3.2.4 系统功能清单

系统功能清单如表3-1所示:

表3-1系统功能清单
功能模块
子功能名称

                                功能介绍                               

服务器模块
温度显示

显示从ARM客户端读到的温度信息

报警提示

单温度超过一定值时,提示报警信息

LED控制

远程控制系统的LED灯

客户端模块
温度显示

显示调用DS18B20驱动模块所获得的温度信息

驱动模块
LED_IO控制

控制系统的LED灯

蜂鸣器控制

当温度到达一定限度时开启蜂鸣器

DS18B20温度的读取

利用1-wire总线协议和DS18B20内置命令控制温度采集点并读取温度信息

3.3 性能需求    

系统应保证在硬件设备正常情况下能长期稳定运行[6],避免出现系统崩溃。软件必须保证有足够的数据精度,不影响正常业务;系统应尽量做到响应快速、操作简便。

3.4 故障处理及其它专门处理要求

(1)故障处理:软件在运行过程中产生的的错误,重启系统。

(2)其他专门处理:软件必须严格按照设定的安全权限机制运行,并有效防止非授权用户进入本系统;软件对用户的所有误操作或不合法操作进行检查,并给出提示信息。

4.详细设计

4.1 概述  

详细的介绍了各个模块开发的步骤,对概要设计进一步细化,详细设计每个模块实现算法。
4.2 服务器模块

4.2.1  模块功能说明                                

本模块主要是供管理员使用,管理员通过服务器模块软件,可以远程控制ARM客户端的LED灯,观看远程温度采集点的温度和温度采集点是否出现报警信息。

4.2.2  服务器类的设计

(1)服务器类接口说明

incomingConnection()   //触发新TCP链接。

listen()               //监听是否有新链接。   

openLed()            //打开LED灯。

closeLed()            //关闭LED灯。

readClient()           //从客户端读取温度信息。

sendMessage()        //向客户端写入控制命令。

dataShow()           //更新温度信息。

setValue()            //将控制命令写入脚本。

value()              //从脚本中读取温度信息。

(2) 服务器UML类如图4-1所示:

 

 

 

 

 

 

 

 

 

 

 

 

4.2.3  操作时序

(1)读取ARM客户端温度时序及时序图

      ①客户端请求链接。

      ②服务器响应链接并应答。

      ③客户端向主机传送温度值。

      ④主机读取温度值。

      ⑤主机将温度值写入脚本。

      ⑥主机从脚本中读取温度值并将其送到显示界面。

读取ARM客户端温度时序如图4-2所示:

 

 

 

 

 

 

 

 

 

 

 

(2)控制LED的时序

      ①主机将控制命令写入脚本文件。

      ②主机读取脚本文件并传送到客户端。

      ③客户端读取来自主机的命令并执行。

控制LED的UML时序图[7]如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.2.4 界面设计

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.3 开发板模块

4.3.1 模块说明

开发板模块主要是基于S3C2440处理器和Linux操作系统[8],使用QT库开发显示温度的图形界面。通过动态加载内核模块的形式,将温度驱动模块,蜂鸣器驱动模块以及IO控制模块挂载到内核中。

4.3.2客户端类设计

(1) 客户端类接口说明

alert()   //当温度超过一定值,让蜂鸣器以一定频率振动,实现报警功能

temShow()      //以一定时间间隔更形显示界面的温度值

readServer()     //读取主机的控制命令

comnectToHost() //向主机发送链接请求

write()         //向主机写入温度值

(2) 客户端UML类如图4-5所示:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.4 驱动模块

4.4.1 驱动模块说明

本模块主要由DS18B20驱动[9],蜂鸣器驱动,以及IO控制驱动三部分组成,实现了对IO的控制和温度采集点以及蜂鸣器的驱动。

4.4.2 DS18B20 驱动

(1) 驱动模块读取温度步骤[9]

      ①初始化DS18B20。

      ②如果初始化不成功,则重新发送复位电平,

      重复20次,初始化不成功则退出。

      ③匹配要读取温度的ROM码并启动温度转换命令。

      ④读取温度值。

      ⑤将读取到的温度值复制到用户区[10]。

(2) 读取温度流程如图4-6所示:

 

图4-6 读取温度流程图

 

 
                    

 

4.4.3 报警功能

当温度超过一定值时,与温度采集点对应的LED灯以一定频率不断闪烁,同时蜂鸣器以一定频率振动。

4.5 采集点硬件设计

4.5.1 硬件设计说明       

由外接电源为系统供电,采用4.7K电阻作为上拉电阻,LED灯控制采用510Ω电阻。

4.5.2 硬件电路

系统温度芯片部分硬件电路[11]如图4-7所示:

图4-7 硬件电路图

 

 
 

 

 

4.6 系统采用的自定义协议

(1)ARM采集温度存储协议(数据压缩)

因为本系统不考虑温度小于0 的情况,所以将用于存取温度的S为用来表示温度点的代号(00001表示采集点一,00010表示采集点2,以此类推),将表示温度信息的数据压缩到16位。

表4-1 ARM采集温度存储协议

15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
用来表示温度点的代号

用来存储温度的位数
 

 

 

 

 

1
 1

1
1
1
1
1
1
1
1
1
(2)ARM与服务器通信温度信息协议

本协议由6个字节构成,以#号表示温度信息标志,温度代号为1~5,温度信息为3个字节,精确到一个小数点。

表4-2 ARM与服务器通信温度信息协议

5
4
3
2
1
0
传输的总字节数

温度标志
温度点代号

温度信息
6
#
 

 

 (3)LED灯控制协议

本协议由4个字节构成,以$表示控制信息标志,控制信息为1或0,1表示打开LED灯,0表示关闭。

表4-3 LED灯控制协议

4

3

2

1

传输的总字节数

控制信息标志

LED点代号

控制信息

4

$

 

 

                                                                                      

4.7 读取多点温度序列号算法

4.7.1 读取序列号整体流程

(1)流程介绍

首先,通过复位(Reset) 和在线应答脉冲(Presence Pulse) 时隙将1-Wire 总线上的所有器件复位成功。然后初始化串口,最后通过搜索算法将芯片的ROM码写入串口,通过串口调试工具接收显示,以达到获取器件的64 位ROM 注册码。

(2)读序列号整体流程图

 

 

 

4.7.2 搜索算法介绍

搜索算法的模型是二叉树结构,搜索过程沿各分节点进行搜索,直到找到器件的叶子节点,后续的搜索操作沿着节点上的其它路径进行,每读到一个叶子节点也就是读取到一个采集点的序列号。

4.7.3 算法实现

搜索命令发出后,开始实际的搜索,首先总线上的所有从机器件同时依次从最低有效位开始将ROM 码写到总线上。 与所有的1-Wire 通信一样,无论是读取数据还是向从机器件写数据,都由1-Wire 主机启动,每一位操作按照1-Wire 的特性,所有从机器件同时应答主机时结果。相当于全部发送数据位的逻辑AND ,从机发送其ROM 码的第一位后,主机启动下一位操作,接着从机发送第一位数据的补码,从两次读到的数据位可以对ROM 码的第一位做出几种判断,具体请见表4-4。

表4-4检索信息位

实际位

实际位补码

结论

0

0

从机ROM 码中的当前位既有0 也有1 即存在差异

0

1

从机ROM 码的当前位均为0

1

0

从机ROM 码的当前位均为1

1

1

总线上没有从机器件响应
按照搜索算法, 主机向总线上的从机发回一个指定位。如果从机器件中ROM码的当前位的值与该数据位匹配,则继续参与搜索过程。否则,转换到等待状态并保持等待状态直到下一个1-Wire 复位信号到来。剩下的63 位ROM 码的依然按照这种 “读两位写一位”的模式进行重复操作。最后读出所有从机的ROM码值,见表4-5。

表4-5 1-Wire主机和从机的搜索ROM码过程步骤

主机
从机
主机发出复位信号

产生应答脉冲

写搜索命令 (F0H)

从机准备响应搜索

读第 1 位的AND

从机发送 ROM 码的第1 位

读第 1 位补码的AND

从机发送ROM 码的第1 位的补码

写第 1 位指定位

从机接收主机的指定位,若所读的位与ROMROM码的第1 位不匹配则进入等待状态

重复读两位写一位的操作直到所有ROM码都被读出
从表4-4 可以看出:如果所有总线上的器件在当前位具有相同值,那么只有一条分支路径可选。总线上没有器件响应的情况是一种异常状态,可能是要查找的器件在搜寻过程中与1-Wire 总线脱离。如果当前位既有0 也有1 ,这种情况称为位值差异,它对在后续搜索过程中查找器件起关键作用。搜索算法指定在第一轮查询中若出现差异数据位补码 = 0/0 ,则选用0 路径。具体搜索路径方向见表4-6。

表4-6 搜索路径方向

搜索位冲突所在位置和最后一次冲突所在位置的比较

路径选取

相等
采用路径1

小于
采用与上次相同的路径来自上次搜索到的ROM 码

大于
采用路径0

4.7.4 搜索算法流程图

图4-8 搜索算法流程图1

 

 
 

         

 

图4-9 搜索算法流程图2

 

 
图4-10 搜索算法流程图3

 

 
 

 

4.7.5 搜索算法核心代码

uchar search()

{

      uchar id_bit_number, last_zero, rom_byte_number, search_result;

      uchar id_bit, cmp_id_bit;

      uchar rom_byte_mask, search_direction;

 

      // 初始化

    id_bit_number = 1;

    last_zero = 0;

    rom_byte_number = 0;

    rom_byte_mask = 1;

    search_result = 0;

 

      //如果还没搜索完最后一个器件

      if (!LastDeviceFlag)

      {

             reset();

             write_byte(0xf0);

             do

             {

                    id_bit = read_bit();

                    cmp_id_bit = read_bit();

                    //如果都为的话则说明没有器件存在

                    if ((id_bit == 1) && cmp_id_bit == 1)

                           break;

                    else

                    {

                           //如果第一位跟第二位不相等则读到的rom码为为id_bit

                           if (id_bit != cmp_id_bit)

                                  search_direction = id_bit;

                           else

                           {

                                  //走以前相同的路径

                                  if (id_bit_number <LastDiscrepancy)

search_direction =((ROM_NO[rom_byte_number] & rom_byte_mask) > 0);

                     //新冲突的话走路径旧的最后冲突取路径

                                  else

search_direction=(id_bit_number==LastDiscrepancy);

 

                                  //调整最后冲突位置

                                  if(search_direction == 0)

                         last_zero = id_bit_number;    

                           }

 

 

                           //存储读到的rom码

                           if (search_direction == 1)

                           ROM_NO[rom_byte_number]|= rom_byte_mask;

               else

                     ROM_NO[rom_byte_number]&= ~rom_byte_mask;

                           //沿此路径向下搜索

                           write_bit(search_direction);

                           id_bit_number++;

                       rom_byte_mask<<= 1;

 

                           //重新置为rom_byte_mask

                           if (rom_byte_mask == 0)

                       {

                     rom_byte_number++;

                     rom_byte_mask = 1;

               }

                    }

             }while(rom_byte_number < 8);

 

             if (id_bit_number > 64)

        {

               //更新最后冲突位置

                     LastDiscrepancy = last_zero;

                     search_result = TRUE;

      }    

              

             if (LastDiscrepancy == 0)

                   LastDeviceFlag= TRUE;       

      }    

      return search_result;

}

5. 测试

5.1
测试说明

软件测试主要工作内容是验证(verification)和确认(validation )。

(1)验证是为了保证软件正确地实现了一些特定功能,即保证软件做了你所期望的事情,没有出现意外情况。

(2)确认是一系列的活动和过程,目的是想证实在一个给定的外部环境中软件的逻辑正确性。

5.2
测试过程

(1)单元测试

单元测试又称模块测试,以程序模块为单位,进行正确性检验的测试工作。

主要有蜂鸣器模块,DS18B20驱动模块,二极管控制模块,客户端显示界面,服务器显示界面。

(2)集成测试

集成测试,也叫组装测试或联合测试,对整个系统的稳定性和准确性进行测试。

5.3
测试结果

5.3.1 开发板温度显示测试结果

 

图5-1 开发板温度显示结果
 

 
 
 

5.3.2 开发板报警功能和打开LED灯

图5-2开发板报警功能和打开LED灯
 

 
 


图5-2开发板报警功能和打开LED灯
 

 
5.3.3关闭LED灯
 

 

 

 

 

 

 

 

 

 

 

5.3.4服务器报警

图5-4 服务器报警结果
 

 
 

6. 结论

物联网将是下一个推动世界高速发展的“重要生产力”!本系统基于物联网模型,使用嵌入式技术开发了具有远程信息处理能力的温度采集控制系统模型,基于此模型,可将温度采集点换成其他传感器,收集更多的信息,如湿度,光照等。其应用前景非常广泛。

在学习方面,通过本次毕业设计,我学习了UML统一建模语言,并使用RationalRose将其应用到系统模型图中。同时,我进一步学习了Makefile,将其应用于温度显示界面程序的编译。最后,我学习Protel99SE软件,并使用改软件画出了自己设计的电路的电路图。经过这次毕业设计,我加强了自身的学习能力和处理问题的能力。

在思想方面,我深刻的理解到做对于计算机程序的编写要非常细心,而且要具有良好的编程风格。遇到问题应该谦虚的向指导老师请教,对待事情应该认真,尽心的负责,不能半点马虎。

最后,经过几个月的开发和设计,从软件到硬件的设计,本系统已经圆满完成,实现了预定的功能。

参考文献:

[1] 曹海平.基于单片机和DS18B20的分布式多点温度检测系统的设计[J].自动化技术与应用,2008,27(11):23-25.

[2] 王帼媛. 单总线多点温度数据采集系统的设计和实现[J].航空精密制造技术,2011,47(2) :15-19.

[3] 张军.智能温度传感器DS18B20及其应.用[J].仪表技术,2010, (4):68-70.
[4]Jasmin Blanchette、Mark Summerfield. C++GUI Qt4编程[M]. 北京:电子工业出版社, 2008.

[5] 蕫小喜, 薛立勤. Linux 驱动开发研究[J]. Computer Knowledgeand Technology,2011,7(3):560-562.
[6] 方尔正,王 燕.无线传感器网络的温深测量系统设计[J].宁波职业技术学院学报, 2009,(2) :1-3.

[7]
徐宝文等.UML 与软件建模[M]. 北京:清华大学出版社,2006.

[8] 魏大慧.基于AT89S52单片机的数字温度控制系统软件设计[J].黑龙江科技信息,2010, (33):92-93.
[9] WRichard S. Advanced Programming in the Unix Environ2 ment [M] . 2nd ed. Beijing : Addison2Wesley ,2006.
[10] Linux22. 6. 19. 2 kernel [ EB/ OL ].http :/ / www. kernel.org.
[11] 王廷才.电子线路辅助设计Protel 99SE[M].北京:高等教育出版社,2004.

 

 
 
 

致 谢

感谢肇庆学院四年来对本人的辛苦培育,使我得以在大学这四年来学到很东西,感谢所有关心、支持、帮助过本人的良师益友。特别感谢计算机科学与软件学院为本人提供了良好的学习环境、感谢领导、老师们四年一直以来无微不至的关怀和指导,让本人在这四年中学到很多有用的知识,为将来的发展打下坚实的基础。在此,本人还要感谢在班里同学和朋友,感谢你们的帮助、鼓励与支持。

特别感谢本人的指导老师——毋茂盛教授。本论文是在毋茂盛教授的亲切关怀和悉心指导下完成的。从课题的选择到项目的最终完成,毋教授都始终给予本人细心的指导和不懈的支持。在此谨向毋老师致以诚挚谢意。

 

 

 

 

 

 

 

Temperature Acquisition System base on Internet
Lin Qiunan
Abstract: With the development of Internetand the techniques of embedded system, they are widely applied in greaterrange. This system is adopted 1-wire bus skill through DS18B20 temperaturetransducer to collect temperature, and sends temperature
information to aclient connector. The client connector, based on Linux Operating System and S3C2440 microprocessor, uses Qt data todevelop temperature interface which can display the temperature. Moreover, itwill deliver the temperature information to a server
by Transmission ControlProtocol. The sever puts Qt data to use to develop the patterning in order toshow the interface and temperature. Meanwhile, it controls the clientconnector. This system achieves Multipoint Temperature Acquisition System witha function
of Transmission Control Protocol. After testing, it has greaterstability and realizes a remote automatic control of client.

Keywords:Linux;1-wirebus;TCP protocol
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  嵌入式