LabVIEW Arduino ZigBee无线气象站(项目篇—3)

举报
不脱发的程序猿 发表于 2022/06/16 00:07:52 2022/06/16
【摘要】 目录 1、项目概述 2、项目架构 3、传感器选型 3.1、温湿度传感器 3.2、压力传感器 3.3、压力传感器  4、硬件环境 5、Arduino功能设计 6、LabVIEW功能设计 6.1、前面板设计 6.2、程序框图设计 1、项目概述 目前,国内气象站对地面气象数据的采集大多采用传统的有线方式,...

目录

1、项目概述

2、项目架构

3、传感器选型

3.1、温湿度传感器

3.2、压力传感器

3.3、压力传感器 

4、硬件环境

5、Arduino功能设计

6、LabVIEW功能设计

6.1、前面板设计

6.2、程序框图设计


1、项目概述

目前,国内气象站对地面气象数据的采集大多采用传统的有线方式,其布线成本高,维护不方便,尤其对于山区等一些复杂的地形来说,这种缺点更为明显。传统的无线通信方式有很多,无线电、微波、红外线、蓝牙、射频等,在某些只需简单的无线连接的应用领域对数据速率的要求并不很高,设备的功耗是更需要考虑的问题。ZigBee网络是低功耗、低成本、高可靠性的无线传感器网络,其在环境检测等领域中有着广阔的应用前景。

2、项目架构

本篇博文将要介绍一种基于Arduino、LabVIEW和ZigBee的个人小型无线自动气象站,可以实现自主采集温度、湿度、气压、粉尘浓度,并且将数据实时上传至LabVIEW上位机软件。气象站终端设备采用Arduino作为控制核心,上位机软件采用LabVIEW,两者通过基于ZigBee技术的XBee模块实现无线通信。

个人小型气象站的总体框图如下图所示:

资源下载请参见:LabVIEWArduinoZigBee无线气象站【实战项目】-单片机文档类资源 

3、传感器选型

3.1、温湿度传感器

SHT11是瑞士Sensirion公司推出的一款数字温湿度传感器芯片,将传感元件和信号处理电路集成在一块微型电路板上,输出完全标定的数字信号,采用CMOSens专利技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器芯片内部包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件,并在同一芯片上与14位的A/D转换器以及串行接口电路实现无缝连接。因此,具有品质卓越、响应迅速、抗干扰能力强、性价比高等优点,广泛应用于暖通空调、汽车、消费电子、自动控制等领域。

每个传感器芯片都在极为精确的湿度腔室中进行标定,校准系数以程序形式储存在OTP内存中,用于内部的信号校准。两线制的串行接口与内部的电压调整,使外围系统集成变得快速而简单。微小的体积、极低的功耗,使SHT11成为各类应用的首选。

拓展学习:

LabVIEW控制Arduino采集热电偶温度数值(进阶篇—2)_不脱发的程序猿的博客

LabVIEW控制Arduino采集多路DS18B20温度数值(进阶篇—3)_不脱发的程序猿的博客

LabVIEW控制Arduino采集DHT11温湿度数值(进阶篇—4)_不脱发的程序猿的博客

3.2、压力传感器

气压是指作用在单位面积上的大气压力,它等于单位面积上到大气上界的垂直空气柱的重量,大气压力测量的基本单位是帕斯卡(Pa,即牛顿每平方米)。此处采用BMP085气压传感器实现气压的测量。

BMP085是一款高精度、超低能耗的压力传感器,可以应用在移动设备中。它的性能卓越,绝对精度最低可以达到0.03hPa,并且耗电极低,只有3uA。BMP085采用强大的8-pin陶瓷无引线芯片承载(LCC)超薄封装,可以通过I2C总线直接与各种微处理器相连。而且,BMP085利用温度补偿来提高气压的测量精度,反应时间7.5ms,待机电流0.1uA,无需外部时钟电路,无铅,符合RoHS规范。BMP085气压传感器模块如下图所示:

3.3、压力传感器 

粉尘是指悬浮在空气中的固体微粒。按照国际标准化组织规定,粒径小于75um的固体悬浮物定义为粉尘。大气中粉尘的存在是保持地球温度的主要原因之一,大气中过多或过少的粉尘将对环境产生灾难性的影响。但在生活和工作中,过多的粉尘是人类健康的天敌,是诱发多种疾病的主要原因。

随着经济的发展,环境污染越发严重,随着生活水平的提高,人们的健康意识也越来越强,在小型气象站中增加粉尘传感器,用于监测空气中的粉尘等可吸入固体颗粒。

GP2Y1010AU0F是夏普公司的光学空气质量传感器,可以测量空气中尘埃的含量。该装置中包含一个红外发光二极管和光电晶体管,且呈对角布置,允许其检测的反射光在空气中的灰尘,可以非常有效地检测比较微小的颗粒,如香烟烟雾,并且是常用的空气净化器系统。GP2Y1010AU0F实物图效果如下图所示:

4、硬件环境

将SHT11温湿度传感器的VCC、GND、SCK、DATA分别接至Arduino Uno控制板上的+5V、GND、模拟端口A2和A3。

将BMP085气压传感器的VCC、GND、SCL、SDA分别接至Arduino Uno控制板上的3.3V、GND、SCL和SDA。若Arduino Uno控制板上没有标注的SCL和SDA端口,则将BMP085的SCL和SDA分别接至模拟端口A5和A4上。

GP2Y1010AU0F粉尘传感器VLED串联150Ω电阻接至Arduino Uno控制板上的+5V,LED-GND接至GND,LED接至数字引脚D2,S-GND接至GND,Vo接至模拟输入A0,Vcc接至5V。

Arduino Uno控制器与XBee模块、BMP085和SHT11的硬件连接,如下图所示:

5、Arduino功能设计

在基于Arduino与LabVIEW的个人小型气象站中,Arduino Uno控制器需要完成两个功能:接收和判断命令,采集和传输温湿度、气压、粉尘浓度的数据,Arduino Uno控制器通过XBee模块接收上位机发来的命令,分析得到有效命令,读取温湿度、气压、粉尘浓度等数据,并上传给LabVIEW软件。

个人气象站Arduino控制器程序代码如下所示:


  
  1. #include <Wire.h>
  2. #include <BMP085.h>
  3. #include <SHT1x.h>
  4. #define temp_Command 0x10 //采集命令字
  5. #define humidity_Command 0x20 //A1采集命令字
  6. #define pressure_Command 0x30 //D0采集命令字
  7. #define dust_Command 0x40 //D1采集命令字
  8. // Specify data and clock connections and instantiate SHT1x object
  9. #define dataPin A3
  10. #define clockPin A2
  11. SHT1x sht1x(dataPin, clockPin);
  12. BMP085 bmp;
  13. byte comdata[3]={0}; //定义数组数据,存放串口接收数据
  14. float temp_c;
  15. float humidity;
  16. int dustPin=0;
  17. int dustVal=0;
  18. int PressureVal=0;
  19. int ledPower=2;
  20. int delayTime=280;
  21. int delayTime2=40;
  22. float offTime=9680;
  23. void receive_data(void); //接受串口数据
  24. void test_do_data(void); //测试串口数据是否正确,并更新数据
  25. void setup()
  26. {
  27. Serial.begin(9600);
  28. pinMode(2, INPUT);
  29. pinMode(3, INPUT);
  30. pinMode(ledPower,OUTPUT);
  31. pinMode(4, OUTPUT);
  32. analogReference(INTERNAL);
  33. bmp.begin();
  34. }
  35. void loop()
  36. {
  37. while (Serial.available() > 0) //不断检测串口是否有数据
  38. {
  39. receive_data(); //接受串口数据
  40. test_do_data(); //测试数据是否正确并更新标志位
  41. }
  42. }
  43. void receive_data(void)
  44. {
  45. int i ;
  46. for(i=0;i<3;i++)
  47. {
  48. comdata[i] =Serial.read();
  49. //延时一会,让串口缓存准备好下一个字节,不延时可能会导致数据丢失,
  50. delay(2);
  51. }
  52. }
  53. void test_do_data(void)
  54. {
  55. if(comdata[0] == 0x55) //0x55和0xAA均为判断是否为有效命令
  56. {
  57. if(comdata[1] == 0xFF)
  58. {
  59. switch(comdata[2])
  60. {
  61. case temp_Command:
  62. temp_c = sht1x.readTemperatureC();
  63. Serial.print(temp_c, 2);
  64. break;
  65. case humidity_Command:
  66. humidity = sht1x.readHumidity();
  67. Serial.print(humidity,2);
  68. break;
  69. case pressure_Command:
  70. PressureVal=bmp.readPressure();
  71. Serial.print(PressureVal,2);
  72. break;
  73. case dust_Command:
  74. digitalWrite(ledPower,LOW); // power on the LED
  75. delayMicroseconds(delayTime);
  76. dustVal=analogRead(dustPin); // read the dust value via pin 5 on the sensor
  77. delayMicroseconds(delayTime2);
  78. digitalWrite(ledPower,HIGH); // turn the LED off
  79. delayMicroseconds(offTime);
  80. Serial.println(dustVal);
  81. break;
  82. }
  83. }
  84. }
  85. }

6、LabVIEW功能设计

LabVIEW上位机部分需要完成以下功能:

1、向下位机Arduino控制器发送温度、湿度、气压数据的采集命令,Arduino控制器通过串口接收上位机命令,完成相应的数据采集之后并将采集的数据回传,LabVIEW软件将回传的数据显示在前面板上。

2、向下位机Arduino控制器发送粉尘浓度的采集命令,Arduino控制器通过串口接收上位机命令,完成粉尘浓度的电压采集之后并将采集的电压数据转换为粉尘浓度,LabVIEW软件接收Arduino返回的粉尘浓度并显示在前面板上,同时将粉尘浓度的变化显示在波形图上。

6.1、前面板设计

LabVIEW前面板分为仪表盘显示和波形图显示两个部分,仪表盘部分用于显示当前的数据,包括温度、湿度、气压和粉尘浓度;波形图显示部分用于显示粉尘浓度的变化趋势。基于Arduino与LabVIEW的个人小型气象站的LabVIEW上位机前面板,如下图所示:

6.2、程序框图设计

在LabVIEW上位机的程序设计中,温度、湿度、气压和粉尘浓度的采集需要向Arduino Uno控制器发送不同的命令码,并获取Arduino Uno控制器返回的测量数据,为了使得程序结构更加清晰明朗,此处将温度、湿度、气压和粉尘浓度采集分别编写成子VI。

温度采集子程序的前面板和程序框图,如下图所示:

湿度采集子程序的前面板和程序框图,如下图所示:

气压采集子程序的前面板和程序框图,如下图所示:

粉尘浓度采集子程序的前面板和程序框图,如下图所示:

采用条件结构+移位寄存器的状态机来实现LabVIEW上位机主程序,将主程序划分为5个状态:0状态为串口初始化,1状态为温度测量,2状态为湿度测量,3状态为气压测量,4状态为粉尘浓度测量,且初始状态为0状态(串口初始化)。

在0状态中,通过设置的串口号来初始化串口通信。在1状态中,读取温度数据并显示,在2状态中,读取湿度数据并显示,在3状态中,读取气压数据并显示,在4状态中,读取粉尘浓度数据并显示在波形图上。最后,关闭串口通信。

串口初始化程序框图如下所示:

温度采集程序框图如下所示:

湿度采集程序框图如下所示:

气压采集程序框图如下所示:

粉尘浓度采集程序框图如下所示:

本节介绍的基于ZigBee的个人小型气象站可以通过无线方式实现温湿度、气压和粉尘浓度的测量,如需要增加其他的测量参数,则需要添加相应的传感器即可。

另外,利用ZigBee的组网技术,在一定的区域内布置多个测量站点,可以实现区域性的气象参数的测量。

资源下载请参见:LabVIEW Arduino ZigBee无线气象站【实战项目】-单片机文档类资源

文章来源: handsome-man.blog.csdn.net,作者:不脱发的程序猿,版权归原作者所有,如需转载,请联系作者。

原文链接:handsome-man.blog.csdn.net/article/details/125249152

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。