This is a simple home automation system which communicates with a Bluetooth app to control home systems such as HVAC and lighting. This was done for El-Sharkaway's ECE595 Class

Dependencies:   DHT EthernetInterface M2XStreamClient Servo jsonlite mbed-rtos mbed nRF24L01P

Fork of nRF24L01P_Hello_World by Owen Edwards

Files at this revision

API Documentation at this revision

Comitter:
haircules
Date:
Fri May 05 15:46:14 2017 +0000
Parent:
1:5be2682710c6
Commit message:
Home Automation System for IUPUI El-Sharkaway's ECE595 Course

Changed in this revision

DHT.lib Show annotated file Show diff for this revision Revisions of this file
EthernetInterface.lib Show annotated file Show diff for this revision Revisions of this file
M2XStreamClient.lib Show annotated file Show diff for this revision Revisions of this file
Servo.lib Show annotated file Show diff for this revision Revisions of this file
jsonlite.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 5be2682710c6 -r 19aff72aeb30 DHT.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DHT.lib	Fri May 05 15:46:14 2017 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/Wimpie/code/DHT/#9b5b3200688f
diff -r 5be2682710c6 -r 19aff72aeb30 EthernetInterface.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface.lib	Fri May 05 15:46:14 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/EthernetInterface/#183490eb1b4a
diff -r 5be2682710c6 -r 19aff72aeb30 M2XStreamClient.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/M2XStreamClient.lib	Fri May 05 15:46:14 2017 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/ATT-M2X-team/code/M2XStreamClient/#2610823f7f2e
diff -r 5be2682710c6 -r 19aff72aeb30 Servo.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Servo.lib	Fri May 05 15:46:14 2017 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/simon/code/Servo/#36b69a7ced07
diff -r 5be2682710c6 -r 19aff72aeb30 jsonlite.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jsonlite.lib	Fri May 05 15:46:14 2017 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/citrusbyte/code/jsonlite/#807034181e02
diff -r 5be2682710c6 -r 19aff72aeb30 main.cpp
--- a/main.cpp	Wed Jan 19 23:53:19 2011 +0000
+++ b/main.cpp	Fri May 05 15:46:14 2017 +0000
@@ -1,75 +1,820 @@
 #include "mbed.h"
-#include "nRF24L01P.h"
+#include "DHT.h"
+#include "nRF24L01P.h" /*RF Module*/
+#include "M2XStreamClient.h" /*AT&T M2X*/
+#include "EthernetInterface.h" /*Ethernet*/
+#include <stdlib.h>
+#include <stdio.h>
+
+
+
+/***************              Base Board Code               **********************/
+/*     -- All revisions made by Nigel Leitzell for ECE595 final project --       */
+/* This code allows for communication between the Mobile Board and Bluetooth App */
+/* to the Base Board for Smart Home Automoation. Values logged from sensors will */
+/* be collected and sent to the cloud via Ethernet from the Base Board. The Base */
+/* Board should allow the user to control aspects of their home (i.e. lighting-  */
+/* and air temperature). However, only the Mobile Board or Bluetooth App may be- */
+/* used at any one time. Selection of board which assumes control of the Base-   */
+/* Board is determined using buttons on the Base Board or the Bluetooth App.     */
+/*********************************************************************************/
+
+/************************       Definitions            ***************************/
+#define PWM_PERIOD 20
+/**************               Communications           ***************************/
+#define TRANSFER_SIZE   15
+/*********************************************************************************/
 
-Serial pc(USBTX, USBRX); // tx, rx
+/**************             Pin Declarations          ****************************/
+Serial pc(USBTX, USBRX);// (tx, rx)
+Serial TFT_LCD(PTC17, PTC16); // (tx, rx) Serial port for TFT LCD
+nRF24L01P my_nrf24l01p (PTD6,PTD7,PTD5,PTD4,PTB20,PTC18);// (mosi, miso, sck, csn, ce, irq)
+DigitalOut RED(LED1);
+DigitalOut GREEN(LED2);//Mobile Board Control
+DigitalOut BLUE(LED3); //Base Board Control
+DigitalOut Fan_En(PTD2); //Fan Enable Line
+DigitalIn sw2(SW2); //Mobile Board select button
+DigitalIn sw3(SW3); //Bluetooth App select button
+Serial HC06(PTC15,PTC14);//BT TX,RX (Bluetooth module declaration)
+//InterruptIn HC06_Int(PTC14);//Install Interrupt on Rx Pin for Bluetooth Module
+//Ticker Timer1; //Timer for updating current temp
+PwmOut Fan_PWM(PTD1);
+PwmOut Fan_Servo(PTD0);
+DHT tempSensor(PTC4,DHT22);
+
+/*********************************************************************************/
+
+/**************            Function Prototypes            ************************/
+void unpack(int &x,int &y,int &z,char *b); /*unpacketize the buffer*/
+void initEthernet(EthernetInterface eth); /*Initialize Ethernet*/
+void InitBT(void);/*print Bluetooth Stuff*/
+void Rx_Interrupt(void);/*Interrupt Routine for Bluetooth Rx Events*/
+void Timer1_Interrupt(void);/*Function Handler for Timer1*/
+/*********************************************************************************/
+
+/**************                  Globals                   ***********************/
+/*************** Set Sensor Stream details (AT&T M2X stuff) **********************/
+char deviceId[] = "81c5ecb0ac94aad592ad558ead689321"; // Device you want to push to
+char streamX[] = "acc_x"; // Stream you want to push to
+char streamY[] ="acc_y"; // Stream you want to push to
+char streamZ[] ="acc_z"; // Stream you want to push to
+char m2xKey[] = "b2c3795c7022a811a3c4de49095b26ec"; // Your M2X API Key or Master API Key
+uint8_t snd[512],rcv[1000];//send and recieve buffer for Bluetooth
+/*********************************************************************************/
+
+/******************************************************************************/
+/* User Level #define Macros                                                  */
+/******************************************************************************/
 
-nRF24L01P my_nrf24l01p(p5, p6, p7, p8, p9, p10);    // mosi, miso, sck, csn, ce, irq
+/******************************************************************************/
+/* User Definitions                                                           */
+/******************************************************************************/
+#define SECURITY_LIGHTS_ADDR    0x00
+#define INDOOR_LIGHTS_ADDR      0x01
+#define SMART_LIGHT_ADDR        0x02
+#define CUR_TEMP_ADDR           0x03
+#define HEAT_SET_TEMP_ADDR      0x04
+#define COOL_SET_TEMP_ADDR      0x05
+#define HEAT_STATE_ADDR         0x06
+#define COOL_STATE_ADDR         0x07
+#define FAN_STATE_ADDR          0x08
+#define FAN_DIR_UD_ADDR         0x09
+#define FAN_DIR_LR_ADDR         0x0A
+#define ARM_STATE_ADDR          0x0B
+#define MODE_ADDR               0x0C
+#define CONNECTION_STATE_ADDR   0x0D
+#define FAN_SPEED_ADDR          0x0E
+#define ARDUINO_ADDR            0xFF
+
+#define CONNECTED              1    //Connection state for bluetooth
+#define NUM_OF_EVENTS          15   //Number of events to handle
+
+typedef struct SmartHomeStruct
+{
+    bool    security_lights_state;
+    bool    indoor_lights_state;
+    bool    smart_light_state;
+    uint8_t cur_temp;
+    uint8_t heat_set_temp;
+    uint8_t cool_set_temp;
+    bool    heat_state;
+    bool    cool_state;
+    bool    fan_state;
+    uint8_t fan_speed;
+    uint8_t fan_dir_ud;
+    uint8_t fan_dir_lr;
+    bool    arm_state;
+    uint8_t mode;
+    bool    connection_state;
+}SmartHome;
 
-DigitalOut myled1(LED1);
-DigitalOut myled2(LED2);
+typedef union
+{
+    uint8_t     Flags;  
+    struct
+    {
+        uint8_t RPF    : 1,     /* Received Packet Flag set when packet received */
+                RAPF   : 1,     /* Received Address Packet Flag set when address packet received (must be cleared to receive data packet) */
+                RDPF   : 1,     /* Received Data Packet Flag set when data packet received (RAPF must be cleared to receive data packet)*/
+                RUT    : 1,     /* Request Update Temperature Flag set when UpdateCurTemp() is called, cleared once temperature is updated */
+                USF    : 1,     /* Update Servo Flag is set after 20ms period required to send pulse to update position, cleared after 2ms */
+                spare2 : 1,     /* Unused */
+                spare1 : 1,     /* Unused */
+                spare0 : 1;     /* Unused */
+    };
+} SmartFlags;
+
+/*Typedef for function pointer type event_ptr*/
+typedef void (*event_ptr)( uint8_t );
+/*Create event_ptr array of size NUM_OF_EVENTS*/
+event_ptr event_ptr_array[NUM_OF_EVENTS];
+
+SmartHome  SmartHomeData; //struct for SmartHome Data
+
+SmartFlags SmartHomeFlags;
+
+/******************************************************************************/
+/* User Function Prototypes                                                   */
+/******************************************************************************/
+
+void InitSmartHomeApp(void);                      /* I/O and Peripheral Initialization */
+void InitBluetoothApp(void);             /* Initialize values in the Bluetooth App */
+void InitAppFlags(void);                 /* Initialize Flags for SmartHome */
+void SecurityLights(uint8_t data);   /* Security Lights Handler */
+void IndoorLights(uint8_t data);
+void SmartLight(uint8_t data);
+void CurrentTemp(uint8_t data);
+void HeatSetTemp(uint8_t data);
+void CoolSetTemp(uint8_t data);
+void HeatState(uint8_t data);
+void CoolState(uint8_t data);
+void FanState(uint8_t data);
+void FanDirUD(uint8_t data);
+void FanDirLR(uint8_t data);
+void ArmState(uint8_t data);
+void Mode(uint8_t data);
+void ConnectionState(uint8_t data);
+void FanSpeed(uint8_t data);
+void UpdateCurTemp(void);
+void CheckTempSettings(void);
+void SyncLCD(void);
+void RefreshServos(void);
+void CurrentTemp_LCD(uint8_t data);
+void HeatSetTemp_LCD(uint8_t data);
+void CoolSetTemp_LCD(uint8_t data);
+void HeatState_LCD(uint8_t data);
+void CoolState_LCD(uint8_t data);
+void FanState_LCD(uint8_t data);
 
 int main() {
+    
+    uint8_t Address;
+    uint8_t Data;
 
-// The nRF24L01+ supports transfers from 1 to 32 bytes, but Sparkfun's
-//  "Nordic Serial Interface Board" (http://www.sparkfun.com/products/9019)
-//  only handles 4 byte transfers in the ATMega code.
-#define TRANSFER_SIZE   4
+    InitSmartHomeApp();
+    
+    InitAppFlags();
+    
+    InitBT();
+    
+    SyncLCD();
 
-    char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE];
+    /*RF Module (Mobile Board) variables/buffers */
+    char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE];//tx,rx buffers for RF
     int txDataCnt = 0;
     int rxDataCnt = 0;
-
-    my_nrf24l01p.powerUp();
-
+    int x,y,z;/*x,y,z axis variables for Mobile Board Accelerometer Data*/
+    
+    /*Bluetooth variables/buffers*/
+    int mode = 1; // Mode 1 for Bluetooth App control
+    int timer = 0;//Timer for Entering the default control mode
+    int init = 0; //determine whether mode has been initialized (1 yes, 0 no)
+   
+    RED=GREEN=BLUE=1; //LEDs are off
+    
+    //my_nrf24l01p.powerUp();/*Power Up RF module*/
+     
     // Display the (default) setup of the nRF24L01+ chip
-    pc.printf( "nRF24L01+ Frequency    : %d MHz\r\n",  my_nrf24l01p.getRfFrequency() );
-    pc.printf( "nRF24L01+ Output power : %d dBm\r\n",  my_nrf24l01p.getRfOutputPower() );
-    pc.printf( "nRF24L01+ Data Rate    : %d kbps\r\n", my_nrf24l01p.getAirDataRate() );
-    pc.printf( "nRF24L01+ TX Address   : 0x%010llX\r\n", my_nrf24l01p.getTxAddress() );
-    pc.printf( "nRF24L01+ RX Address   : 0x%010llX\r\n", my_nrf24l01p.getRxAddress() );
+    //pc.printf( "nRF24L01+ Frequency    : %d MHz\r\n",  my_nrf24l01p.getRfFrequency() );
+    //pc.printf( "nRF24L01+ Output power : %d dBm\r\n",  my_nrf24l01p.getRfOutputPower() );
+    //pc.printf( "nRF24L01+ Data Rate    : %d kbps\r\n", my_nrf24l01p.getAirDataRate() );
+    //pc.printf( "nRF24L01+ TX Address   : 0x%010llX\r\n", my_nrf24l01p.getTxAddress() );
+    //pc.printf( "nRF24L01+ RX Address   : 0x%010llX\r\n", my_nrf24l01p.getRxAddress() );
 
-    pc.printf( "Type keys to test transfers:\r\n  (transfers are grouped into %d characters)\r\n", TRANSFER_SIZE );
+    //pc.printf( "Type keys to test transfers:\r\n  (transfers are grouped into %d characters)\r\n\n\n", TRANSFER_SIZE );
 
-    my_nrf24l01p.setTransferSize( TRANSFER_SIZE );
-
-    my_nrf24l01p.setReceiveMode();
-    my_nrf24l01p.enable();
-
-    while (1) {
-
-        // If we've received anything over the host serial link...
-        if ( pc.readable() ) {
-
-            // ...add it to the transmit buffer
-            txData[txDataCnt++] = pc.getc();
+    /* Initialize RF Module */
+    //my_nrf24l01p.setTransferSize( TRANSFER_SIZE );
+    //my_nrf24l01p.setReceiveMode();
+    //my_nrf24l01p.enable();
+    
+    /* Intialize Ethernet connection*/
+    //EthernetInterface eth; 
+    //initEthernet(eth); 
+    
+    /* Initialize the M2X client */
+    //Client client;
+    //M2XStreamClient m2xClient(&client, m2xKey);
+    
+    pc.printf( "Preparing to startup..\r\n");
+    
+    //Timer1.attach(&Timer1_Interrupt, 10); //Service Timer1_Int every 1 sec
+    
+    uint32_t tempCounter = 0;
+    
+    while(1)
+    {        
+        /*If byte(s) available to read from HC06*/
+        if(HC06.readable())
+        {           
+           Rx_Interrupt();   
+        }
+        
+        /* If packet has been received, handle it*/
+        if(SmartHomeFlags.RPF)
+        {    
+            /*Assumptions: Bluetooth App will only send 2 bytes at a time (Address + Data)*/
+            Address = rcv [0];
+            Data    = rcv [1];
+            
+            event_ptr_array[Address](Data); //call the appropriate function passing it data
+                   
+            SmartHomeFlags.RPF = 0; // Clear received packet flag
+            //HC06_Int.enable_irq();  //Enable UART RX interrupt
+        }
+        
+        tempCounter++;
+                      
+    }
+ 
+ }/*end main()*/   
 
-            // If the transmit buffer is full
-            if ( txDataCnt >= sizeof( txData ) ) {
-
-                // Send the transmitbuffer via the nRF24L01+
-                my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, txDataCnt );
+void unpack(int &x,int &y,int &z,char *b){
+/*This function is resposible for unpacketizing a buffer 
+that has been transmitted wirelessly by distributing data to variables 
+passed by reference appropriately.*/
+    
+    char buffer[5];/*buffer used to unpack data from packet*/
+    
+    for(int i = 0; i < TRANSFER_SIZE; i++){
+                
+        buffer[i%5] = b[i];
+                
+            
+        if(i == 4){/*buffer contains x*/
+                 
+            x = atoi(buffer);
+                
+        }
+        else if(i == 9){/*buffer contains y*/
+                    
+            y = atoi(buffer);
+                    
+        }
+        else if(i == 14){/*buffer contains z*/
+                    
+            z = atoi(buffer);
+                    
+        }/*end if*/
+    }/*end for*/
+}/*end unpack()*/
 
-                txDataCnt = 0;
-            }
+void initEthernet(EthernetInterface eth){
+/*This function handles the ethernet initialization upon being passed a
+pointer to an EthernetInterface object*/
+        
+        eth.init();/*initialize DHCP*/
+        
+        printf("Initialized DHCP! Preparing to connect...\r\n");
+        
+        eth.connect();/*connect eth to internet*/
+        
+        printf("Success. Connected!. Device IP Address is %s\r\n", eth.getIPAddress());
+    
+}/*end initEthernet()*/
 
-            // Toggle LED1 (to help debug Host -> nRF24L01+ communication)
-            myled1 = !myled1;
-        }
+void InitBT(void)
+{    
+    /*Attach Interrupt for Rx Events to HC06 Bluetooth Module*/
+    //HC06.attach(&Rx_Interrupt, Serial::RxIrq);
+    
+    //HC06_Int.fall(&Rx_Interrupt);
+    //HC06_Int.enable_irq();
+    
+}/*end initBT()*/
 
-        // If we've received anything in the nRF24L01+...
-        if ( my_nrf24l01p.readable() ) {
-
-            // ...read the data into the receive buffer
-            rxDataCnt = my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof( rxData ) );
-
-            // Display the receive buffer contents via the host serial link
-            for ( int i = 0; rxDataCnt > 0; rxDataCnt--, i++ ) {
-
-                pc.putc( rxData[i] );
-            }
-
-            // Toggle LED2 (to help debug nRF24L01+ -> Host communication)
-            myled2 = !myled2;
+/*Function Handler for HC06 Rx Interrupts*/
+void Rx_Interrupt(void)
+{        
+    /*Temporarily Disable Rx Interrupts*/
+    //HC06_Int.disable_irq();
+    
+    SmartHomeFlags.RPF = 1; //Set received packet flag
+    
+    char buffer[100];
+    char address[10];
+    char data[10];
+    char c;
+    uint8_t t_address = 0;
+    uint8_t t_data = 0;
+    uint8_t index = 0;
+    uint8_t num_index = 0;
+    uint8_t eCount = 0;
+    
+    memset(buffer, 0, sizeof(buffer));/*flush buffer*/
+    memset(address, 0, sizeof(address));/*flush buffer*/
+    memset(data, 0, sizeof(data));/*flush buffer*/
+    
+    HC06.gets(buffer,100);/*if so, get it.*/
+    
+    
+    /*Parse buffer*/
+    c = buffer[index];
+    
+    while(c != '\n')
+    {
+        index++;
+        c = buffer[index];
+        
+        if(c == '=')
+        {
+            eCount++; //equal sign count++
+            
+            index += 2; //skip space
+            
+            c = buffer[index]; //get data
+            
+            while(c != ' ')
+            {
+                if(eCount == 1)
+                {
+                    address[num_index] = c; //fill num buffer
+                       
+                }
+                else if(eCount == 2)
+                {
+                    data[num_index] = c;   
+                }
+                
+                num_index++;
+                index++;
+                c = buffer[index];//get next char
+            } 
+            
+            num_index = 0; //reset num_index     
         }
     }
+    
+    /*Assign ASCII representation to integer representation*/
+    
+    sscanf(address, "%d", &t_address);
+    sscanf(data, "%d", &t_data);
+    
+    rcv[0] = t_address;
+    rcv[1] = t_data;
+    
+    //pc.puts(address);
+    //pc.printf("\n\r");
+    //pc.puts(data);  
+    //pc.printf("\n\r");
+    //pc.puts(buffer);
+    //pc.printf("\n\r");       
+    
+    pc.printf( "Address: %d \r\n",rcv[0]);
+    pc.printf( "Data: %d \r\n",rcv[1]);
 }
+
+void Timer1_Interrupt(void)
+{
+    pc.printf("Checking Temp..\n\r");
+    
+    UpdateCurTemp();
+    
+    /*Update Values on App and LCD*/
+    CurrentTemp(SmartHomeData.cur_temp); 
+    
+    pc.printf("Done..\n\r");
+}
+
+/******************************************************************************/
+/* User Functions                                                             */
+/******************************************************************************/
+
+void InitSmartHomeApp()
+{
+    
+    /*Initialize variables*/
+    SmartHomeData.security_lights_state = 0; //Initial security lights state 
+    SmartHomeData.indoor_lights_state   = 0; //Initial indoor lights state
+    SmartHomeData.smart_light_state     = 0; //Initial SmartLight state
+    SmartHomeData.cur_temp              = 0; //Initial current temperature 
+    SmartHomeData.heat_set_temp         = 80; //Initial heat set temperature 
+    SmartHomeData.cool_set_temp         = 55; //Initial cool set temperature
+    SmartHomeData.heat_state            = 0; //Initial heat state
+    SmartHomeData.cool_state            = 0; //Initial cool state
+    SmartHomeData.fan_state             = 0; //Initial fan state
+    SmartHomeData.fan_speed             = 0; //Initial fan speed
+    SmartHomeData.fan_dir_ud            = 0; //Initial up/down fan direction
+    SmartHomeData.fan_dir_lr            = 0; //Initial left/right fan direction
+    SmartHomeData.arm_state             = 0; //Initial arm state
+    SmartHomeData.mode                  = 0; //Initial mode
+    SmartHomeData.connection_state      = 0; //Initial bluetooth connection state
+    
+    /*Initialize Function Pointers*/
+    event_ptr_array[0] = SecurityLights;
+    event_ptr_array[1] = IndoorLights;
+    event_ptr_array[2] = SmartLight;
+    event_ptr_array[3] = CurrentTemp;
+    event_ptr_array[4] = HeatSetTemp;
+    event_ptr_array[5] = CoolSetTemp;
+    event_ptr_array[6] = HeatState;
+    event_ptr_array[7] = CoolState;
+    event_ptr_array[8] = FanState;
+    event_ptr_array[9] = FanDirUD;
+    event_ptr_array[10] = FanDirLR;
+    event_ptr_array[11] = ArmState;
+    event_ptr_array[12] = Mode;
+    event_ptr_array[13] = ConnectionState;
+    event_ptr_array[14] = FanSpeed;
+    
+    /************** Port Direction Setup ********************/
+    
+    /************ Initialize peripherals ******************/
+   
+    Fan_PWM.period_ms(PWM_PERIOD);
+    FanSpeed(SmartHomeData.fan_speed);
+    Fan_En = SmartHomeData.fan_state;
+    
+    Fan_Servo.period_ms(PWM_PERIOD);
+    Fan_Servo.pulsewidth_us((SmartHomeData.fan_dir_lr * 20) + 500 );
+    //Green_Led = 0; //(Off)
+    //Red_Led   = 0; //(Off)
+    //Heat_LED  = 0; //(Off)
+    //Cool_LED  = 0; //(Off)
+    //TRIP_EN   = 0; //(Off)
+
+    /***************** Enable Interrupts *******************/
+    
+    /************ Initialize SmartHome Data ****************/
+    UpdateCurTemp();
+    
+}     
+
+void InitBluetoothApp()
+/*This function synchronizes the SmartHome device
+  and SmartHome Bluetooth App*/
+{     
+    /*Send Security Lights State*/
+    HC06.putc(SECURITY_LIGHTS_ADDR);
+    HC06.putc(SmartHomeData.security_lights_state);
+    
+    /*Send Indoor Lights State*/
+    HC06.putc(INDOOR_LIGHTS_ADDR);
+    HC06.putc(SmartHomeData.indoor_lights_state);
+    
+    /*Send SmartLight State*/
+    HC06.putc(SMART_LIGHT_ADDR);
+    HC06.putc(SmartHomeData.smart_light_state);
+    
+    /*Send Current Temperature*/
+    HC06.putc(CUR_TEMP_ADDR);
+    HC06.putc(SmartHomeData.cur_temp);
+    
+    /*Send Heat Set Temperature*/
+    HC06.putc(HEAT_SET_TEMP_ADDR);
+    HC06.putc(SmartHomeData.heat_set_temp);
+    
+    /*Send Cool Set Temperature*/
+    HC06.putc(COOL_SET_TEMP_ADDR);
+    HC06.putc(SmartHomeData.cool_set_temp);
+
+    /*Send Heat State*/
+    HC06.putc(HEAT_STATE_ADDR);
+    HC06.putc(SmartHomeData.heat_state);
+    
+    /*Send Cool State*/
+    HC06.putc(COOL_STATE_ADDR);
+    HC06.putc(SmartHomeData.cool_state);
+    
+    /*Send Fan State*/
+    HC06.putc(FAN_STATE_ADDR);
+    HC06.putc(SmartHomeData.fan_state);
+    
+    /*Send Fan Speed*/
+    HC06.putc(FAN_SPEED_ADDR);
+    HC06.putc(SmartHomeData.fan_speed);
+    
+    /*Send Fan Up/Down Direction*/
+    HC06.putc(FAN_DIR_UD_ADDR);
+    HC06.putc(SmartHomeData.fan_dir_ud);
+    
+    /*Send Fan Left/Right Direction*/
+    HC06.putc(FAN_DIR_LR_ADDR);
+    HC06.putc(SmartHomeData.fan_dir_lr);
+    
+    /*Send Arm State*/
+    HC06.putc(ARM_STATE_ADDR);
+    HC06.putc(SmartHomeData.arm_state);
+    
+    /*Send Mode*/
+    HC06.putc(MODE_ADDR);
+    HC06.putc(SmartHomeData.mode);
+
+}
+
+void InitAppFlags()
+{
+    SmartHomeFlags.Flags = 0x00; // Clear All Flags
+}
+
+void SecurityLights(uint8_t data)
+{       
+    SmartHomeData.security_lights_state = data; 
+    
+    if(SmartHomeData.security_lights_state == 1)
+    {    
+         GREEN = 0; //ON
+    }
+    else
+    {
+         GREEN = 1; //OFF
+    }  
+    
+}
+void IndoorLights(uint8_t data)
+{
+    SmartHomeData.indoor_lights_state = data;
+    
+    if(SmartHomeData.indoor_lights_state == 1)
+    {    
+         BLUE = 0; //ON
+    }
+    else
+    {
+         BLUE = 1; //OFF
+    }
+    
+}
+void SmartLight(uint8_t data)
+{
+    SmartHomeData.smart_light_state = data;
+    
+    if(SmartHomeData.smart_light_state == 1)
+    {    
+         RED = 0; //ON
+    }
+    else
+    {
+         RED = 1; //OFF
+    }
+}
+void CurrentTemp(uint8_t data)
+{
+    SmartHomeData.cur_temp = data;
+    
+    /*Send Current Temperature to App*/
+    HC06.putc(CUR_TEMP_ADDR);
+    HC06.putc(SmartHomeData.cur_temp);
+    
+    /*Send Current Temperature to LCD*/
+    CurrentTemp_LCD(SmartHomeData.cur_temp);
+}
+void HeatSetTemp(uint8_t data)
+{
+    SmartHomeData.heat_set_temp = data;
+    
+    HeatSetTemp_LCD(SmartHomeData.heat_set_temp);
+}
+void CoolSetTemp(uint8_t data)
+{
+    SmartHomeData.cool_set_temp = data;
+    
+    CoolSetTemp_LCD(SmartHomeData.cool_set_temp);
+}
+void HeatState(uint8_t data)
+{
+    SmartHomeData.heat_state = data;
+    
+    HeatState_LCD(SmartHomeData.heat_state);
+}
+void CoolState(uint8_t data)
+{
+    SmartHomeData.cool_state = data;
+    
+    CoolState_LCD(SmartHomeData.cool_state);
+}
+void FanState(uint8_t data)
+{
+    /*Turn fan on*/
+    if(data == 1)
+    {
+        SmartHomeData.fan_state = 1; //Set Fan State
+        Fan_En = SmartHomeData.fan_state;//Turn Fan On
+    }
+    /*Turn fan off*/
+    else
+    {
+        SmartHomeData.fan_state = 0; //Set Fan State
+        Fan_En = SmartHomeData.fan_state;//Turn Fan Off
+    }
+    
+    FanState_LCD(SmartHomeData.fan_state);
+}
+void FanDirUD(uint8_t data)
+{
+    SmartHomeData.fan_dir_ud = data;
+}
+void FanDirLR(uint8_t data)
+{
+    SmartHomeData.fan_dir_lr = data;
+    
+    Fan_Servo.pulsewidth_us((SmartHomeData.fan_dir_lr * 20) + 500 );
+       
+}
+void ArmState(uint8_t data)
+{
+    SmartHomeData.arm_state = data;
+}
+
+void Mode(uint8_t data)
+{
+    SmartHomeData.mode = data;
+}
+
+void ConnectionState(uint8_t data)
+{
+    SmartHomeData.connection_state = ((bool)data);
+    
+    if(SmartHomeData.connection_state == (!CONNECTED))
+    {    
+        SmartHomeData.connection_state = CONNECTED;
+        
+        HC06.putc(CONNECTION_STATE_ADDR);
+        HC06.putc(SmartHomeData.connection_state);
+        
+        InitBluetoothApp();
+    }
+}
+
+void FanSpeed(uint8_t data)
+{
+    /*Low Speed*/
+    if(data == 0)
+    {        
+        Fan_PWM.pulsewidth_ms(PWM_PERIOD >> 2);  //25% Duty Cycle
+    }
+    /*Medium Speed*/
+    else if(data == 1)
+    {
+        Fan_PWM.pulsewidth_ms(PWM_PERIOD >> 1); //50% Duty Cycle
+    }
+    /*High Speed*/
+    else if(data == 2)
+    {
+       Fan_PWM.pulsewidth_ms((PWM_PERIOD >> 2) + (PWM_PERIOD >> 1)); //75% Duty Cycle
+    }
+    /*Ultra-High Speed*/
+    else
+    {       
+        Fan_PWM.pulsewidth_ms(PWM_PERIOD); //100% Duty Cycle
+    }
+}
+
+void UpdateCurTemp(void)
+{
+    SmartHomeFlags.RUT = 1; //Set Request Update Temperature Flag
+    
+    //int error = 0;
+    
+    /*Wait for tempSensor data to be ready*/
+    //error = tempSensor.readData();
+    //while(0 != error)
+    //{
+    //    error = tempSensor.readData();
+    //}
+            
+    //SmartHomeData.cur_temp = (int)tempSensor.ReadTemperature(FARENHEIT);
+}
+
+void CheckTempSettings(void)
+{
+    /*If Heat State is On*/
+    if(SmartHomeData.heat_state == 1)
+    {
+        /*Turn on heat if current temp is below Heat Setting*/
+        if(SmartHomeData.cur_temp < SmartHomeData.heat_set_temp)
+        {
+            //Turn on Heat(Red LED)
+            //Heat_LED = 1;
+        }
+        else
+        {
+            //Heat_LED = 0;
+        }
+        
+        //Cool_LED = 0;
+    }
+    /*If Cool Sate is On*/
+    else if(SmartHomeData.cool_state == 1)
+    {
+        /*Turn on cool if current temp is above Cool Setting*/
+        if(SmartHomeData.cur_temp > SmartHomeData.cool_set_temp)
+        {
+            //Turn on Cool (Blue LED)
+            //Cool_LED = 1;
+        }
+        else
+        {
+            //Cool_LED = 0;
+        }
+        
+        //Heat_LED = 0;
+    }
+    /*Heat and Cool are off, turn off LED's*/
+    else
+    {
+        //Heat_LED = 0;
+        //Cool_LED = 0;
+    }
+}
+
+void SyncLCD(void)
+{    
+    /*Sync All Data*/
+    CurrentTemp_LCD(SmartHomeData.cur_temp);
+    //wait_us(10);
+    HeatSetTemp_LCD(SmartHomeData.heat_set_temp);
+    //wait_us(10);
+    CoolSetTemp_LCD(SmartHomeData.cool_set_temp);
+    //wait_us(10);
+    HeatState_LCD(SmartHomeData.heat_state);
+    //wait_us(10);
+    CoolState_LCD(SmartHomeData.cool_state);
+    //wait_us(10);
+    FanState_LCD(SmartHomeData.fan_state);
+}
+
+void RefreshServos(void)
+{
+    /*wait should be between 500us - 2500us*/
+    /*500us  (-90 degree position)*/
+    /*1500us (  0 degree position)*/
+    /*2500us ( 90 degree position)*/
+    
+    //set pins high
+    //LR_SERVO = 1;
+    
+    //wait 500-2500us
+    //wait_us((SmartHomeData.fan_dir_lr*20) + 500);
+    
+    //set pins low
+    //LR_SERVO = 0;
+}
+
+void CurrentTemp_LCD(uint8_t data)
+{
+    /*Update LCD*/
+    TFT_LCD.putc(2);
+    TFT_LCD.putc(CUR_TEMP_ADDR);
+    TFT_LCD.putc(SmartHomeData.cur_temp);
+}
+
+void HeatSetTemp_LCD(uint8_t data)
+{
+    /*Update LCD*/
+    TFT_LCD.putc(2);
+    TFT_LCD.putc(HEAT_SET_TEMP_ADDR);
+    TFT_LCD.putc(SmartHomeData.heat_set_temp);
+}
+
+void CoolSetTemp_LCD(uint8_t data)
+{
+    /*Update LCD*/
+    TFT_LCD.putc(2);
+    TFT_LCD.putc(COOL_SET_TEMP_ADDR);
+    TFT_LCD.putc(SmartHomeData.cool_set_temp);
+}
+
+void HeatState_LCD(uint8_t data)
+{
+    /*Update LCD*/
+    TFT_LCD.putc(2);
+    TFT_LCD.putc(HEAT_STATE_ADDR);
+    TFT_LCD.putc(SmartHomeData.heat_state);
+}
+
+void CoolState_LCD(uint8_t data)
+{
+    /*Update LCD*/
+    TFT_LCD.putc(2);
+    TFT_LCD.putc(COOL_STATE_ADDR);
+    TFT_LCD.putc(SmartHomeData.cool_state);
+}
+
+void FanState_LCD(uint8_t data)
+{
+    /*Update LCD*/
+    TFT_LCD.putc(2);
+    TFT_LCD.putc(FAN_STATE_ADDR);
+    TFT_LCD.putc(SmartHomeData.fan_state);
+}
diff -r 5be2682710c6 -r 19aff72aeb30 mbed-rtos.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Fri May 05 15:46:14 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#58563e6cba1e
diff -r 5be2682710c6 -r 19aff72aeb30 mbed.bld
--- a/mbed.bld	Wed Jan 19 23:53:19 2011 +0000
+++ b/mbed.bld	Fri May 05 15:46:14 2017 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/e2ac27c8e93e
+http://mbed.org/users/mbed_official/code/mbed/builds/9bcdf88f62b0
\ No newline at end of file