资讯详情

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

1、项目概述

2、项目架构

3、传感器选型

3.1.气体传感器

温度传感器-toc" style="margin-left:40px;">3.2.温度传感器

3.3、热释电红外传感器

继电器-toc" style="margin-left:40px;">3.4、继电器

4、硬件环境

5、Arduino功能设计

6、LabVIEW功能设计

6.1.前面板设计

6.2.程序框图设计


1、项目概述

智能家居是一个高效、舒适、安全、便捷的家居环境,以家居为平台,结合建筑。它采用家庭控制总线、互联网、通信、人工智能、单片机、传感器等一系列高科技技术,将家居设备控制、安全管理、生活信息和信息管理、家庭互联网通信等与我们日常生活密切相关的共同生活元素全面细致地结合在一起,可以高度提高我们的日常生活质量、便利性、安全性、舒适性和丰富性,是实现真正意义上的数字化、网络化、信息化、智能家庭的新系统。依托住宅平台,可以科学统筹管理家居生活的方方面面,让家居生活"智慧"起来。依托住宅平台,可以科学统筹管理家居生活的方方面面,让家居生活"智慧"这一管理过程的实现取决于计算机技术、网络技术、通信技术和综合布线技术。其目的是为人们提供更舒适、更安全、更方便的环境,真正提高人们的生活质量,让人们感受到现代、时尚、方便的生活。

智能家居系统是一个智能监控家用电器、数据采集设备和安全设备的系统,包括入侵报警、气体检测、数据采集和家电控制等功能模块。其中,具有安全功能的气体检测和入侵报警模块为家庭提供安全保障;数据采集模块用于收集温湿度等物理量,将数据发送到控制模块,通过控制模块控制空调、照明灯、电动窗帘等设备。该模块旨在为用户提供舒适、方便、安全的家庭环境。

2、项目架构

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

下载项目资源请参见:LabVIEW Arduino TCP/IP远程智能家居系统实战项目

3.传感器选型

3.1.气体传感器

为防止厨房气体泄漏、气体中毒、火灾等危险,系统在厨房安装气体传感器,检测是否有天然气泄漏。

选择气体传感器MQ-X该系列气体传感器采用MQ-X气敏元件能敏感检测到空气中的烟雾和甲烷气体。结合蜂鸣器模块和继电器模块,可制作烟雾报警器、甲烷泄漏报警器、自动烟雾排气扇等产品,是使室内空气达到环保标准的理想传感器。

MQ-2是一种气体电阻控制气敏装置,其电阻值随被测气体的浓度(成分)而变化。气敏装置是一种气电"传感器件将被测气体的浓度(成分)信号转换为相应的电信号,气敏器件的电阻值和气体浓度一般为非线性关系,但在固定浓度区域的气体检测中可视为线性,在一定浓度范围内有效。

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

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

3.2.温度传感器

DS18B20是美国DALLAS与传统的热敏电阻相比,半导体公司的数字单总线智能温度传感器可以直接读取被测温度,并根据实际要求通过简单的编程实现9~12位数字值读数法。DS18B读写信息或写入信息只需要一条线(单总线)读写,总线本身也可以没有额外电源的情况下向挂接的设备供电。

拓展学习:LabVIEW控制Arduino采集多路DS18B20温度值(高级篇-3)

3.3.热释电红外传感器

热释电红外传感器主要由错钛酸铅陶瓷、担酸锂、硫酸三甘钛等高热电系数材料制成mm×1mm探测元件。在每个探测器中安装一个或两个探测元件,并以反极性串联两个探测元件,以抑制温度升高引起的干扰。检测元件将检测和接收收到的红外辐射转换为微弱的电压信号,并通过放大安装在探头中的场效应管向外输出。为了提高探测器的探测灵敏度,增加探测距离,通常在探测器前安装一个菲涅尔透镜,由透明塑料制成,将上下部分分分成几个等份,制成一个具有特殊光学系统的透镜,与放大电路配合,可放大70个信号dB这样就可以测量10~20米范围内人的行动。

热释电红外传感器的窗口接收光线,滤波器可以抑制自然界中的白光信号,因此只有具有特定波长的红外信号才能通过滤波器照射到热释电元件上。热释电元件被照亮后,由于热释电元件上下表面的光线不同,产生电子并形成电流,两个黑色涂层产生不同的热释电,电流通过现场效应管后放大输出电压信号。

其缺点如下:

易受各种热源、光源的干扰;

2.被动红外穿透力差,人体红外辐射容易堵塞,探头不易接收;

当环境温度接近人体温度时,探测和灵敏度显著下降,有时会导致短期故障。

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控制器程序代码如下所示:

#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软件所侦听到。由于不同的路由器的设置方法不同,具体的路由器设置方法请上网搜索。

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

标签: 992551102的油位传感器arduino单片机电阻正负极甲烷传感器报警原因016lf连接器智能电子连接器对射光电开关传感器感应开关ex

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台