基于 C++ 设计的在线温度计设计和制作
♻️ 资源大小2.49MB➡️资源下载https://download.csdn.net/download/s1t16/87450289在线温度计设计和制作摘 要本毕业设计主要设计自主研发的温度采集和温度数据的储存处理显示过程继而实现在线温度计系统。在线温度计主要主要包括温度采集单元、数据的储存处理和显示。在线温度的整体概述为数据采集部分使用 Client/Server 构架由温度采集单元采集数据经初步处理的数据上传到数据服务器数据服务器对数据进行储存。数据查询部分采用 Browser/Server 构架用户在页面上发送查询请求服务器在收到页面的查询请求后对数据库的数据进行查询、处理和显示。Clint 为 STM32F030使用 ARM Development Tools评估版进行设计和调试完成其主要功能是采集来自 DS18B20 的温度数据和实现与服务器的通信。Browser 为 JavaScripthtml其中 JavaScript 采用 HighchartsjQuery 框架实现数据的可视化显示。Server 使用 Ubuntu Server 14.04.1 LTS 使用语言:Python2.7 网站后台服务器框架:django1.8 数据库:mysql。各个系统间通信利用 wifi 网络的高带宽实现数据加密和双向鉴权保证通信链路上的可靠性。该系统实现了对数据的采集。与服务器之间数据的可靠通信实现数据在互联网上的显示、统计、储存等功能为数据分析者提供在线的实时、可靠、直观的温度数据方便其对大数据的分析利用。关键词温度采集STM32物联网数据传输数据的可视化ABSTRACT The graduation project is mainly designed to self-developed treatment temperature storage temperature data acquisition and display process,and then realize online thermometer system.Online thermometers includes temperature acquisition unit, storing data processing and display. Overview whole line temperature is: Data collection using the Client / Server architecture, the temperature acquisition unit collecting data, the data preliminary processing of data uploaded to the server, data server for data storage. Data query part of Browser / Server architecture, the user sends a query on the page, the server after receiving the query page of data in the database to query and process display. Clint is STM32F030,use ARM Development Tools (evaluation version) to design and debug complete,and its main function is to collect temperature data from the DS18B20, and communicate with the server. Browser is JavaScript html,which Highcharts jQuery JavaScript framework using time data visualization Server using Ubuntu Server 14.04.1 LTS Language: Python2.7 website backend server framework: django1.8 databases: mysql Communication between the various systems using a high-bandwidth wifi network for reliability data encryption and mutual authentication to ensure that the communication link. The system implements the data collection.Reliable communication between the server and data,data display,statistics,storage and other functions on the Internet,providing online,real-time visual and reliable temperature data to facilitate their use of big data analysis for the data analyst. Key wordstemperature acquisition; networking; data transmission; data visualization一、引言目前的温度采集基本以现场有线采集和工控系统内部处理使用为主成本高、部署难度大、可重用率低对现场实施人员要求高。温度采集融入工业大数据是现在发展的趋势。工业大数据是一个全新的概念从字面上理解工业大数据是指在工业领域信息化应用中所产生的大数据。随着信息化与工业化的深度融合信息技术渗透到了工业企业产业链的各个环节条形码、二维码、RFID、工业传感器、工业自动控制系统、工业物联网、ERP、CAD/CAM/CAE/CAI 等技术在工业企业中得到广泛应用尤其是互联网、移动互联网、物联网等新一代信息技术在工业领域的应用工业企业也进入了互联网工业的新的发展阶段工业企业所拥有的数据也日益丰富。工业企业中生产线处于高速运转由工业设备所产生、采集和处理的数据量远大于企业中计算机和人工产生的数据从数据类型看也多是非结构化数据生产线的高速运转则对数据的实时性要求也更高。因此工业大数据应用所面临的问题和挑战并不比互联网行业的大数据应用少某些情况下甚至更为复杂。工业大数据应用将带来工业企业创新和变革的新时代。通过互联网、移动物联网等带来的低成本感知、高速移动连接、分布式计算和高级分析信息技术和全球工业系统正在深入融合给全球工业带来深刻的变革创新企业的研发、生产、运营、营销和管理方式。这些创新不同行业的工业企业带来了更快的速度、更高的效率和更高的洞察力。工业大数据的典型应用包括产品创新、产品故障诊断与预测、工业生产线物联网分析、工业企业供应链优化和产品精准营销等诸多方面。本文将对工业大数据在温度数据采集的应用场景进行逐一梳理。二、概述2.1 在线温度计系统概述在线温度计系统的整体描述为将孤立的温度数据孤岛通过 wifi 组成一个统一的信息网络基于这个信息网络实现对温度大数据的利用该系统一般包括数据采集终端网络、数据处理平台、用户终端第三方平台等。如图 2-1 所示当传感器数据被采集到终端后终端主控芯片和数据处理平台的数据服务器建立无线链路可以按需求配置为将数据包实时主动推送或定时推送也可以根据服务器的请求被动的发送数据包数据服务器收到数据包后根据数据来源有序的存放在数据库中用户可以通过网页服务器提供的 Web 页面查看、管理和分析数据。也可以通过 API 接口直接和数据服务器交互得到分析后的数据。图 2-1 在线温度计系统原理图在线温度计有以下几个方面的发展趋势可以兼容的传感器信号越来越多应用的领域各种各样行业不同对数据的要求不同比如说大气数据采集就需要大规模大范围但其对温度数据的动态范围不高对温度数据的精度对数据的实时性要求相对不高。但若是用于锅炉内温度数据的采集则对温度的动态范围要求极大实时性要求也非常高。这两种情况下对温度传感器的选型必然是不同的作为数据平台不可能重复造轮子于是必然要求能兼容各种温度传感器的信号。从单一的数据向大数据发展。没有经过处理的数据永远仅仅是数据只有经过深加工也就是附加各种分析算法将数据可视化。大数据才有其真正的利用价值。2.2 本设计方案思路本设计以实现数据的良好检测、分析显示为主要目的以温度采集可靠数据通信Linux 数据服务器Web 服务器的搭建为主要设计内容。在传感器数据采集方面使用数字温度芯片在数据链路方面使用无线 wifi 连接在 WLAN 配置的易用性方面选用 TI 公司推出的 SmartConfig 配置方案使用手机 APP 将数据采集终端快速的并入数据网。在数据储存上使用 MySQL 关系数据库系统管理上使用 Django 的 ORM 对数据进行管理在数据可视化中选择 Highcharts 进行数据的可视化显示。2.3 研发方向和技术关键温度传感器的矫正方案(可用性通用性)通信系统的可靠性易用性数据的可靠存储对数据分析算法的友好性数据的可视化显示。2.4 主要技术指标温度范围 -55 至 125 摄氏度温度采集速率 10Hz通信延时 1s数据可视化形式 曲线显示三、总体设计数据采集部分使用 Client/Server 构架由温度采集单元采集数据经初步处理的数据上传到数据服务器数据服务器对数据进行储存。数据查询部分采用 Browser/Server 构架用户在页面上发送查询请求服务器在收到页面的查询请求后对数据库的数据进行查询和处理显示。Clint 为 STM32F030使用 ARM Development Tools评估版 进行设计和调试完成其主要功能是采集来自 DS18B20 的温度数据使用 ESP8266 实现与服务器的通信。Browser 为 JavaScripthtml其中 JavaScript 采用 HighchartsjQuery 框架时间数据的可视化显示。Server 使用 Ubuntu Server 14.04.1 LTS 使用语言:Python2.7 网站后台服务器框架:Django1.8 数据库:MYSQL。各个系统间通信利用 Wi-Fi 网络的高带宽实现数据加密和双向鉴权保证通信链路上的可靠性。四、温度采集终端4.1 硬件设计4.1.1 总体设计采用 STM32 的主控芯片加载 DS18B20 数字温度采集芯片作为温度采集通信使用 ESP8266 高性能 Wi-Fi 网络解决方案整体系统集成度高复杂度小故障率低性能稳定可靠。4.1.2 主控主控采用 STM32 单片机Stm32 单片机最高可工作到 72MHz系统主时钟采用无源晶振频率为 8MHz通过片内锁相环实现倍频配置芯片内部存储器可实现我们所需要的工作频率作为系统的工作时钟主控电路如图 4-1 所示。图 4-1 主控电路主时钟4.1.3 实时时钟RTC作为温度数据需要有一个和当前环境相关的一个主键那就是温度采集的时间STM32 单片机自带 RTC 时钟因此不需要外置的时钟芯片作为内置时钟减小了额外的硬件开销怎加了系统的可靠性(芯片级的相对 PCB 级的可靠性更高)。STM32 的实时时钟RTC是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器在相应软件配置下可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。RTC 模块和时钟配置系统(RCC_BDCR 寄存器)是在后备区域即在系统复位或从待机模式唤醒后 RTC 的设置和时间维持不变。但是在系统复位后会自动禁止访问后备寄存器和 RTC以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前先要取消对备份区域BKP的写保护。RTC 的简化框图如图 4-2 所示。图 4-2 RTC 框图RTC 由两个主要部分组成参见图 4-2第一部分(APB1 接口)用来和 APB1 总线相连。此单元还包含一组 16bit 寄存器可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总线时钟驱动用来与 APB1 总线连接。另一部分(RTC 核心)由一组可编程计数器组成分成两个主要模块。第一个模块是 RTC 的预分频模块它可编程产生 1 秒的 RTC 时间基准 TR_CLK。RTC 的预分频模块包含了一个 20 位的可编程分频器(RTC 预分频器)。如果在 RTC_CR 寄存器中设置了相应的允许位则在每个 TR_CLK 周期中 RTC 产生一个中断(秒中断)。第二个模块是一个 32 位的可编程计数器可被初始化为当前的系统时间一个 32 位的时钟计数器按秒钟计算可以记录 4294967296 秒约合 136 年左右在本应用中这已经是足够了的了。4.1.4 温度传感器DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线”接口的温度传感器。与传统的热敏电阻等测温元件相比它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器如图 4-3 所示。图 4-3 DS18B20 原理图一线总线结构具有简洁且经济的特点可使用户轻松地组建传感器网络[2]从而为测量系统的构建引入全新概念测量温度范围为-55~125℃精度为 ±05℃。现场温度直接以“一线总线”的数字方式传输大大提高了系统的抗干扰性。它能直接读出被测温度并且可根据实际要求通过简单的编程实现 9~l2 位的数字值读数方式。它工作在 3—5.5 V 的电压范围采用多种封装形式从而使系统设计灵活、方便设定分辨率及用户设定的报警温度存储在 EEPROM 中掉电后依然保存。4.1.5 无线联网模块ESP8266 是一个完整且自成体系的 Wi-Fi 网络解决方案能够通过外部应用处理器加载所有 Wi-Fi 网络功能。ESP8266 提供强大的片上处理和存储能力使其可通过 GPIO 口集成传感器及其他应用的特定设备实现了最低前期的开发和运行中最少地占用系统资源。ESP8266 高度片内集成包括天线开关 balun、电源管理转换器因此仅需极少的外部电路且包括前端模块在内的整个解决方案在设计时将所占 PCB 空间降到最低如图 4-4 所示。图 4-4 ESP8266 串口 Wi-Fi 模块 PCB 图装有 ESP8266 的系统表现出来的领先特征有节能 VoIP 在睡眠/唤醒模式之间的快速切换、配合低功率操作的自适应无线电偏置、前端信号的处理功能、故障排除和无线电系统共存特性为消除蜂窝、蓝牙、DDR、LVDS、LCD 干扰。4.2 软件设计4.2.1 总体设计和软件框架单片机上的软件采用三层构架如图 4-5 所示。图 4-5 软件构架图最底层为 CHIP 层这一层的直接操作寄存器配置芯片来直接和芯片及芯片内部外设打交道的芯片层主要包括 adc、bkp、can、cec、crc、dac、dbgmcu、dma、exti、flash、fsmc、gpio、i2c、iwdg、pwr、rcc、rtc、sdio、spi、tim、usart、wwdg 等。这一层最基本的 API 由 STMicroelectronics 公司的 STM32F10x_StdPeriph_Driver 软件包提供为了方便使用和提高效率在兼容 STM32F10x_StdPeriph_Driver 的基础上使用 STM32FGLIB 对其优化使其对上层表现为效率更高移植更方便更便于理解主要使用的方式为使用汇编或寄存器配置提高效率外设配置文件化来达到目的。第二层为 HAL_Driver 层包含所有硬件外设驱动这一层依赖于 CHIP 层如果这一层的驱动完全依赖于 STM32FGLIB可以具有更高的移植性当改变底层芯片时代码不需要任何改变当外设接口改变比如使用不同的 IO 口不同的串口或者是当 SPI 硬件接口不够用必须使用软件模拟 SPI 时可以做到不更改代码仅仅需要修改配置文件就可以兼容最新硬件的目的。这一层对上提供外设硬件 API在本设计中 DS18B20 为温度传感器则需要在 HAL_Driver 中增加 DS18B20 这一配置并实现两个通用 APIVoid DS18B20_Init(void); Float DS18B20_GetTemp(void);最上层为应用逻辑层实现应用的逻辑调用在这一层的逻辑实现是基于调用器的考虑到 MCU 上资源的紧缺没有使用完整的操作系统完整的操作系统任务调度是需要复杂的现场保护恢复等实现带来运行效率的下降和资源消耗因此在本设计中参考协程的思想实现任务的简单调度。/***SYS***/ # include sys.h # include sys_os.h # include minos_delay.h # include stm32_config.h int main(void) { SYS_INIT(); /***总循环***/ while (1) { RunTaskA(task_rtc 1);//实时时钟RTC RunTaskA(TaskSensor 2);//传感器数据采集 RunTaskA(TaskSmartConfig 3);//SmartConfig RunTaskA(TaskCache 4);//数据缓存 RunTaskA(TaskDataEx 5);//数据通信 } }4.2.2 数据采集DS18B20 的其内部结构如图 4-6 所示图 4-6 DS18B20 内部结构图DS18B20 的地址序列码就是出厂前被被光刻在 ROM 上的 64bit 序列号每颗 DS18B20 的 64bit 序列号均不相同。64bit 地址序列码的排列是前 8 bit 是产品家族码接着 48bit 是 DS18B20 的序列号最后 8bit 是前面 56bit 的循环冗余校验码(CRCX8X5 X4 1)。DS18B20 的地址序列码的作用是使每一颗 DS18B20 的通信地址都各不相同这样就可实现在一根总线上挂接多个 DS18B20。所有的单总线器件要求采用严格的信号时序以保证数据的完整性。DS18B20 共有 6 种信号类型复位脉冲、应答脉冲、写 0、写 1、读 0 和读 1[5]。所有这些信号除了应答脉冲以外都由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前。这几个信号的时序分别为复位脉冲和应答脉冲:单总线上的所有通信都是以初始化序列开始。主机输出低电平保持低电平时间至少 480us以产生复位脉冲。接着主机释放总线4.7K 的上拉电阻将单总线拉高延时 1560 us并进入接收模式(Rx)。接着 DS18B20 拉低总线 60~240 us以产生低电平应答脉冲若为低电平再延时 480 us。写时序:写时序包括写 0 时序和写 1 时序。所有写时序至少需要 60us且在 2 次独立的写时序之间至少需要 1us 的恢复时间两种写时序均起始于主机拉低总线。写 1 时序主机输出低电平延时 2us然后释放总线延时 60us。写 0 时序主机输出低电平延时 60us然后释放总线延时 2us。读时序:单总线器件仅在主机发出读时序时才向主机传输数据所以在主机发出读数据命令后须马上产生读时序以便从机能够传输数据[3]所有读时序至少需要 60us且在 2 次独立的读时序之间至少需要 1us 的恢复时间。每个读时序都由主机发起至少拉低总线 1us。主机在读时序期间必须释放总线并且在时序起始后的 15us 之内采样总线状态[4]。典型的读时序过程为主机输出低电平延时 2us然后主机转入输入模式延时 12us然后读取单总线当前的电平然后延时 50us。在了解了单总线时序之后我们来看看 DS18B20 的典型温度读取过程DS18B20 的典型温度读取过程为复位发 SKIP ROM 命令0XCC发开始转换命令0X44延时复位发送 SKIP ROM 命令0XCC发读存储器命令0XBE连续读出两个字节数据(即温度)结束。4.2.3 数据通信在线温度计设计和制作中数据通信是最重要的一环数据通信的可靠与否决定了整套系统的可靠性数据通信要求满足轻量和可靠。底层协议使用 TCP 协议因此简化了在通信可靠性上的设计且不需要考虑数据的拼接等情况因此设计协议如表 4-1 所示。表 4-1 通信协议表帧头数据长度数据5A1 个字节不定长这是外层协议用于对 tcp 数据分包服务器接收到 tcp 数据后根据帧头对之后的数据进行分包取出其中的数据如表 4-2 所示。表 4-2 数据解析表MAC传感器类型数据4 个字节2 个字节不定长单片机的流程为逆流程。每一片单片机拥有自己唯一的出厂 ID 这个 ID 全球唯一不可更改因此可以最为传感器数据采集终端的身份 ID这个身份 ID 为数据包的第一部分为了兼容不同的传感器信号以便服务器做出正确的处理增加以为传感器类型字段根据不同的传感器类型来对数据进行打包。表 4-3 为不同传感器类型对应数据打包/解析方式。表 4-3 传感器类型解析表传感器类型(2 个字节)时间戳温度(x10)00014 个字节2 个字节为了防止数据在传输时被篡改数据采用端到端的加密方式。端到端加密允许数据在从源点到终点的传输过程中始终以密文形式存在[12]。采用端到端加密又称脱线加密或包加密消息在被传输时到达终点之前不进行解密因为消息在整个传输过程中均受到保护所以即使有节点被损坏也不会使消息泄露。端到端加密系统的价格便宜些并且与和相比更可靠更容易设计、实现和维护。端到端加密还避免了其它加密系统所固有的同步问题因为每个包均是独立被加密的所以一个报文包所发生的传输错误不会影响后续的报文包。此外从用户对安全需求的直觉上讲端到端加密更自然些。单个用户可能会选用这种加密方法以便不影响网络上的其他用户此方法只需要源和目的是保密的即可。通过这种方式服务器可以确保所有数据都是来自传感器数据采集终端而不是被伪造的终端也能确保只有己方服务器才能收到数据不会被第三方所窃取。4.2.4 可靠性设计在线温度计有可能会出现这么一种情况那就是网络崩溃无论是运营商网络崩溃还是传感器数据采集终端连接的路由器崩溃又或者是服务所在网络崩溃甚至是服务器重启维护等导致的网络链路断开都会导致本应该被存到数据库中的数据却没有存进去也就是说这一段数据丢失了。为了防止网络不可靠导致的数据丢失情况本设计采用了一项可靠性设计来解决这一问题那就是本地数据二级缓存一级缓存可以在网络临时堵塞时对数据进行缓存但是当网络不是临时性的也就是说缓存数据超过一级缓存能缓存的极限后二级缓存便会启动二级缓存其本质上是一个对 flash 进行自编程的服务二级缓存将达到缓存极限的一级缓存(一般为 K 级别)整块写入 flash数据在 flash 中也数据块的形式存在整个缓存空间一般在 M 级别可以做到对数据的长时间缓存。但由于一级缓存以流的形式缓存数据而二级缓存以数据块的形式缓存因此一级缓存在二级缓存服务启动后必须做乒乓交换。在第一个缓冲周期将输入的数据流缓存到“数据缓冲模块 1”在第 2 个缓冲周期通过“输入数据选择单元”的切换将输入的数据流缓存到“数据缓冲模块 2”同时将“数据缓冲模块 1”缓存的第 1 个周期数据通过“输出数据选择单元”的选择送到 “数据流运算处理模块”进行运算处理在第 3 个缓冲周期通过“输入数据选择单元”的再次切换将输入的数据流缓存到“数据缓冲模块 1”同时将“数据缓冲模块 2”缓存的第 2 个周期的数据通过“输出数据选择单元”切换送到“数据流运算处理模块”进行运算处理。如此循环。4.2.5 易用性设计 SmartConfigSmartConfig 的原理为首先使用设备在当前路由下以 255.255.255.255 为目的 IP 广播包含配置信息的 UDP 包。ESP8266 端首先会先扫描空间中的 AP 信号扫描得到 AP 的相关信息如 AP 工作在哪个通道等信息然后配置 ESP8266 芯片工作在刚才扫描得到的通道上去接收 UDP 广播包(广播 IP 为 255。255。255。255)如果没有接收到特定的配置信息继续配置 ESP8266 工作在另外的通道上如此循环直到收到特定的包含配置信息的 UDP 包为止。ESP8266 从 UDP 包中解压得到要配置的 AP 的 SSID加密方式密码等信息。ESP8266 主动连接上 APSmartConfig 整个过程结束。最后使用 SmartConfig 的步骤如下:启动 ESP8266 的电源手机连接目标网络启动 SmartConfig等待 ESP8266 连接成功。五、数据处理平台5.1 总体方案该系统的数据处理平台由于并不涉及任何底层代码主要为网络和数据应用并需要适应各种算法因此选用 Python2.7 作为开发语言。Python 就为我们提供了非常完善的基础代码库覆盖了网络、文件、GUI、数据库、文本等大量内容被形象地称作“内置电池batteries included”。用 Python 开发许多功能不必从零编写直接使用现成的即可。除了内置的库外Python 还有大量的第三方库也就是别人开发的供你直接使用的东西。当然如果你开发的代码通过很好的封装也可以作为第三方库给别人使用。Python 又被称为胶水语言可以很方便的和其他语言对接也就是说需要调用次平台中的数据时并不指定任何一种语言可以选择最适合自己的一种语言当然也可以使用 Python毕竟 Python 内置了大量的基础算法等可以快速开发并且在效率上来说调用内置库的效率并不低应为 Python 大量的内置库都是使用 Python 开发的。对于服务器框架则选择 Django 1.8.2此系统起本质上已有数据驱动的而 Django 最让人满意的就是其 ORM 框架我们可以通过这个 ORM 框架搭建我们的数据库系统而不必关心其具体细节加快开发速度节约其后期的维护成本毕竟大部分软件其后期维护成本往往非常高昂。数据库软件的选择为关系型数据库 MySQL。由于该系统使用了 ORM 框架其底层的数据系统和上层无关且鉴于前期数据量并不大可以使用任一数据库系统。为了让数据能可视化显示同时减轻服务器负担将计算量前段化选用基于 jQuery 的 Highcharts 库。至于服务器系统和部署服务器选用 Ubuntu Server 14.04.1 LTS部署在阿里云青岛服务节点表 5-1 为服务器硬件配置该配置满足在调试阶段的最低配置要求。表 5-1 服务器硬件配置表CPU1 核内存1024 MB带宽1Mbps峰值公网 IP115.28.32.***5.2 程序流图5.2.1 应用层流图应用层基于框架层之上只处理应用逻辑如图 5-1 所示主要分为两块一块为数据的接收储存另一块为数据的处理查询。图 5-1 系统流程图5.2.2 框架层流图框架层所有的请求、返回都由中间件来完成。中间件就是处理 HTTP 的 request 和 response 的类似插件比如有 Request 中间件、view 中间件、response 中间件、exception 中间件等Middleware 都需要在 “project/settings。py” 中 MIDDLEWARE_CLASSES 的定义。大致的程序流程如图 5-2 所示。图 5-2 Middleware 处理流程图首先必须在“project/settings.py”中 MIDDLEWARE_CLASSES 处定义一个 HTTP 请求将被这里指定的中间件从头到尾处理一遍暂且称这些需要挨个处理的中间件为处理链如果链中某个处理器处理后没有返回 response就把请求传递给下一个处理器如果链中某个处理器返回了 response直接跳出处理链由 response 中间件处理后返回给客户端可以称之为短路处理。所以在 view 层函数的时候都必须以 return response 或者 return HttpResponse(x) 结尾。5.3 数据库设计数据库在 Django 框架下遵循 ORM 设计编码如下# coding:utf-8 from django.db import models # Create your models here. class Temp(models.Model):#温度 m_time models.DateTimeField(blankFalseauto_now_addFalse)#时间 m_value models.FloatField(default0.0)#温度值 def __unicode__(self): return unicode(self.m_time)数据库表设计如表 5-2 所示。表 5-2 原始温度数据表字段名数据类型长度说明描述IdLong4非空主键序号m_timeDateTimeField4非空采集时间m_valueFloatField4非空温度数据5.4 界面设计# coding:utf-8 from django.shortcuts import render # Create your views here. from django.http import HttpResponse from BiYeSheJi.models import Temp from datetime import * import time def curve(request): TempDefaultValue23.0 DateDefaultValue2015-11-11 TimeDefaultValue11:11 if request.method POST: # 当提交表单时 TempDefaultValuerequest.POST[CurveDataTMax0] DateDefaultValuerequest.POST[CurveDataTMax1] TimeDefaultValuerequest.POST[CurveDataTMax2] Temp.objects.create(m_timedatetime.strptime(request.POST[CurveDataTMax1]request.POST[CurveDataTMax2] %Y-%m-%d%H:%M)m_valuerequest.POST[CurveDataTMax0]) CurveDataTMax[] CurveDataTMin[] CurveDataTime[] for tmp in t: CurveDataTMax.append(tmp[m_valueMax]) CurveDataTMin.append(tmp[m_valueMin]) CurveDataTime.append(tmp[m_time].strftime(%Y-%m-%d %H:%M:%S)) return render(request曲线.htm { CurveDataTMin: CurveDataTMin CurveDataTime: CurveDataTime CurveDataTMax: CurveDataTMax TimeDefaultValue: TimeDefaultValue TempDefaultValue: TempDefaultValue DateDefaultValue: DateDefaultValue })六、制作与调试6.1 硬件电路的布线与焊接6.1.1 总体特点该系统所涉及的各部分硬件电路总体的特点是电路原理简单所用的器件均为常用器件传感器也为常用数字是传感器。需要用到 Linux 服务器为了方便维护将服务器托管在阿里公司的云上。由于存在两个终端在双方之间的通信协调是最容易出问题的地方需要特别注意。6.1.2 焊接焊接原则和注意事项:主控芯片使用了 QFP64 封装引脚多间距小芯片脆弱焊接时需要特别小心在核对引脚顺序的同时防止出现虚焊等现象在焊接完成后使用万用表的通断测试功能检查焊接质量。先焊接主控芯片再焊接贴片电容电阻等小器件最后焊接连接件等大体积器件以降低难度节约时间和降低出错率。6.2 调试6.2.1 联调测试依次对 CheckList 项进行测试检查检查项和结果如表 6-1 所示。表 6-1 联调 CheckList 表单检查项结果1.系统供电是否正常OK2.传感器供电是否正常OK3.是否收到传感器数据OK4.传感器数据是否正常OK5.WireShark 抓包测试终端数据发送是否正常OK6.使用 Database Browser 查看数据库数据是否异常OK7.使用 Chrome 登录 Web 页面测试 Web 服务器提供是否正常OK6.2.2 实物论述图 6-1 温度采集终端图 6-2 SmartConfig 手机客户端图 6-3 数据处理平台 Web 主页图 6-4 每个时刻最大最小温度曲线图 6-5 页面编程调制过程图6.2.3 问题解决在将温度采集终端连上无线路由器时使用的配置方法为 SmartConfig 由于此协议需要硬件和硬件内部固件版本的支持在开始使用时由于固件版本过低使用了 0.8 版本导致无法使用此功能将 ESP8266 的固件将更改为 V0.9.2.2 版本后问题顺利解决。服务器和设备使用 HTTP 协议通信在 PC 机上使用软件模拟温度采集终端向服务器发送或索取数据测试通过但使用单片机进行通信时发现数据校验无法通过使用 wire-shark 抓包对比模拟器和实际终端在网络链路上的数据发现数据一致性为 100%于是将问题定位在单片机数据的接受端通过 ARM Development Tools 中的在线 debug 工具对其进行在线调试发现数据接收时的逻辑存在错误导致丢失最开始的一个数据包导致校验通不过修改此部分代码后问题不再复现。七、结论本设计方案达到了任务书的要求实现了熟读数据采集、传输\储存\处理和显示实现了一个较为完整的在线温度计前端温度传感器能采集到正确的温度在经过和矫正温度计的实验对比后发现实测温度和实际温度的偏差在 -1 摄氏度以内满足设计要求使用 wire-shark 抓包显示数据通信正常使用 Database Browser 检查数据库发现数据没有存在丢失现象在线情况下使用 Google Chrome 登录服务器网站能正常查询显示温度数据且温度数据和温度采集终端上传数据一致温度数据以曲线显示满足数据可视化的要求由于时间、水平和经验有限在电路的设计选型制作温度的测量精度温度采集终端的接入以及数据显示等方面有改进的余地比如传感器和电路板可以集成温度可以增加线性矫正数据显示可做更多处理页面也可以重新设计是用户体验更好。另外在系统的调试方面由于时间和设备的原因只进行了短时间小规模的调试关于设备的稳定性带载量等有待进一步的调试。这次毕业设计对于我来说既是一次机遇又是一次挑战。通过这次的毕业设计我学到了很多东西通过自己的实践增强了动手能力。通过实际工程的设计也使我了解到书本知识和实际应用的差别。在实际应用中遇到很多的问题这都需要我对问题进行具体的分析并一步一步地去解决它。八、致 谢这几个月的时间里从对课题的理解方案的设计到电路的制作再到论文的写作中间有着自己的努力更有着老师和同学的关心和巨大的帮助。首先我要感谢的是我的指导老师刘建岚老师在几个月中耐心的为我解答各种问题在我的设计遇到困难时给予我无私的帮助在最后的论文写作过程中给予我指导避免了许多错误的发生。还要感谢我的同学们在我不懂的时候可以向我耐心的解答并且帮我纠正设计中的一些错误在我材料损坏时帮我维修特别感谢程鹏飞同学在论文格式上给予纠正。最后我要感谢学校给我这样一个毕业设计的机会让我增加了动手能力拓展了知识面了解到了以前我许多不知道的知识。九、参考文献Premini. F, Narayanan H T S. Seamless Decoding Of Normal And OID Compressed SNMP PDUs - An Enhancement To Wire shark[J]. Procedia Engineering, 2012, 38:1479–1486.Elahi A, Arjeski T. ARM Assembly language programming Using Keil Development Tools Introduction[M]. Springer International Publishing, 2015.李春杰, 李旭春. FPGA 设计的思想与方法[J]. 电测与仪表, 2005, 42(2):50-52.吴亮. DS18B20 型数字温度传感器在烟叶烤房监测仪中的应用[J]. 电子设计工程, 2005(10):19-21.伍家满, 虞礼贞, 刘小燕,等. 基于 1-Wire 接口的总线技术及其应用[J]. 南昌大学学报工科版, 2005, 27(01):89-93.陈志英, 李光辉. 单总线技术及其应用[J]. 电气时代, 2003(07):74-75.魏雅. 基于 AT89S52 单片机红外遥控温度控制系统设计[J]. 陕西理工学院学报自然科学版, 2012, 28(3):32-36.李钢, 赵彦峰. 1-Wire 总线数字温度传感器 DS18B20 原理及应用[J]. 现代电子技术, 2005, 28(21):77-79.徐文进, 张阿卜. 智能温度传感器 Ds18b20 在多路测温中的应用[J]. 现代电子技术, 2004, 27(22):3-4.李建明, 谈顺涛, 张颖,等. 提高远程抄表系统数据安全性研究[J]. 长沙电力学院学报自然科学版, 2004(1):26-28.季国林. 基于 STM32 的矿用电子皮带秤仪表的设计[D]. 太原理工大学, 2010.彭雷. 人体运动加速度信息无线获取系统的设计与应用研究[D]. 中国科学技术大学, 2009.任中涛. 智能家居家电控制系统的研究与应用[D]. 浙江理工大学, 2014.巫喜红. 知己知彼,百战不殆--网络监听和防范技术的研究[J]. 五邑大学学报自然科学版, 2004, 18(1):67-70.汪祥莉. 数据加密与一种混合数据加密算法 TEAR 的探讨[D]. 湖北大学, 2003.陈宏. 基于工业以太网的控制数据加密研究[D]. 浙江大学, 2005.十、附 录10.1 程序int TaskUsrtWifi(void) { _SS WaitX(1000); breakENTMFlag 0; while (1) { WaitX(200); //配置 在用手机配置完后 通过AT指令做检查和完成后续配置 if (1 breakENTMFlag || WifiConfigFlag || WifiRESTFlag )//加入AT模式 { static int breakflag; breakflag 0; UsrtWifiENTMFlag 1; for (static int i1 0; i1 10; i1)//退出透明传输模式 { static int i; 0; WaitX(1000); for (int i 0; i 50; i) { UsrtWifiAtRxBuffer[i] 0; } Sys_Printf(UARTWIFIUARTNUM, (char *)AT\r); //空指令 Sys_Printf(DEBUG_UARTNUM, (char *)AT\r\n); //空指令 for (; i 5; i) { WaitX(1000); if (0x00 ! UsrtWifiAtRxBuffer[0]) { UsrtWifiAtRxBuffer[0] 0; Sys_Printf(DEBUG_UARTNUM, (char *)%s, (UsrtWifiAtRxBuffer 1)); if ((0 strncmp((char*)OK, (char*)(UsrtWifiAtRxBuffer 1), 2)) || strncmp((char*)ERR-1, (char*)(UsrtWifiAtRxBuffer 1), 6)) ) { breakflag 1; breakENTMFlag 2; if (1 WifiConfigFlag) { breakENTMFlag 3; WifiConfigFlag 2; } if (1 WifiRESTFlag) { breakENTMFlag 2; } } break; } if (4 i) { for (int i 0; i 50; i) { UsrtWifiAtRxBuffer[i] 0; } Sys_Printf(UARTWIFIUARTNUM, (char *)); Sys_Printf(DEBUG_UARTNUM, (char *)\r\n); } } if (1 breakflag) { break; } } UsrtWifiENTMFlag 0; } if (1 WifiRESTFlag 2 breakENTMFlag)//复位 { WifiRESTFlag 2; WaitX(1000); Sys_Printf(UARTWIFIUARTNUM, (char *)ATRSTF\r); //恢复出厂设置 Sys_Printf(DEBUG_UARTNUM, (char *)ATRSTF\r); //恢复出厂设置 WaitX(1000); Sys_Printf(UARTWIFIUARTNUM, (char *)ATZ\r); //复位 Sys_Printf(DEBUG_UARTNUM, (char *)ATZ\r); //复位 } if (2 WifiConfigFlag 2 WifiRESTFlag 3 breakENTMFlag)//保存参数 { WifiConfigFlag 3; UsrtWifiENTMFlag 1; for (static int i2 0; i2 CONFIGSUMNUM; i2) { WaitX(1000); { static int breakflag; breakflag 0; for (static int i1 0; i1 10; i1) { static int i; 0; WaitX(1000); UsrtWifiAtRxBuffer[0] 0; for (int i 0; i 50; i) { UsrtWifiAtRxBuffer[i] 0; } Sys_Printf(UARTWIFIUARTNUM, (char *)%s\r, ATCommandList[i2][0]); Sys_Printf(DEBUG_UARTNUM, (char *)%s\r\n, ATCommandList[i2][0]); for (; i 5; i) { WaitX(1000); if (0x00 ! UsrtWifiAtRxBuffer[0]) { UsrtWifiAtRxBuffer[0] 0; Sys_Printf(DEBUG_UARTNUM, (char *)%s, (UsrtWifiAtRxBuffer 1)); if (0 strncmp(ATCommandList[i2][1], (char*)(UsrtWifiAtRxBuffer 1), strlen(ATCommandList[i2][1]))) { breakflag 1; } else { for (int i 0; i 50; i) { UsrtWifiAtRxBuffer[i] 0; } Sys_Printf(UARTWIFIUARTNUM, (char *)%s\r, ATCommandList[i2][2]); } break; } } if (1 breakflag) { break; } } } } WaitX(1000); Sys_Printf(UARTWIFIUARTNUM, (char *)ATPMTF\r); //存到FLASH WaitX(1000); Sys_Printf(UARTWIFIUARTNUM, (char *)ATZ\r); //复位 breakENTMFlag 0; UsrtWifiENTMFlag 0; } } _EE }