实验期望
随着智能硬件的普及,微型控制器及功能日益增强的小型计算平台的出现使得越来越多的人去学习 体验 完成一些项目,这些项目原先需要精密且昂贵的硬件来完成.不同于以往购买商业性软件或为消费者打造软件工具包的行为,开发商甚至个人现在有能力用自己的解决方案来满足需求.传感器网络就是一个很好的例子,本实验证明了一个具有中等技术能力的人完全可以采用这些虽然小巧,但功能强大价钱便宜的部件来建立自己的传感器网络平台来实现家庭温度监控调节,家庭园艺喷灌,家庭动物饲养,家庭照明控制,甚至是家庭大数据分析.
硬件环境
arduino mega 2560+ w5100网络扩展板
DHT11温度湿度传感器模块
- 安装window系统电脑一台,网络路由器(个人电脑为08年DIY 酷睿2 3G内存 )
软件环境
操作系统为windows 7 家庭高级版 安装有arduino IDE V1.8.3 Labview2012 和 wampserver.
操作系统及arduino IDE的安装此处省略.
说明:
安装arduino IDE后还需要安装最新的Mysql connector arduino库 和 DHTlib库
安装labview2012后还需要用VI PACKAGE MANAGER安装labview interface for arduino(此实验可无需安装)还有labsql工具包
- 安装wampserver主要使用其中的mysql服务,并为后序编写PHP代码作准备(微信温湿度查询)
代码清单及程序框图
Mysql代码设置传感器数据库(在wampserver各项服务启动的前提下):
$mysql -uroot ; //假设数据库无密码
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.14-log Source distribution
Copyright (c) 2000, 2011, Oracle and/or its affilliates. ALL rights reserved
Oracle is a registered trademark of Oracle Corporation and/or its
affilliates. Other names may be trademark of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> CREATE DATABASE dht11_test;
Query OK. 1 row affected (0.00 sec)
mysql> use dht11_test;
Database changed
mysql> create table dht11_test.temp_humid(
-> 'id' int(11) NOT NULL AUTO_INCREMENT,
-> 'temp_c' char(5) DEFAULT NULL,
-> 'rel_humid' char(5) DEFAULT NULL,
-> PRIMARY KEY ('id')
-> )ENGINE=MyISAM DEFAULT CHARSET=latin1;
-> ;
Query OK, 0 rows affected (0.01 sec)
mysql>
Arduino代码:
#include "Ethernet.h"
#include
#include
#include
dht DHT;
#define DHT11_PIN A0
//为w5110网络扩展板分配一个MAC地址可自定义(与网段内网卡区分)
byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//mysql服务器地址,与路由器分配网址相同.
IPAddress server_ip(192, 168, 1, 102);
//定义数据库连接类
EthernetClient client;
MySQL_Connection conn((Client *)&client);
char user[] = "root"; // MySQL user login username
char password[] = ""; // MySQL user login password
// Sample query
char INSERT_SQL[] = "INSERT INTO dht11_test.temp_humid (temp_c,rel_humid) VALUES ('%s','%s')";
//利用DHTlib采集传感器DHT11温湿度值
void read_data(){
//Serial.print("DHT11, \t");
int chk = DHT.read11(DHT11_PIN);
switch (chk){
case DHTLIB_OK:
Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.print("Time out error,\t");
break;
case DHTLIB_ERROR_CONNECT:
Serial.print("Connect error,\t");
break;
case DHTLIB_ERROR_ACK_L:
Serial.print("Ack Low error,\t");
break;
case DHTLIB_ERROR_ACK_H:
Serial.print("Ack High error,\t");
break;
default: Serial.print("Unknown error,\t");
break;
}
// DISPLAY DATA
//读取湿度值
Serial.print(DHT.humidity, 1);
Serial.print(",\t");
//读取温度值
Serial.println(DHT.temperature, 1);
{
char buf[128];
char temp[5];
char h[]="";
//将传感器采集的浮点数转换为3位整数一位小数的字串放入temp
dtostrf(DHT.temperature,3,1,temp);
dtostrf(DHT.humidity,2,1,h);
sprintf(buf,INSERT_SQL,temp,h);
//初始化查询实例
MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
// Execute the query将采集到的温湿度值插入数据库中
cur_mem->execute(buf);
Serial.println("Data read and recorded.");
//删除查询实例并清空内存为下次采集作准备
delete cur_mem;
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
while (!Serial); // wait for serial port to connect
Ethernet.begin(mac_addr);
Serial.println("Connecting...");
if (conn.connect(server_ip, 3306, user, password)) {
delay(1000);
// Serial.println("Query success!");
// You would add your code here to run a query once on startup.
}
else
Serial.println("Connection failed.");
//conn.close();
}
void loop() {
// put your main code here, to run repeatedly:
int i;
//间隔6分钟
for(i=0;i<72;i++)
{
delay(5000);
}
read_data();//读取传感器数值
}
Labview框图:
说明:按照软件环境中labsql工具包配置连接页面配置好数据库连接,再按照本框图连接各模块
Driver=MySQLODBC 5.3 ANSI Driver; DATABASE= dth11_test; UID = root; Driver=MySQLODBC 5.3 ANSI
Driver为MySQL的连接驱动;DATABASE=dth11_test为数据库名,UID = root; 为数据库连接的用户名,密码为空;循环中的模块为labsql的sql execute模块而非con execute模块,数据表为list table,tree中的table模块,循环中的查询语句为每隔6分钟按照降序显示表中id号最新的十条记录
调试步骤
本实验由于涉及多个软件硬件的协同工作因此需要具备一定的系统集成经验以下是本实验所需要的调试手段:
*1.Apache 服务器搭建
*2.Mysql 建立插入查询命令
*3.C++ 代码阅读能力
*4.Labview 程序设计
说明:
- 由于本实验采用wampserver一键式安装大大节省了Apache服务器搭建的复杂度,只需要将本机IP地址加入hots文件中(过程中可能需要修改my.cn配置文件以允许外网访问)注意关闭网络防火墙.
- 使用一条命令:mysql> GRANT ALL ON . TO 'root'@'%' IDENTIFIED BY 'secret';将所有操作权限赋予mysql的root用户密码为secret,%表示任意主机登陆数据库,此处可将其更换为你要登陆的任意主机IP*
- 具备一定的C\C++语言代码阅读能力可以帮助你较便捷的将Arduino各模块功能迅速整合到一起,作为一项工程的起点,应该本着由易到难的原则循序渐进式搭建你的代码结构,既首先将DHT11代码调通,其次完成mysql数据库的连接进而完成向数据库读写数据,最后将DHT11实时数据写入或读出指定数据库.
- 熟悉Labview框图的绘制,特别是labview+arduino工具包的使用对本实验绝对是有帮助的,也为后续试验提供了借鉴.
实现功能及实验总结 (附图)
由于本人参加过医院,工厂等设备的调试维护和生产,深知若没有详细的规划,可能出现问题的预判,及事后的及时总结.一项工程的实施便会成为一场灾难,轻则耗时耗力,中则劳民伤财,重则危及人身安全,而项目成功的关键建立在对软件硬件及其相互协作过程的极度熟悉与掌握,所以在实验阶段"不怕出问题,怕不出问题"---是工程师应该具备的良好心理素质,而项目的进度应该本着由易到难在到易,由慢到快在到慢的原则递归前进,做出自己满意他人放心的信得过工程.
而本实验的实施前后用时三年(会饿死人的!)构思(穿插于不同的项目之间)掌握新技术新语言,新调试方法(不同的方法推倒了无数次)虽然代码量不多,涉及硬件也简单(克服了多次采购新硬件的欲望---资金紧张)本着少花钱多办事的原则,最终花时两个月形成了本文.本实验实现的功能为温湿度数据的采集与mysql数据库的建立查询,虽然功能简单,但本着一块石头也能调出一锅鲜美的汤的原则,后续希望引入大数据分析的概念对家庭(小环境)温湿度进行PID调节.本人今后也会养成记录实验的习惯随时将所思所想所做予以忠实记录
参考资料
- <学Arduino和树莓派玩转传感器网络> [美]Charles Bell著 张佳进等译 人民邮电出版社.
- <玩转Arduino-快速入门指南> [德]Maikshmidt著 唐乐 李洪刚译.
- Arduino与LabVIEW开发实战指南 沈金鑫 机械工业出版社.
- MySQL Connector/Arduino Dr.Charles Bell January 2016 PDF文档