LabVIEW Arduino TCP/IP远程智能家居系统(项目篇—5)

2022-06-27 13:48:26 浏览数 (2)

目录

1、项目概述

2、项目架构

3、传感器选型

3.1、气体传感器

3.2、温度传感器

3.3、热释电红外传感器

3.4、继电器

4、硬件环境

5、Arduino功能设计

​6、LabVIEW功能设计

6.1、前面板设计

6.2、程序框图设计


1、项目概述

智能家居是以家为平台,兼备建筑化于一体的高效、舒适、安全、便利的家居环境。它是采用家庭控制总线、互联网、通信、人工智能、单片机、传感器等一系列高新技术将家居设备控制,安防管理生活信息及资讯管理,家居互联网通信等与我们日常生活息息相关的常用生活元素全面并缜密地结合在一起,能够高度地提升我们的日常生活质量、便利性、安全性、舒适性和丰富性,是实现真正意义上的数字化、网络化、信息化和智能化家庭的一种全新的系统。它是依托于住宅这个平台,能够科学统筹管理家居生活的各个方面,让家居生活“"智慧"起来。这个管理过程的实现要依赖于计算机技术、网络技术、通信技术和综合布线技术等关键技术。其目的是为了给人们提供一个更加舒适、更加安全、更加便利的环境,从而真正地提高人们的生活品质,让人们感受到现代化时尚便利式的生活。

智能家居系统是实现对家用电器、数据采集设备和安防设备进行智能化监控的系统,它包含入侵报警、煤气检测、数据采集以及家电控制等功能模块。其中,具有安防功能的煤气检测、入侵报警模块是为家庭提供安全方面的保障;数据采集模块用于对温度湿度等物理量的采集,把数据发送到控制模块,通过控制模块对空调、照明灯具和电动窗帘等设备进行控制,该模块实现的目的是为用户提供舒适、便捷、安全的家居环境。

2、项目架构

本篇博文主要介绍一个基于TCP/IP网络的远程智能家居系统,采用Arduino Uno控制器作为下位机,采用LabVIEW作为远程监控软件,两者通过网络实现通信。

项目资源下载请参见:LabVIEWArduinoTCP/IP远程智能家居系统【实战项目】

3、传感器选型

3.1、气体传感器

为了防止厨房内的煤气发生泄露,引发煤气中毒和火灾等危险的发生,本系统在厨房中安装气体传感器,以检测是否有天然气泄露。

气体传感器选用MQ-X系列气体传感器,此款传感器采用MQ-X型气敏元件,可以很灵敏地检测到空气中的烟雾以及甲烷气体。结合蜂鸣器模块与继电器模块,可以制作烟雾报警器、甲烷泄露报警器、自动烟雾排风机等产品,是使室内的空气达到环保标准的理想传感器。

MQ-2是一种气体电阻控制型的气敏器件,其阻值随被测气体的浓度(成分)而变化。气敏器件是一种“气—电"传感器件,它将被测气体的浓度(成分)信号转变成相应的电信号,而且气敏器件阻值与气体浓度之间一般为非线性关系,但在固定浓度域的气体检测时可近似认为是线性的,在一定的浓度范围内的检测是有效的。

气敏器件一般都是在加热条件下工作,但工作温度不宜太高(一般不要超过35℃),否则会造成性能衰减,降低气敏灵敏度。器件放置一段时间后,再通电使用时,阻值是先下降,然后又上升,通电大约10分钟后(初期稳定时间),才能稳定到与气氛状态相应的阻值。为了避免通电开始时的误报动作,应特别注意要设置十几分钟的延迟时间。器件的响应时间约为10秒,恢复时间约为30~60秒。使用时,要避免油浸或油垢污染,更不要将气敏器件长时间放在腐蚀气体中。长时间使用时,要有防止灰尘堵塞不锈钢网的措施。

MQ-2气体传感器实物图如下图所示:

3.2、温度传感器

DS18B20是美国DALLAS半导体公司的数字化单总线智能温度传感器,与传统的热敏电阻相比,它能够直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。从DS18B20读出信息或写入信息仅需要一根线(单总线)读写,总线本身也可以向所挂接的设备供电,而无需额外电源。

拓展学习:LabVIEW控制Arduino采集多路DS18B20温度数值(进阶篇—3)

3.3、热释电红外传感器

热释电红外传感器主要由一种高热电系数的材料,如错钛酸铅系陶瓷、担酸锂、硫酸三甘钛等制成尺寸为2mm×1mm的探测元件。在每个探测器内装入一个或两个探测元件,并将两个探测元件以反极性串联,以抑制由于自身温度升高而产生的干扰。由探测元件将探测并接收到的红外辐射转变成微弱的电压信号,经装在探头内的场效应管放大后向外输出。为了提高探测器的探测灵敏度以增大探测距离,一般在探测器的前方装设一个菲涅尔透镜,该透镜用透明塑料制成,将透镜的上、下两部分各分成若干等份,制成一种具有特殊光学系统的透镜,它和放大电路相配合,可将信号放大70dB以上,这样就可以测出10~20米范围内人的行动。

热释电红外传感器的窗口接收光线,滤波片对自然界中的白光信号具有抑制作用,因此只有特定波长的红外信号才能透过滤波片照射在热释电元件上。热释电元件被光照后,由于热释电元件的上下表面受到的光照不同,产生电子并且形成电流,使两块黑色涂膜产生不同的热释电,电流经过场效应管后放大输出电压信号。

热释电红外传感器具有不发任何类型的辐射、器件功耗很小、隐蔽性好、价格低廉等优点,其缺点如下:

1、容易受各种热源、光源干扰;

2、被动红外穿透力差,人体的红外辐射容易被遮挡,不易被探头接收;

3、环境温度和人体温度接近时,探测和灵敏度明显下降,有时造成短时失灵。

3.4、继电器

继电器是一种电控制器件,当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系,通常应用于自动化的控制电路中,实际上是用小电流去控制大电流运作的一种“自动开关”。

电磁继电器一般由铁芯、线圈、衔铁、触点簧片等组成。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力下返回原来的位置,使动触点与原来的静触点(常闭触点)释放。这样吸合、释放,从而达到了在电路中的导通、切断的目的。对于继电器的“常开、常闭"触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。

4、硬件环境

将DS18B20温度传感器的Vcc和GND分别连接至Arduino Uno控制器的 5V和GND,以给DS18B20提供电源,DS18B20的DQ引脚接至ArduinoUno控制器数字引脚D2,且连接4.7KΩ的上拉电阻,因为DS18B20的DQ引脚正常工作需要添加上拉电阻。

将MQ-2气体传感器的两个H引脚分别接至加热电源的正负极,并调整电源模块输出 5V电压;将A端、B端分别接至Arduino Uno控制器的 5V、模拟输入AO,并且在B端与GND之间串接负载电阻。

将固态继电器模组的控制端分别接至Arduino Uno控制板上的数字端口D3、D4、D5、D6、GND。硬件连接图上只表示了一路继电器,其余的类似。

将热释电红外传感器的VCC、OUT、GND分别接至Arduino Uno控制板上的5V、数字接口D7和GND。此处没有在硬件连接图上表示出来。

远程智能家居系统部分硬件连接如下图所示:

5、Arduino功能设计

在基于Arduino与LabVIEW的远程家庭监控系统中,Arduino Uno控制器需要完成以下功能:

1、通过W5100网络模块接收并判断命令,采集和传输温度、煤气浓度、热释电传感器的数据,并通过W5100网络模块上传给LabVIEW软件;

2、通过W5100网络模块接收并判断命令、控制多路继电器模组的断开与闭合,以控制家用电器的关闭与工作。

远程智能家居系统Arduino控制器程序代码如下所示:

代码语言:javascript复制
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2     //DS18B20接至Arduino数字口2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

#define gas_Command        0x81   
#define temp_Command       0x82   
#define infrared_Command   0x80   
#define SW1_ON_Command     0x11   
#define SW1_OFF_Command    0x10   
#define SW2_ON_Command     0x21   
#define SW2_OFF_Command    0x20   
#define SW3_ON_Command     0x31   
#define SW3_OFF_Command    0x30   
#define SW4_ON_Command     0x41   
#define SW4_OFF_Command    0x40   

#include <SPI.h>
#include <Ethernet.h>
// Adresses MAC et IP à changer suivant vos besoins
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);

// Initialisation de la librairie ethernet
// et création d'un objet "Server" qui va accepter
// les connexions extérieures à l'adresse IP defini plus
// haut et sur le port indiqué (ici 8000)
EthernetServer server(8000);

byte comdata[3]={0};
void test_do_data(void);    //测试串口数据是否正确并执行命令

int SW1=3;
int SW2=4;
int SW3=5;
int SW4=6;
int inrared_Pin=7;

void setup()
{
  Ethernet.begin(mac, ip);      // Initialisation de la pile TCP/IP
  server.begin();               // Démarrage du serveur
  sensors.begin();
  pinMode(SW1, OUTPUT); 
  pinMode(SW2, OUTPUT); 
  pinMode(SW3, OUTPUT); 
  pinMode(SW4, OUTPUT); 
}
  
void loop()
{
   int i ;
  // Attente des connexions et création d'un objet client s'il y a lieu
  EthernetClient client = server.available();
  if (client) {                                // Un client existe
    while (client.connected()) {               // il est connecté
      if (client.available()) {                // et il a envoyé des caractères    
         for(i=0;i<3;i  )
         {
              comdata[i] =client.read();
               //延时一会,让串口缓存准备好下一个字节,不延时可能会导致数据丢失
              delay(2);
           }
          test_do_data();
        }
      // on renvoie au client une chaine de caractère qui représente le résultat de
      // la conversion AN (par ex: '236') suivi des caractères CR LF
        }
    client.stop();                             // Fermeture de la connexion
  }
}
void test_do_data()
{
  if(comdata[0] == 0x55)    //0x55和0xAA均为判断是否为有效命令
   {
     if(comdata[1] == 0xAA)
     {
       switch (comdata[2])
        {
            case temp_Command: 
            sensors.requestTemperatures();
            server.print(sensors.getTempCByIndex(0),2);    
            break;
            case infrared_Command:       
            server.print(digitalRead(inrared_Pin)*5/1024,2); 
            break;
            case gas_Command:  
            server.print(analogRead(A0));      
            break;
            case SW1_ON_Command:  
            digitalWrite(SW1, HIGH);        
            break;
            case SW1_OFF_Command:  
            digitalWrite(SW1, LOW);        
            break;
            case SW2_ON_Command:  
            digitalWrite(SW2, HIGH);        
            break;
            case SW2_OFF_Command:
            digitalWrite(SW2, LOW);        
            break;
            case SW3_ON_Command:  
            digitalWrite(SW3, HIGH);        
            break;
            case SW3_OFF_Command:  
            digitalWrite(SW3, LOW);        
            break;
            case SW4_ON_Command:  
            digitalWrite(SW4, HIGH);        
            break;
            case SW4_OFF_Command:  
            digitalWrite(SW4, LOW);        
            break;
            
        }
      }
   }
}     

​6、LabVIEW功能设计

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

1、当家用电器的开关触发时,向下位机Arduino控制器发送指定家电的状态切换命令,Arduino控制器通过W5100模块读取上位机的命令,进而控制固态继电器模组的闭合和断开,实现指定家用电器的打开/关闭;

2、当前面板无操作而超时1秒时,依次向下位机Arduino控制器发送温度、煤气浓度、热释电传感器的读取命令,Arduino控制器通过W5100模块读取上位机的命令,读取所需的数据并通过W5100模块上传至LabVIEW上位机软件显示。

6.1、前面板设计

LabVIEW前面板分为仪表盘显示、波形图显示和电器开关等部分,仪表盘部分用于显示当前的煤气浓度,波形图显示部分用于显示温度的变化趋势,电器开关部分用于控制各路电器的工作状态。同时,右下角的防盗指示灯显示热释电传感器的状态。

远程家庭监控系统的LabVIEW上位机前面板如下图所示:

6.2、程序框图设计

采用事件结构 超时结构来实现测量和控制两部分,在测量中使用条件结构 枚举的状态机来实现温度、气体浓度和热释电传感器数据的读取,将测量程序划分为3个状态:温度测量、气体检测和防盗指示。

为了更好地实现通信,制定如下的通信协议︰帧头 操作码。0x55AA为帧头,操作码0x80为热释电传感器数据的采集,0x81为气体浓度的采集,0x82为温度采集,0x11为第一路继电器闭合,0x10为第一路继电器断开,0x21为第二路继电器闭合,0x20为第二路继电器断开,0x31为第三路继电器闭合,0x30为第三路继电器断开,0x41为第四路继电器闭合,0x40为第四路继电器断开。

LabVIEW上位机超时部分的程序框图如下所示:

四个开关的值改变事件的程序框图如下所示:

在将程序烧写到Arduino Uno控制器之后,用网线将W5100网络模块与计算机连接在同一个路由器的不同的LAN接口,在LabVIEW程序中使用“高亮执行代码”,观察TCP初始化能否成功。如不能,则重启Arduino Uno控制器。

另外,在Arduino Uno控制器一端的路由器需要直接与公网相连接,而不是作为二级路由,同时需要设置路由器,使得Arduino Uno控制器的网络IP地址能够被远程的LabVIEW软件所侦听到。由于不同的路由器的设置方法不同,具体的路由器设置方法请上网搜索。

项目资源下载请参见:LabVIEWArduinoTCP/IP远程智能家居系统【实战项目】

0 人点赞