在基于Arduino与LabVIEW的远程家庭监控系统中,Arduino Uno控制器需要完成以下功能:1)通过W5100网络模块接收并判断命令,采集和传输温度、煤气浓度、热释电传感器的数据,并通过W5100网络模块上传给LabVIEW软件。2)通过W5100网络模块接收并判断命令、控制多路继电器模组的断开与闭合,以控制家用电器的关闭与工作。
1.Arduino硬件连接
将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、模拟输入A0,并且在B端与GND之间串接负载电阻。
将固态继电器模组的控制端分别接至Arduino Uno控制板上的数字端口D3、D4、D5、D6、GND。硬件连接图上只表示了一路继电器,其余的类似。
将热释电红外传感器的VCC、OUT、GND分别接至Arduino Uno控制板上的5V、数字接口D7和GND。此处没有在硬件连接图上表示出来。
2.Arduino程序设计
代码清单:远程智能家居系统Arduino控制器程序代码

#include <OneWire.h> // 包含I2C函数库
 #include <DallasTemperature.h> // 包含Dallas单总线函数库#include <SPI.h> // 包含SPI函数库#include <Ethernet.h> // 包含W5100网络函数库#define ONE_WIRE_BUS 2 // 定义数字口2为单总线的控制引脚#define gas_Command 0x81 // 气体采集命令#define temp_Command 0x82 // 温度采集命令#define infrared_Command 0x80 // 热释电采集命令#define SW1_ON_Command 0x11 // 继电器1闭合命令#define SW1_OFF_Command 0x10 // 继电器1断开命令#define SW2_ON_Command 0x21 // 继电器2闭合命令
 #define SW2_OFF_Command 0x20 // 继电器2断开命令#define SW3_ON_Command 0x31 // 继电器3闭合命令#define SW3_OFF_Command 0x30 // 继电器3断开命令#define SW4_ON_Command 0x41 // 继电器4闭合命令#define SW4_OFF_Command 0x40 // 继电器4断开命令OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);// 设置MAC地址和IP地址byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };IPAddress ip(192,168,1,177);// 设置端口号EthernetServer server(8000);int SW1=3; // 定义继电器1的控制引脚int SW2=4; // 定义继电器2的控制引脚int SW3=5; // 定义继电器3的控制引脚
 int SW4=6; // 定义继电器4的控制引脚
 int inrared_Pin=7; // 定义热释电传感器信号的读取引脚byte comdata[3]={0}; // 定义数组,用于保存接收命令数据
 void test_do_data(void); // 测试串口数据是否正确并执行命令void setup()
 {
 Ethernet.begin(mac, ip); // 初始化TCP/IP协议栈
 server.begin(); // 启动服务器
 sensors.begin(); // 初始化单总线传感器
 pinMode(SW1, OUTPUT);
 pinMode(SW2, OUTPUT);
 pinMode(SW3, OUTPUT);
 pinMode(SW4, OUTPUT); // 将继电器的控制引脚设置为输出状态
 }
 void loop()
 {
 int i ;
 // 等待连接,并创建一个用户对象
 EthernetClient client = server.available();
 if (client) {
 while(client.connected()) {
 if(client.available()) {
 for(i=0;i<3;i++)
 {
 comdata[i] =client.read();
 delay(2);
 }
 test_do_data();
 }
 }
 client.stop(); // 关闭连接
 }
 }
 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));
 break;
 case gas_Command: // 气体采集命令
 server.print(analogRead(A0));
 break;
 case SW1_ON_Command: // 继电器1闭合命令
 digitalWrite(SW1, HIGH);
 break;
 case SW1_OFF_Command: // 继电器1断开命令
 digitalWrite(SW1, LOW);
 break; case SW2_ON_Command: // 继电器2闭合命令
 digitalWrite(SW2, HIGH);
 break;
 case SW2_OFF_Command: // 继电器2断开命令
 digitalWrite(SW2, LOW);
 break;
 case SW3_ON_Command: // 继电器3闭合命令
 digitalWrite(SW3, HIGH);
 break;
 case SW3_OFF_Command: // 继电器3断开命令
 digitalWrite(SW3, LOW);
 break;
 case SW4_ON_Command: // 继电器4闭合命令
 digitalWrite(SW4, HIGH);
 break;
 case SW4_OFF_Command: // 继电器4断开命令
 digitalWrite(SW4, LOW);
 break;
 }
 }
 }
 }