Homework_5_IOT

Dependencies:   C12832_lcd EthernetInterface LCD_fonts LM75B MMA7660 NTPClient SimpleSMTPClient WebSocketClient mbed-rtos mbed

Committer:
bhakti08
Date:
Tue May 20 06:18:16 2014 +0000
Revision:
0:40afd0d80b51
Websockets

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bhakti08 0:40afd0d80b51 1 /*******************************************************/
bhakti08 0:40afd0d80b51 2 /* IMPLEMENT THE THERMOSTAT */
bhakti08 0:40afd0d80b51 3 /*System turned ON/OFF using joystick or Accelerometer */
bhakti08 0:40afd0d80b51 4 /*Temperature Set using Joystick */
bhakti08 0:40afd0d80b51 5 /*System Status and heater state shown on LED */
bhakti08 0:40afd0d80b51 6 /*LCD displays: Time. */
bhakti08 0:40afd0d80b51 7 /* If system is ON current and set low */
bhakti08 0:40afd0d80b51 8 /* and High Temperature */
bhakti08 0:40afd0d80b51 9 /* Heater/Cooler ON */
bhakti08 0:40afd0d80b51 10 /* If system is OFF SYSTEM OFF */
bhakti08 0:40afd0d80b51 11 /*The timing, current temperature, accelerometer reading*/
bhakti08 0:40afd0d80b51 12 /*are sent periodically to websockets.org/bhakti */
bhakti08 0:40afd0d80b51 13 /*The duration after which the information is sent is */
bhakti08 0:40afd0d80b51 14 /*defined by macro SECONDS which is currently set to 10*/
bhakti08 0:40afd0d80b51 15 /*******************************************************/
bhakti08 0:40afd0d80b51 16
bhakti08 0:40afd0d80b51 17 #include "mbed.h"
bhakti08 0:40afd0d80b51 18 #include "C12832_lcd.h"
bhakti08 0:40afd0d80b51 19 #include "LM75B.h"
bhakti08 0:40afd0d80b51 20 #include "DebouncedIn.h"
bhakti08 0:40afd0d80b51 21 #include "MMA7660.h"
bhakti08 0:40afd0d80b51 22 #include "EthernetInterface.h"
bhakti08 0:40afd0d80b51 23 #include "NTPClient.h"
bhakti08 0:40afd0d80b51 24 #include "SimpleSMTPClient.h"
bhakti08 0:40afd0d80b51 25 #include "Small_6.h"
bhakti08 0:40afd0d80b51 26 #include "Websocket.h"
bhakti08 0:40afd0d80b51 27
bhakti08 0:40afd0d80b51 28 #define hys 3
bhakti08 0:40afd0d80b51 29 #define HEATER 0
bhakti08 0:40afd0d80b51 30 #define COOLER 1
bhakti08 0:40afd0d80b51 31 #define No_HEAT_COOL 2
bhakti08 0:40afd0d80b51 32 #define SEND 1
bhakti08 0:40afd0d80b51 33 #define DO_NOT_SEND 0
bhakti08 0:40afd0d80b51 34 #define SECONDS 10
bhakti08 0:40afd0d80b51 35
bhakti08 0:40afd0d80b51 36 DebouncedIn reset(p14);
bhakti08 0:40afd0d80b51 37 C12832_LCD lcd;
bhakti08 0:40afd0d80b51 38 LM75B current(p28,p27);
bhakti08 0:40afd0d80b51 39 MMA7660 MMA(p28, p27);
bhakti08 0:40afd0d80b51 40 Serial pc(USBTX,USBRX);
bhakti08 0:40afd0d80b51 41 AnalogIn max_temp(p19);
bhakti08 0:40afd0d80b51 42 AnalogIn min_temp(p20);
bhakti08 0:40afd0d80b51 43
bhakti08 0:40afd0d80b51 44 //System ON/OFF
bhakti08 0:40afd0d80b51 45 BusIn heat_on (p16,p13);
bhakti08 0:40afd0d80b51 46
bhakti08 0:40afd0d80b51 47 //System ON/OFF LED
bhakti08 0:40afd0d80b51 48 DigitalOut thermostat (LED1);
bhakti08 0:40afd0d80b51 49
bhakti08 0:40afd0d80b51 50 //Heater/Cooler ON/OFF LED. This can be furthur connected to the relay
bhakti08 0:40afd0d80b51 51 DigitalOut heater (LED2);
bhakti08 0:40afd0d80b51 52 DigitalOut cooler (LED3);
bhakti08 0:40afd0d80b51 53
bhakti08 0:40afd0d80b51 54 Ticker check_move;
bhakti08 0:40afd0d80b51 55 Ticker Send_info;
bhakti08 0:40afd0d80b51 56
bhakti08 0:40afd0d80b51 57 bool no_move; //This variable is set if no movement is detected
bhakti08 0:40afd0d80b51 58 float acc_x = MMA.x();
bhakti08 0:40afd0d80b51 59 float acc_y = MMA.y();
bhakti08 0:40afd0d80b51 60 float acc_z = MMA.z();
bhakti08 0:40afd0d80b51 61 float acc_x_old,acc_y_old,acc_z_old;
bhakti08 0:40afd0d80b51 62 int heat_cool; //1: Heater ON , 0:Cooler ON , 2: Heater and Cooler OFF
bhakti08 0:40afd0d80b51 63 bool send_info; //This variable is used to define when the information is
bhakti08 0:40afd0d80b51 64 //to be sent to the web.
bhakti08 0:40afd0d80b51 65
bhakti08 0:40afd0d80b51 66 /****************************************************************************/
bhakti08 0:40afd0d80b51 67 /*Function name: check: This function is used to detect motion around the */
bhakti08 0:40afd0d80b51 68 /*thermostat.It sets the variable no move if the previous and current */
bhakti08 0:40afd0d80b51 69 /*value of the accelerometer value is same. Accelerometer value unchanged */
bhakti08 0:40afd0d80b51 70 /*indicates that there is no motion around the thermostat */
bhakti08 0:40afd0d80b51 71 /****************************************************************************/
bhakti08 0:40afd0d80b51 72 void check()
bhakti08 0:40afd0d80b51 73 {
bhakti08 0:40afd0d80b51 74 acc_x_old = acc_x;
bhakti08 0:40afd0d80b51 75 acc_y_old = acc_y;
bhakti08 0:40afd0d80b51 76 acc_z_old = acc_z;
bhakti08 0:40afd0d80b51 77 acc_x = MMA.x();
bhakti08 0:40afd0d80b51 78 acc_y = MMA.y();
bhakti08 0:40afd0d80b51 79 acc_z = MMA.z();
bhakti08 0:40afd0d80b51 80 if (acc_x_old == acc_x && acc_y_old == acc_y && acc_z_old == acc_z)
bhakti08 0:40afd0d80b51 81 {
bhakti08 0:40afd0d80b51 82 no_move = 1;
bhakti08 0:40afd0d80b51 83 }
bhakti08 0:40afd0d80b51 84 else
bhakti08 0:40afd0d80b51 85 no_move = 0;
bhakti08 0:40afd0d80b51 86
bhakti08 0:40afd0d80b51 87 }
bhakti08 0:40afd0d80b51 88 /******************************************************************************/
bhakti08 0:40afd0d80b51 89
bhakti08 0:40afd0d80b51 90 /******************************************************************************/
bhakti08 0:40afd0d80b51 91 /*Function name: send_ws() */
bhakti08 0:40afd0d80b51 92 /*This function is used to set a boolean variable to SEND so that the */
bhakti08 0:40afd0d80b51 93 /*information can be sent over the web. The variable is set to SEND after no. */
bhakti08 0:40afd0d80b51 94 /*of seconds defined by SECONDS(currently 10sec) */
bhakti08 0:40afd0d80b51 95 /******************************************************************************/
bhakti08 0:40afd0d80b51 96 void send_ws()
bhakti08 0:40afd0d80b51 97 {
bhakti08 0:40afd0d80b51 98 send_info = SEND;
bhakti08 0:40afd0d80b51 99 }
bhakti08 0:40afd0d80b51 100
bhakti08 0:40afd0d80b51 101 /*******************************************************************************/
bhakti08 0:40afd0d80b51 102
bhakti08 0:40afd0d80b51 103 int main()
bhakti08 0:40afd0d80b51 104 {
bhakti08 0:40afd0d80b51 105 int ret_msg,ret_msg2,ret_curr_time,eth_ret,ws_ret;
bhakti08 0:40afd0d80b51 106 EthernetInterface eth;
bhakti08 0:40afd0d80b51 107 lcd.cls();
bhakti08 0:40afd0d80b51 108 pc.printf("\n\n/* SimpleMTPClient library demonstration \n");
bhakti08 0:40afd0d80b51 109
bhakti08 0:40afd0d80b51 110 pc.printf("Setting up ...\n");
bhakti08 0:40afd0d80b51 111 eth.init();
bhakti08 0:40afd0d80b51 112 eth_ret = eth.connect();
bhakti08 0:40afd0d80b51 113 if (eth_ret != 0)
bhakti08 0:40afd0d80b51 114 {
bhakti08 0:40afd0d80b51 115 lcd.cls();
bhakti08 0:40afd0d80b51 116 lcd.printf("Ethernet not connected");
bhakti08 0:40afd0d80b51 117 return -1;
bhakti08 0:40afd0d80b51 118 }
bhakti08 0:40afd0d80b51 119 pc.printf("Connected OK\n");
bhakti08 0:40afd0d80b51 120
bhakti08 0:40afd0d80b51 121 // IP Address
bhakti08 0:40afd0d80b51 122 pc.printf("IP Address is %s\n", eth.getIPAddress());
bhakti08 0:40afd0d80b51 123 lcd.locate(0,1);
bhakti08 0:40afd0d80b51 124 lcd.printf("%s", eth.getIPAddress());
bhakti08 0:40afd0d80b51 125 wait(2);
bhakti08 0:40afd0d80b51 126
bhakti08 0:40afd0d80b51 127
bhakti08 0:40afd0d80b51 128 NTPClient ntp;
bhakti08 0:40afd0d80b51 129 ntp.setTime("time.nist.gov");
bhakti08 0:40afd0d80b51 130 lcd.cls();
bhakti08 0:40afd0d80b51 131
bhakti08 0:40afd0d80b51 132 Websocket ws("ws://sockets.mbed.org:443/ws/bhakti/rw");
bhakti08 0:40afd0d80b51 133 ws_ret = ws.connect();
bhakti08 0:40afd0d80b51 134 if (!ws_ret)
bhakti08 0:40afd0d80b51 135 {
bhakti08 0:40afd0d80b51 136 lcd.cls();
bhakti08 0:40afd0d80b51 137 lcd.printf("Nor connected to URL");
bhakti08 0:40afd0d80b51 138 return -1;
bhakti08 0:40afd0d80b51 139 }
bhakti08 0:40afd0d80b51 140
bhakti08 0:40afd0d80b51 141 /*Messages to be sent over the web*/
bhakti08 0:40afd0d80b51 142 char msg[100];
bhakti08 0:40afd0d80b51 143 char msg2[100];
bhakti08 0:40afd0d80b51 144 char curr_time[100];
bhakti08 0:40afd0d80b51 145
bhakti08 0:40afd0d80b51 146 float min_set;
bhakti08 0:40afd0d80b51 147 float max_set;
bhakti08 0:40afd0d80b51 148
bhakti08 0:40afd0d80b51 149 //This variable is used to check if the system is ON or OFF
bhakti08 0:40afd0d80b51 150 bool status=0;
bhakti08 0:40afd0d80b51 151
bhakti08 0:40afd0d80b51 152 time_t ctTime;
bhakti08 0:40afd0d80b51 153 lcd.cls();
bhakti08 0:40afd0d80b51 154 check_move.attach(&check,120.0);
bhakti08 0:40afd0d80b51 155 Send_info.attach(&send_ws,SECONDS);
bhakti08 0:40afd0d80b51 156 while (1) {
bhakti08 0:40afd0d80b51 157 sprintf(msg,"Temperature is %0.2f",current.read());
bhakti08 0:40afd0d80b51 158 sprintf(msg2,"Accelerometer readings are X= %0.2f,Y= %0.2f, Z= %0.2f",MMA.x(),MMA.y(),MMA.z());
bhakti08 0:40afd0d80b51 159 sprintf(curr_time,"Time: %s",ctime(&ctTime));
bhakti08 0:40afd0d80b51 160 if (send_info == SEND) {
bhakti08 0:40afd0d80b51 161 ret_msg2 = ws.send(msg2);
bhakti08 0:40afd0d80b51 162 ret_msg = ws.send(msg);
bhakti08 0:40afd0d80b51 163 ret_curr_time=ws.send(curr_time);
bhakti08 0:40afd0d80b51 164 if (ret_msg == -1 || ret_msg2 == -1 || ret_curr_time == -1)
bhakti08 0:40afd0d80b51 165 {
bhakti08 0:40afd0d80b51 166 lcd.cls();
bhakti08 0:40afd0d80b51 167 lcd.printf("One of the messages not sent");
bhakti08 0:40afd0d80b51 168 }
bhakti08 0:40afd0d80b51 169 send_info = DO_NOT_SEND;
bhakti08 0:40afd0d80b51 170 }
bhakti08 0:40afd0d80b51 171 min_set = min_temp.read() * 50; //scale the pot value from 0 to 1 -> 0 to 50
bhakti08 0:40afd0d80b51 172 max_set = max_temp.read() * 50;
bhakti08 0:40afd0d80b51 173 ctTime = time(NULL) - 25200; //Adjust time as per local time
bhakti08 0:40afd0d80b51 174 lcd.set_font((unsigned char*) Small_6); //set LCD font
bhakti08 0:40afd0d80b51 175 lcd.locate(1,1);
bhakti08 0:40afd0d80b51 176 lcd.printf("%s",ctime(&ctTime));
bhakti08 0:40afd0d80b51 177 lcd.locate(1,8);
bhakti08 0:40afd0d80b51 178
bhakti08 0:40afd0d80b51 179 /*If system is ON print current and set temperature*/
bhakti08 0:40afd0d80b51 180 /*Else print LCD OFF on LCD*/
bhakti08 0:40afd0d80b51 181
bhakti08 0:40afd0d80b51 182 if (status) {
bhakti08 0:40afd0d80b51 183 lcd.printf("Curr:%.2f",current.read());
bhakti08 0:40afd0d80b51 184 lcd.locate(1,16);
bhakti08 0:40afd0d80b51 185 lcd.printf("MAX:%0.2f, MIN:%0.2f",max_set,min_set);
bhakti08 0:40afd0d80b51 186 lcd.locate(1,24);
bhakti08 0:40afd0d80b51 187 switch (heat_cool) {
bhakti08 0:40afd0d80b51 188 case HEATER : lcd.printf("Heater ON ");
bhakti08 0:40afd0d80b51 189 break;
bhakti08 0:40afd0d80b51 190 case COOLER : lcd.printf("Cooler ON ");
bhakti08 0:40afd0d80b51 191 break;
bhakti08 0:40afd0d80b51 192 case No_HEAT_COOL : lcd.printf("Heat/Cool OFF");
bhakti08 0:40afd0d80b51 193 break;
bhakti08 0:40afd0d80b51 194 }
bhakti08 0:40afd0d80b51 195
bhakti08 0:40afd0d80b51 196 } else {
bhakti08 0:40afd0d80b51 197 lcd.locate(1,10);
bhakti08 0:40afd0d80b51 198 lcd.printf("System OFF");
bhakti08 0:40afd0d80b51 199 wait (0.1);
bhakti08 0:40afd0d80b51 200 }
bhakti08 0:40afd0d80b51 201
bhakti08 0:40afd0d80b51 202 /*If system is turned ON: Joystick is pushed towards edge of LCD
bhakti08 0:40afd0d80b51 203 OR movement is detected
bhakti08 0:40afd0d80b51 204 Turn System ON LED on: LED1 and Set the status variable to 1
bhakti08 0:40afd0d80b51 205 Else if system is turned OFF by user turn OFF the system status LED
bhakti08 0:40afd0d80b51 206 and the LED that is connected to the relay*/
bhakti08 0:40afd0d80b51 207
bhakti08 0:40afd0d80b51 208 if (heat_on == 0x2 || !no_move)
bhakti08 0:40afd0d80b51 209 {
bhakti08 0:40afd0d80b51 210 thermostat = 1;
bhakti08 0:40afd0d80b51 211 status = 1;
bhakti08 0:40afd0d80b51 212 } else if (heat_on == 0x1 || no_move) {
bhakti08 0:40afd0d80b51 213 lcd.cls();
bhakti08 0:40afd0d80b51 214 thermostat = 0;
bhakti08 0:40afd0d80b51 215 heater = 0;
bhakti08 0:40afd0d80b51 216 status = 0;
bhakti08 0:40afd0d80b51 217 }
bhakti08 0:40afd0d80b51 218
bhakti08 0:40afd0d80b51 219 //Comparison logic and turn Heater/Cooler ON/OFF
bhakti08 0:40afd0d80b51 220 if ((min_set > (current.read()+ hys)) && thermostat == 1) {
bhakti08 0:40afd0d80b51 221 heater = 1;
bhakti08 0:40afd0d80b51 222 cooler = 0;
bhakti08 0:40afd0d80b51 223 status = 1;
bhakti08 0:40afd0d80b51 224 heat_cool = HEATER;
bhakti08 0:40afd0d80b51 225 }
bhakti08 0:40afd0d80b51 226 else if ((max_set < (current.read()-hys)) && thermostat == 1) {
bhakti08 0:40afd0d80b51 227 cooler = 1;
bhakti08 0:40afd0d80b51 228 heater = 0;
bhakti08 0:40afd0d80b51 229 status = 1;
bhakti08 0:40afd0d80b51 230 heat_cool = COOLER;
bhakti08 0:40afd0d80b51 231 }
bhakti08 0:40afd0d80b51 232 else if (!thermostat) {
bhakti08 0:40afd0d80b51 233 heater = 0;
bhakti08 0:40afd0d80b51 234 cooler = 0;
bhakti08 0:40afd0d80b51 235 status = 0;
bhakti08 0:40afd0d80b51 236 }
bhakti08 0:40afd0d80b51 237 else {
bhakti08 0:40afd0d80b51 238 heater = 0;
bhakti08 0:40afd0d80b51 239 cooler = 0;
bhakti08 0:40afd0d80b51 240 status = 1;
bhakti08 0:40afd0d80b51 241 heat_cool = No_HEAT_COOL;
bhakti08 0:40afd0d80b51 242 }
bhakti08 0:40afd0d80b51 243
bhakti08 0:40afd0d80b51 244 }
bhakti08 0:40afd0d80b51 245 }