Homework_5_IOT
Dependencies: C12832_lcd EthernetInterface LCD_fonts LM75B MMA7660 NTPClient SimpleSMTPClient WebSocketClient mbed-rtos mbed
main.cpp
- Committer:
- bhakti08
- Date:
- 2014-05-20
- Revision:
- 0:40afd0d80b51
File content as of revision 0:40afd0d80b51:
/*******************************************************/ /* IMPLEMENT THE THERMOSTAT */ /*System turned ON/OFF using joystick or Accelerometer */ /*Temperature Set using Joystick */ /*System Status and heater state shown on LED */ /*LCD displays: Time. */ /* If system is ON current and set low */ /* and High Temperature */ /* Heater/Cooler ON */ /* If system is OFF SYSTEM OFF */ /*The timing, current temperature, accelerometer reading*/ /*are sent periodically to websockets.org/bhakti */ /*The duration after which the information is sent is */ /*defined by macro SECONDS which is currently set to 10*/ /*******************************************************/ #include "mbed.h" #include "C12832_lcd.h" #include "LM75B.h" #include "DebouncedIn.h" #include "MMA7660.h" #include "EthernetInterface.h" #include "NTPClient.h" #include "SimpleSMTPClient.h" #include "Small_6.h" #include "Websocket.h" #define hys 3 #define HEATER 0 #define COOLER 1 #define No_HEAT_COOL 2 #define SEND 1 #define DO_NOT_SEND 0 #define SECONDS 10 DebouncedIn reset(p14); C12832_LCD lcd; LM75B current(p28,p27); MMA7660 MMA(p28, p27); Serial pc(USBTX,USBRX); AnalogIn max_temp(p19); AnalogIn min_temp(p20); //System ON/OFF BusIn heat_on (p16,p13); //System ON/OFF LED DigitalOut thermostat (LED1); //Heater/Cooler ON/OFF LED. This can be furthur connected to the relay DigitalOut heater (LED2); DigitalOut cooler (LED3); Ticker check_move; Ticker Send_info; bool no_move; //This variable is set if no movement is detected float acc_x = MMA.x(); float acc_y = MMA.y(); float acc_z = MMA.z(); float acc_x_old,acc_y_old,acc_z_old; int heat_cool; //1: Heater ON , 0:Cooler ON , 2: Heater and Cooler OFF bool send_info; //This variable is used to define when the information is //to be sent to the web. /****************************************************************************/ /*Function name: check: This function is used to detect motion around the */ /*thermostat.It sets the variable no move if the previous and current */ /*value of the accelerometer value is same. Accelerometer value unchanged */ /*indicates that there is no motion around the thermostat */ /****************************************************************************/ void check() { acc_x_old = acc_x; acc_y_old = acc_y; acc_z_old = acc_z; acc_x = MMA.x(); acc_y = MMA.y(); acc_z = MMA.z(); if (acc_x_old == acc_x && acc_y_old == acc_y && acc_z_old == acc_z) { no_move = 1; } else no_move = 0; } /******************************************************************************/ /******************************************************************************/ /*Function name: send_ws() */ /*This function is used to set a boolean variable to SEND so that the */ /*information can be sent over the web. The variable is set to SEND after no. */ /*of seconds defined by SECONDS(currently 10sec) */ /******************************************************************************/ void send_ws() { send_info = SEND; } /*******************************************************************************/ int main() { int ret_msg,ret_msg2,ret_curr_time,eth_ret,ws_ret; EthernetInterface eth; lcd.cls(); pc.printf("\n\n/* SimpleMTPClient library demonstration \n"); pc.printf("Setting up ...\n"); eth.init(); eth_ret = eth.connect(); if (eth_ret != 0) { lcd.cls(); lcd.printf("Ethernet not connected"); return -1; } pc.printf("Connected OK\n"); // IP Address pc.printf("IP Address is %s\n", eth.getIPAddress()); lcd.locate(0,1); lcd.printf("%s", eth.getIPAddress()); wait(2); NTPClient ntp; ntp.setTime("time.nist.gov"); lcd.cls(); Websocket ws("ws://sockets.mbed.org:443/ws/bhakti/rw"); ws_ret = ws.connect(); if (!ws_ret) { lcd.cls(); lcd.printf("Nor connected to URL"); return -1; } /*Messages to be sent over the web*/ char msg[100]; char msg2[100]; char curr_time[100]; float min_set; float max_set; //This variable is used to check if the system is ON or OFF bool status=0; time_t ctTime; lcd.cls(); check_move.attach(&check,120.0); Send_info.attach(&send_ws,SECONDS); while (1) { sprintf(msg,"Temperature is %0.2f",current.read()); sprintf(msg2,"Accelerometer readings are X= %0.2f,Y= %0.2f, Z= %0.2f",MMA.x(),MMA.y(),MMA.z()); sprintf(curr_time,"Time: %s",ctime(&ctTime)); if (send_info == SEND) { ret_msg2 = ws.send(msg2); ret_msg = ws.send(msg); ret_curr_time=ws.send(curr_time); if (ret_msg == -1 || ret_msg2 == -1 || ret_curr_time == -1) { lcd.cls(); lcd.printf("One of the messages not sent"); } send_info = DO_NOT_SEND; } min_set = min_temp.read() * 50; //scale the pot value from 0 to 1 -> 0 to 50 max_set = max_temp.read() * 50; ctTime = time(NULL) - 25200; //Adjust time as per local time lcd.set_font((unsigned char*) Small_6); //set LCD font lcd.locate(1,1); lcd.printf("%s",ctime(&ctTime)); lcd.locate(1,8); /*If system is ON print current and set temperature*/ /*Else print LCD OFF on LCD*/ if (status) { lcd.printf("Curr:%.2f",current.read()); lcd.locate(1,16); lcd.printf("MAX:%0.2f, MIN:%0.2f",max_set,min_set); lcd.locate(1,24); switch (heat_cool) { case HEATER : lcd.printf("Heater ON "); break; case COOLER : lcd.printf("Cooler ON "); break; case No_HEAT_COOL : lcd.printf("Heat/Cool OFF"); break; } } else { lcd.locate(1,10); lcd.printf("System OFF"); wait (0.1); } /*If system is turned ON: Joystick is pushed towards edge of LCD OR movement is detected Turn System ON LED on: LED1 and Set the status variable to 1 Else if system is turned OFF by user turn OFF the system status LED and the LED that is connected to the relay*/ if (heat_on == 0x2 || !no_move) { thermostat = 1; status = 1; } else if (heat_on == 0x1 || no_move) { lcd.cls(); thermostat = 0; heater = 0; status = 0; } //Comparison logic and turn Heater/Cooler ON/OFF if ((min_set > (current.read()+ hys)) && thermostat == 1) { heater = 1; cooler = 0; status = 1; heat_cool = HEATER; } else if ((max_set < (current.read()-hys)) && thermostat == 1) { cooler = 1; heater = 0; status = 1; heat_cool = COOLER; } else if (!thermostat) { heater = 0; cooler = 0; status = 0; } else { heater = 0; cooler = 0; status = 1; heat_cool = No_HEAT_COOL; } } }