Homework_5_IOT
Dependencies: C12832_lcd EthernetInterface LCD_fonts LM75B MMA7660 NTPClient SimpleSMTPClient WebSocketClient mbed-rtos mbed
main.cpp@0:40afd0d80b51, 2014-05-20 (annotated)
- Committer:
- bhakti08
- Date:
- Tue May 20 06:18:16 2014 +0000
- Revision:
- 0:40afd0d80b51
Websockets
Who changed what in which revision?
User | Revision | Line number | New 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 | } |