《根据树莓派的温度采集存储显示系统.pdf》由会员分享,可在线阅读,更多相关《根据树莓派的温度采集存储显示系统.pdf(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 嵌入式综合实践嵌入式综合实践 设计报告设计报告 设计题目:设计题目: 基于基于 RaspberryRaspberry PiPi B+B+的温度采集、存储、显示系统的温度采集、存储、显示系统 班 级: 信息工程 2012-04 班 姓 名: 陈 岩 学 号: 04121471 姓 名: 陈灿坚 学 号: 04121470 姓 名: 郭镭斌 学 号: 04121474 姓 名: 刘 杨 学 号: 04121494 指导教师: 李 健 时 间: 2015 年 6 月 目录 一、 设计任务 . 3 二、 设计方案 . 3 三、设计原理及内容 . 5 (一)树莓派初始配置 . 5 (二)数据的采集 .
2、 13 (三)数据的存储 . 15 (五)数据的显示 . 20 (六)数据的修改 . 26 (七)新浪云端应用申请创建 . 27 (八)数据上传与云端接收 . 30 (九)本地和云端数据库实现同步删除与修改 . 33 (十)互联网显示数据折线图 . 34 (十一)Android 客户端 . 38 四、 设计成果 . 40 五、 设计总结 . 41 六、 参考文献 . 43 附录 1:实践日志: . 44 附录 2:源程序,见文件夹 . 51 一、一、 设计任务设计任务 开发一套基于树莓派 2、及 DS18B20 温度传感器的信息采集存储显示系统, 相关参数要求如下: 1.在 Linux 下每隔
3、 30 秒自动采集一次温湿度信号; 2.使用数据库 MySQL 在本地存储 8 个小时的温度信号; 3.使用新浪云的 MySQL 数据库存储温湿度信号; 4.编写客户端(PC 或 Android 与网页形式)访问数据库实现读取数据、删 除数据等操作,并以曲线表方式显示。 二、二、 设计方案设计方案 系统整体框图如图 2-1 所示 图 2-1 系统硬件框图 为实现项目设计要求,本次设计采用 Python、PHP、MySQL、Apache2、HTML 等相关软件及编程语言进行开发。 开发硬件要求: 树莓派 B+板一块、DS18B20 温度传感器及驱动板一块、网线一根、路由器一 个、电源设备。 软件
4、及编程要求: Python 语言、PHP 编程语言、Apache2、MySQL 语言、MySQL 数据库、新浪云 SAE 环境,HTML。 本系统采用主要采用 Python 语言编写,对 DS18B20 温度传感器进行读取并 路由器 PC 用户 Android终端 树莓派 DS18B20 网线 互联网 写入本地 MySQL 数据库和新浪云数据库。另外在本地利用 Python 语言编写客户 端对本地数据库进行读取并以折线图形式绘制出温度记录变化趋势图。利用 PHP 语言结合 LAMP(Linux+Apache+MySQL+PHP/Python)环境实现对本地数据库内的 记录进行显示数值显示与修改
5、删除等操作。另外, 在新浪云端利用 PHP 语言编写 程序对本地上传数据进行存储,并结合 HTML 技术实现数据的显示操作,在最终 为方便远程显示,结合 Android 客户端,实现对新浪云应用网页的固定显示,达 到观察温度数据变化的目的。 软件实现框图如图 2-2 所示。 图 2-2 软件实现框图 数 据 新浪云 PHP 接收指令 指令 Python 语言 读取温度数据 本地MySQL数据库 新浪云 MySQL 数据库 新浪云 PHP 语言 接收温度数据 Python 客户端 折线显示 PHP 网页数值显 示、修改、删除 PHP 网页折线图 显示 HTML+Javascript Androi
6、d WebView 控件 三、三、设计原理及内容设计原理及内容 (一)(一)树莓派树莓派初始初始配置配置 1. 系统下载 登陆https:/www.raspberrypi.org/downloads/,点击 DOWNLOADS, 下载树莓派的系统。 2. 解压 系统下载完成后,将得到的压缩文件进行解压,得到名为“win32diskimager (镜像写 U 盘工具) ”的文件夹。 3. 烧写系统 打 开 “ win32diskmigager ( 镜 像 写 U 盘 工 具 ) ” 文 件 夹 , 找 到 Win32DiskImager.exe 可执行文件,双击运行。 说明: 此处最好采用完全版
7、,网上有部分仅有.exe 文件,无法使用。 选择刚下载的镜像文件,病选择目标内存卡,点击“写”按钮,等待烧写完 成。 4. 硬件搭建 将 SD 卡插入树莓派卡槽,连接网线至路由器接口,并给电源供电。 5. 查看树莓派 IP 地址: 通过路由管理器查看名为 raspberry 的 IP 地址。 绑定树莓派的 MAC 地址和 IP。 6. Putty 配置 首次登陆需要用 SSH,双击“putty.exe”文件,在弹出的对话框中输入主机 IP 地址:192.168.1.110。 7. 安装远程桌面 在命令窗口中 login as:后输入 pi,输入密码:raspberry。 输入 sudo apt
8、-get install xrdp,安装远程桌面。 8. 设置 root 用户及密码 sudo passwd 9. 远程登陆 1)利用 Windows 搜索运行 “远程桌面” 。 2) 在弹出的对话框中输入计算机 IP 地址, 即树莓派 IP 地址: 192.168.1.110, 点击“连接” 。 3)输入 username:root,password:*,点击“OK”按钮,出现如 下图所示的界面,随后进入到树莓派的远程桌面。 10. 使用 SD 卡剩余空间 方法一: 8GB microSD 在 Windows 下使用 Win32 Disk Imager 下载映像后,在 RPi 中只 能识别出
9、 2.9GB,如下图所示。 通过下面 11 条命令剩余的空间还原出来: 命令解释: 查看当前磁盘大小,总大小只有 2.9GB 查看第二分区的起始地址,后面会用到 使用 fdisk 操作磁盘 d,删除分区 2,删除第二分区 创建一个新分区 创建主分区 分区 2 输入第一次得到的第二分区起始扇区 最后一个 sector,默认即可 将上面的操作写入分区表 设置完成需要重启,sudo reboot。 重启完成,使用 df -h 查看发现空间并没有增大,还需要输入 resize2fs /dev/mmcblk0p2。等待一会儿操作完成,再次使用 df -h 查看发现空间已变大成 7.2GB。 方法二: 输
10、入命令 raspi-config,选择第一项,回车确认。 11. 配置服务器环境 (1)安装 Apache Apache 可以用下面的命令来安装: sudo apt-get install apache2 Apache 默认路径是/var/www/,其配置文件路径为: /etc/apache2/。重启服 务生效:sudo service apache2 restart。 (2)安装 mysql sudo apt-get install mysql-server 安装过程中,会出现一个提示符让你输入一个密码,这个密码是 mysql root 用户的密码。 (3)安装 PHP 输入下面的命令,就可
11、以安装 PHP 5,以及 PHP 访问 mysql 数据库所需要的 库。 sudo apt-get install php5 sudo apt-get install php5-mysql (4)测试 装完成后, 可以在连接到树莓派所在局域网的其他电脑或手机的浏览器中输 入树莓派的 IP 地址,就可以访问网站了。此时能看到一个页面显示“It works”, 但是没有其它内容。 创建一个/var/www/index.php。 (二)数据的采集(二)数据的采集 由于树莓派操作系统 Dccidentalis 和 2012 年 12 月以后 Raspbian 系统已经能 够支持 DS18B20 单总线
12、(1-wire)温度传感器。DS18B20 温度传感器是由半导体 包装的头和三个引脚组成的一种精确的数字设备。 1. 硬件部分硬件部分 温湿度传感器的硬件部分包括:树莓派开发板,DS18B20 传感器,杜邦线 3 根。 接线: VCC 接 5V 的 GPIO 接口 GND 接 GND 的 GPIO 接口 DQ 接 GPIO18 的 GPIO 接口 2. 软件部分:软件部分: 本次项目设计选用 Python 语言操作 GPIO 口,可简化程序结构,方便后面的 数据存储显示以及程数据的上传功能的实 (1)修改 Config.txt 配置文件: 由于升级后的内核, 为防止 GPIO 冲突, 使用了新
13、的 dt 策略, 可能找不到 28- *文件夹,所以通过修改 Config.txt 配置文件解决这个问题,修改如下: boot/config.txt 配置文件的最后添加:dtoverlay=w1-gpio-pullup,gpiopin=18(根据 自己实际接的管脚而定) 。 (2)安装单总线驱动: 在 网站下载单总线设备驱动压 缩包并解压(在 Linux 下可用 unzip 命令解压 zip 压缩包)安装。 (3)升级内核(如果已经升级过可直接逃过此步) : apt-get updata apt-get upgrade (4)确认设备生效:生效后可找到 28-*的文件夹 sudomodprob
14、e w1-gpio sudomodprobe w1-therm cd /sys/bus/w1/devices/ ls (5)查看当前温度: cd 28-*(此为 ls 查看的文件夹,各个 DS18B20 设备有自己的设备号) cat w1_slave(t/1000 即为当前温度值) (6)测试成功后,编写连续监测程序,采用 Python 语言操作 GPIO: import glob import time device_folder = glob.glob(/sys/bus/w1/devices/+ 28*)0 device_file = device_folder + /w1_slave d
15、ef read_temp(): f = open(device_file, r) lines = f.readlines() f.close() equals = lines1.find(t=) temp_string = lines1equals+2: temperature = float(temp_string) / 1000.0 return temperature while True: print(Current temperature: %.2f %read_temp() time.sleep(1) (三)(三)数据的存储数据的存储 1. MySQL 简介简介 (1) 数据在数据
16、库中的存储方式: 表中的一行称之为一条记录,表中的一条记录对应一个对象的数据。 (2) 常用操作的实现 1)数据库操作 创建数据库: create database if not exeits db_name 查看、删除数据库: 显示数据库语句:show databases 显示数据库创建语句:show create databases db_name 数据库删除语句:drop datebaseif exeits db_name 修改、备份、回复数据库:alter database if not exeits db_name 2)表操作 创建表:creat table table_name (
17、field1 datatype, field2 datatype, field3 datatype), 其中,field 指定列名,datatype 指定列类型。 修改表:使用 alter table 语句追加、修改或删除列。 3)数据库 CRUD 语句 Insert 语句(增加数据) :使用 insert 语句向表中插入数据。 insert into table(column ,column) values(value ,value) Update 语句(更新数据) :使用 update 语句修改表中数据。 UPDATE tb1_name SET col_name1=expr1 , col_
18、name2=expr2 . WHERE where_definition UPDATE 语法可以用新值更新原有表行中的各列。 SET 子句指示要修改哪些列和要给予哪些值。WHERE 子句指定应更新哪些 行。 如果没有 WHERE 子句,则更新所有的行。 Delete 语句(删除数据) :使用 delete 语句删除表中数据。 delete from tb1_name WHERE where_definition Select 语句(查找数据) :select distinct * |column1,column2,column3 from table 2. 具体实现具体实现 总体方案: 在数据
19、存储方面,为了保持数据的连续更新,且选定存储 8 个小时的温度数 据内容,并方便后面显示绘图与数据的修改功能,将数据表创建为以下格式:分 三列 id、time、temp。分别存放序号、时间和温度,其中序号由自己指定,本项 目中由于温度需 30s 采集一次,连续采集 8 小时数据,故最多可保持 960 条数据 记录,所以将 id 设为从 1-960,并置为索引,可自由修改,属性设置为 INT 型即 可;time 内容由系统自动存入,类型设为 TIMESTAMP;temp 就存储读取的温度 数据。 数据更新方案: 数据库能够将编号、采集时间(由系统自行写入)和温度值保存成一条纪 录,共能存储 8
20、个小时的温度信息,即 960 条记录,编号从 1 到 960。再采集 到新的温度值,编号设为 961,并存入到表中。再将编号为 1 的记录用 delete 语句删除,最后将所有记录的编号减一,这样便实现了数据的更新,类似于 DSP 中的滑窗形式存储数据,原理如图 3.3.2.1 数据记录更新原理图。 图 3.3.2.1 数据记录更新原理图 (1)登陆数据库: 在终端输入命令行:mysql -uroot -p;(-p 表示输入的密码不显示出来) , 在 Enter password 后面输入密码便可登陆到数据库。 查看已有数据库: 输入 show databases 命令可以看到如下图所示的三个
21、默认的数据库。 (2)创建新的数据库: 输入命令行: creat databases temperature; 创建名为 temperature 的数据库,输入:show databases;可以查看,界面 如下图: (3)修改数据库格式: use temperature; /更改当前要操作的数据库 create table table1(id INT , time timestamp default current_timestamp , temp double); /创建表,并指定各列属性 show tables; /查看创建的表 insert into table1(id,temp) v
22、alues(1,23.57); /插入一条记录 select * from table1; /查看表中所有记录 如果上面建表是仅指定 time 属性为 timestamp,在这里要执行一次指令: ALTER TABLE table1 MODIFY time TIMESTAMP DEFAULT CURRENT_TIMESTAMP; 这样可防止后面更新数据时时间数据跟着发生变化。 (4)利用 Python 操作数据库进行数据存储 在利用 Python 语言进行数据库的操作需要安装 MySQLdb 模块并在程序中导 入才能够对数据库进行操作。Python 下的 Mysql 模块 MySQLdb 安装
23、按照如下步 骤进行: 在下载安装 MySQLdb 之前需下载安装 setuptools 步骤如下 1.下载: 在它的官网可以下载到安装包: https:/pypi.python.org/pypi/setuptools 2. 安装 $ tar -zxvf setuptools-0.6c11.tar.gz $ cd setuptools-0.6c11 $ python setup.py install 之后可以安装 MySQLdb 模块 下载 MySQL for Python 安装 1.2.3 版本,下载地址为: python/files/mysql-python/1.2.3/MySQL-pyth
24、on-1.2.3.tar.gz 解压,一般树莓派下载下的文件放在 Downloads 文件夹下,因此需进入其中 操作 $ cd Downloads $ tar zxvf MySQL-python-1.2.3.tar.gz 安装 $ cd MySQL-python-1.2.3 $ python setup.py build $ python setup.py install 注:正常情况下在执行:python setup.py build 会遇到以下错误: EnvironmentError: mysql_config not found 在这里是因为未找到 mysql_config 文件位置,这
25、是因为直接使用指令 apt-get install mysql-server 安装的 MySQL 不算完整。在这里可按照下面步骤: $ sudo apt-get install libmysqlclient-dev 之后查找 mysql_config 的位置,使用 find / -name mysql_config 这里我们的系统中该文件路径为: /usr/bin/mysql_config 修改 setup_posix.py 文件,在 26 行: mysql_config.path = “mysql_config” 修改为: mysql_config.path = “/usr/ bin/mys
26、ql_config” 保存后,然后再次执行: python setup.py build python setup.py install 这样就完成了 MySQLdb 模块的安装。 完成之后即可利用 Python 语言程序对数据库进行相关操作,在这一部分我们仅 需要数据的存储,在这里需要用到数据插入与数据的删除与更新。 db=MySQLdb.connect(localhost,root,041471,temperature) /链接数据库 cursor=db.cursor() /获取游标 cursor.execute(show tables) cursor.execute(select * f
27、rom table1) /选取表 value=read_temp() /读取温度数据 sql = insert into table1(id,temp) values(961,%.2f) %value /生成插入指令 cursor.execute(sql) /执行指令 mit() / 确认指令执行,执行指令之后必须有 cursor.execute(update table1 set id=id-1) /更新记录,所有 id-1 mit() db.close() /关闭数据库 time.sleep(15) /延时 (五)数据的显示(五)数据的显示 本项目设计中本地数据显示部分主要利用 Pytho
28、n 的 Tkinter()库进行绘制折 线图,Tkinter 是 Python 自带的一款 GUI 界面编写库,不需要额外下载,就可以 实现简单的 UI 界面显示操作, Python 与 Tkinter 的结合提供了一个快速和容易的 方法来创建 GUI 应用程序。 Tkinter 的提供了一个强大的面向对象的接口 Tk 的 GUI 工具包。另外数据显示需要先对数据库中的数据进行读取。 1. Python 查询 MySQL 数据 (1)方法概述: Python 查询 Mysql 使用 fetchone() 方法获取单条数据, 使用 fetchall() 方法 获取多条数据。 fetchone()
29、: 该方法获取下一个查询结果集。结果集是一个对象。 fetchall():接收全部的返回结果行.。 rowcount: 这是一个只读属性,并返回执行 execute()方法后影响的行数。 (2)所用代码: # 打开数据库连接 db = MySQLdb.connect(localhost,testuser,test123,TESTDB ) # 使用 cursor()方法获取操作游标 cursor = db.cursor() # SQL 查询语句 sql = SELECT * FROM tb_name # 执行 SQL 语句 cursor.execute(sql) # 获取所有记录列表 resul
30、ts = cursor.fetchall() for row in results: id = row0 time = row1 temp = row2 # 关闭数据库连接 db.close() 3. 本地显示客户端编写 1)Tkinter 简介 为简化并优化系统, 在本地折线显示温度记录采用 Python 编写客户端方式, 主要基于 Python Tkinter UI 编写库,实现对温度记录的读取与显示。 Python Tkinter 用法 使用 Tkinter 创建一个 GUI 应用程序步骤如下: 导入 Tkinter 模块 创建 GUI 应用程序的主窗口 添加上述部件之一或更多的 GUI
31、 应用程序 进入主事件循环的由用户触发每个事件响应 本次使用 Tkinter 主要目的是构建一个温度读取显示界面,要求为折线显 示,故最好选择能够绘制线段的模块。 Tkinter 的提供各种控件,如按钮,标签和文本框,一个 GUI 应用程序中使 用。这些控件通常被称为部件。 目前有 15 种 Tkinter 的部件,具体描述见表 3-1。 表 3-1 Tkinter 部件简介 Operator Description Button The Button widget is used to display buttons in your application. Canvas The Canva
32、s widget is used to draw shapes, such as lines, ovals, polygons, and rectangles, in your application. Checkbutton The Checkbutton widget is used to display a number of options as checkboxes. The user can select multiple options at a time. Entry The Entry widget is used to display a single-line text
33、field for accepting values from a user. Frame The Frame widget is used as a container widget to organize other widgets. Label The Label widget is used to provide a single-line caption for other widgets. It can also contain images. Listbox The Listbox widget is used to provide a list of options to a
34、user. Menubutton The Menubutton widget is used to display menus in your application. Menu The Menu widget is used to provide various commands to a user. These commands are contained inside Menubutton. Message The Message widget is used to display multiline text fields for accepting values from a use
35、r. Radiobutton The Radiobutton widget is used to display a number of options as radio buttons. The user can select only one option at a time. Scale The Scale widget is used to provide a slider widget. Scrollbar The Scrollbar widget is used to add scrolling capability to various widgets, such as list
36、 boxes. Text The Text widget is used to display text in multiple lines. Toplevel The Toplevel widget is used to provide a separate window container. Spinbox The Spinbox widget is a variant of the standard Tkinter Entry widget, which can be used to select from a fixed number of values. PanedWindow A
37、PanedWindow is a container widget that may contain any number of panes, arranged horizontally or vertically. LabelFrame A labelframe is a simple container widget. Its primary purpose is to act as a spacer or container for complex window layouts. tkMessageBox This module is used to display message bo
38、xes in your applications. 另外 Tkinter 有一些基本的属性, 如大小、 颜色、 背景等, 如 Dimensions 、 Colors、Fonts、Anchors、Relief styles、Bitmaps、Cursors 等。 在 GUI 界面制作过程中还必须注意的一点是界面的布局问题, 界面的布局直 接影响一个 GUI 界面的直观效果,在 Tkinter 中布局有以下几种方法: pack 布局 这种布局极为简单直接使用 pack 函数即可,但这种布局仅具有顺序性,且布 局不固定,对美化来说不好操作,不够灵活。 使用 pack 函数的时候,默认先使用的放到上面,
39、然后依次向下排,它会给 我们的组件一个自认为合适的位置和大小,这是默认方式,也是我们上面一直 采用的方式。pack 函数也可以接受几个参数: side 参数指定了它停靠在哪个方向,可以为 LEFT,TOP,RIGHT,BOTTOM,分别代表 左,上,右,下; fill 参数可以是 X,Y,BOTH 和 NONE, 即在水平方向填充,竖直方向填充,水平 和竖直方向填充和不填充; expand 参数可以是 YES 和 NO,它的 anchor 参数可以是 N,E,S,W(这里的 NESW 分别表示北东南西,这里分别表示上右下左)以及他们的组合或者是 CENTER (表示中间) ; ipadx 表示
40、的是内边距的 x 方向,它的 ipady 表示的是内边距的 y 方向,padx 表示的是外边距的 x 方向,pady 表示的是外边距的 y 方向。 grid 布局 grid 可以理解为网格,或者表格,它可以把界面设置为几行几列的网格, 我们在网格里插入我们想要的元素。这种布局的好处是不管我们如何拖动窗 口,相对位置是不会变化的,而且这种布局也 由于我们的程序大多数都是矩形,因此特别适合于网格布局,也就是 grid 布局。使用 grid 布局的时候,我们使用 grid 函数,在里面指定两个参数,用 row 表示行,用 column 表示列,其中值得注意的是 row 和 column 的编号都从
41、0 开始。grid 函数还有个 sticky 参数,它可以用 N, E,S, W 表示上右下左, 它决定了这个组件是从哪个方向开始的,下面的例子可以很好的解释这一点。 grid 布局直接用后面的行和列的数字来指定了它位于哪个位置,而不必使用其 他参数。.grid 函数也支持诸如 ipadx, ipady, padx,pady,它们的意思和 pack 函数是一样的,默认边距是 0。它还支持参数比如 rowspan,表示跨越的 行数,columnspan 表示跨越的列数。 place 布局 它直接使用死板的位置坐标来布局,这样做的最大的问题在于当我们向窗 口添加一个新部件的时候,又得重新测一遍数据,且我们不能随便地变大或者 缩小窗口,否则,可能会导致混乱。Place 布局较为复杂,不容易理解。 2)界面编写 在本次设计中为方便灵活布局,采用 grid 布局形式对界面进行布局操作。 界面布局包含图形显示及数值显示两部分内容。 图形显示:图形显示: 使用 Tkinter 中的 Canvas 空间生成画布,并在此基础上绘制所需图形,本