Arduino+mysql网络数据采集,Labview定时监控温

2018-06-23  本文已影响0人  teddyandchen

实验期望

随着智能硬件的普及,微型控制器及功能日益增强的小型计算平台的出现使得越来越多的人去学习 体验 完成一些项目,这些项目原先需要精密且昂贵的硬件来完成.不同于以往购买商业性软件或为消费者打造软件工具包的行为,开发商甚至个人现在有能力用自己的解决方案来满足需求.传感器网络就是一个很好的例子,本实验证明了一个具有中等技术能力的人完全可以采用这些虽然小巧,但功能强大价钱便宜的部件来建立自己的传感器网络平台来实现家庭温度监控调节,家庭园艺喷灌,家庭动物饲养,家庭照明控制,甚至是家庭大数据分析.

硬件环境

  1. arduino mega 2560+ w5100网络扩展板


    实验平台
  1. DHT11温度湿度传感器模块


    传感器
  2. 安装window系统电脑一台,网络路由器(个人电脑为08年DIY 酷睿2 3G内存 )

软件环境

操作系统为windows 7 家庭高级版 安装有arduino IDE V1.8.3 Labview2012wampserver.
操作系统及arduino IDE的安装此处省略.

说明:

代码清单及程序框图

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 <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#include <dht.h>

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框图:

labview框图
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 程序设计

说明:

实现功能及实验总结 (附图)

由于本人参加过医院,工厂等设备的调试维护和生产,深知若没有详细的规划,可能出现问题的预判,及事后的及时总结.一项工程的实施便会成为一场灾难,轻则耗时耗力,中则劳民伤财,重则危及人身安全,而项目成功的关键建立在对软件硬件及其相互协作过程的极度熟悉与掌握,所以在实验阶段"不怕出问题,怕不出问题"---是工程师应该具备的良好心理素质,而项目的进度应该本着由易到难在到易,由慢到快在到慢的原则递归前进,做出自己满意他人放心的信得过工程.
而本实验的实施前后用时三年(会饿死人的!)构思(穿插于不同的项目之间)掌握新技术新语言,新调试方法(不同的方法推倒了无数次)虽然代码量不多,涉及硬件也简单(克服了多次采购新硬件的欲望---资金紧张)本着少花钱多办事的原则,最终花时两个月形成了本文.本实验实现的功能为温湿度数据的采集与mysql数据库的建立查询,虽然功能简单,但本着一块石头也能调出一锅鲜美的汤的原则,后续希望引入大数据分析的概念对家庭(小环境)温湿度进行PID调节.本人今后也会养成记录实验的习惯随时将所思所想所做予以忠实记录

参考资料

上一篇下一篇

猜你喜欢

热点阅读