Under construction...
Dependencies: C12832_lcd EthernetInterface LM75B MMA7660 WebSocketClient mbed-libxively-6eca970 mbed-rtos mbed
main.cpp
00001 //IOT Class, HW7 Program 1. June 2, 2014. Tom Sullivan 00002 00003 #include "mbed.h" 00004 #include "LM75B.h" 00005 #include "C12832_lcd.h" 00006 #include "EthernetInterface.h" 00007 #include "NTPClient.h" 00008 #include "MMA7660.h" 00009 #include "Websocket.h" 00010 #include "xively.h" 00011 #include "xi_err.h" 00012 #include "xi_printf.h" 00013 #include <stdarg.h> 00014 #include <stdio.h> 00015 00016 00017 #define XI_FEED_ID 442300006 // set Xively Feed ID (numerical, no quoutes 00018 #define XI_API_KEY "FvameuMiutLFm5O135FCYEQn6okK8gijbsjPXTcSYARgkCYv" // set Xively API key (double-quoted string) 00019 00020 C12832_LCD lcd; 00021 DigitalOut led1(LED1); 00022 MMA7660 MMA(p28, p27); 00023 AnalogIn pot20(p20); 00024 AnalogIn pot19(p19); 00025 BusIn joy(p15,p12,p13,p16); //DigitalIn joyUp(p15), joyDown(p12), joyLeft(p13), joyRight(p16); 00026 00027 Ticker myTicker1; 00028 EthernetInterface eth; 00029 NTPClient ntp; 00030 time_t currentTime; 00031 char dataOut[128]; 00032 00033 //Temperature variables 00034 LM75B tmp(p28,p27); 00035 float tempNow, tempHI=80,tempLO=60; 00036 float coolHyst = 1, heatHyst = 1; 00037 int Pressing = 0; 00038 int heatOn = 0, coolOn = 0; //disabled = -1, enabled/Off = 0, enabled/On = 1 00039 int heatControl; 00040 00041 //set flag that indicates it is time to output data to the web socket 00042 void sendData() { 00043 led1 = 1; //!led1; 00044 } 00045 00046 void mbed_printf( const char* fmt, ... ) 00047 { 00048 char buffer[ 64 ]; 00049 00050 va_list ap; 00051 va_start( ap, fmt ); 00052 vsnprintf( buffer, 64, fmt, ap ); 00053 va_end( ap ); 00054 00055 printf("%s \n\r",buffer ); 00056 } 00057 00058 int main() 00059 { 00060 printf("\n\r-----Starting HW7-1 Thermostat Heat/Cool-----\n\r"); 00061 //Connect to ethernet. Use DHCP. ********************** 00062 eth.init(); 00063 eth.connect(); 00064 00065 //Get time from NTP server on internet ************************ 00066 printf("Initializing time...\r\n"); 00067 if (ntp.setTime("0.pool.ntp.org") == 0) //connect to ntp server 00068 { 00069 set_time(time(NULL) - 7*60*60); //correct current time to Pacific Standard Time 00070 currentTime = time(NULL); //read corrected time from the system RTC 00071 printf("Time is set to (PST): %s\r\n", ctime(¤tTime)); 00072 } 00073 else 00074 { 00075 printf("ntp.setTime return not zero"); 00076 printf("Error\r\n"); 00077 } 00078 00079 //Connect to mbed websocket server 00080 printf("Connecting to mbed websocket server channel 445\n\r"); 00081 Websocket ws("ws://sockets.mbed.org/ws/445/rw"); 00082 ws.connect(); 00083 printf("Done connecting\n\r"); 00084 00085 xi_feed_t feed; 00086 memset( &feed, NULL, sizeof( xi_feed_t ) ); 00087 00088 feed.feed_id = XI_FEED_ID; 00089 feed.datastream_count = 5; 00090 00091 feed.datastreams[0].datapoint_count = 1; 00092 xi_datastream_t* temperature_datastream = &feed.datastreams[0]; 00093 strcpy( temperature_datastream->datastream_id, "temperature" ); 00094 xi_datapoint_t* current_temperature = &temperature_datastream->datapoints[0]; 00095 00096 feed.datastreams[1].datapoint_count = 1; 00097 xi_datastream_t* accelx_datastream = &feed.datastreams[1]; 00098 strcpy( accelx_datastream->datastream_id, "accel_x" ); 00099 xi_datapoint_t* current_accelx = &accelx_datastream->datapoints[0]; 00100 00101 feed.datastreams[2].datapoint_count = 1; 00102 xi_datastream_t* accely_datastream = &feed.datastreams[2]; 00103 strcpy( accely_datastream->datastream_id, "accel_y" ); 00104 xi_datapoint_t* current_accely = &accely_datastream->datapoints[0]; 00105 00106 feed.datastreams[3].datapoint_count = 1; 00107 xi_datastream_t* accelz_datastream = &feed.datastreams[3]; 00108 strcpy( accelz_datastream->datastream_id, "accel_z" ); 00109 xi_datapoint_t* current_accelz = &accelz_datastream->datapoints[0]; 00110 00111 feed.datastreams[4].datapoint_count = 1; 00112 xi_datastream_t* heatcontrol_datastream = &feed.datastreams[4]; 00113 strcpy(heatcontrol_datastream->datastream_id, "HeatControl" ); 00114 xi_datapoint_t* current_heatcontrol = &heatcontrol_datastream->datapoints[0]; 00115 // create the cosm library context 00116 xi_context_t* xi_context 00117 = xi_create_context( XI_HTTP, XI_API_KEY, feed.feed_id ); 00118 00119 // check if everything works 00120 if( xi_context == NULL ) {return -1;} 00121 00122 printf("feed:%d datastreams:[%s,%s,%s,%s]\n\r", feed.feed_id, 00123 accelx_datastream->datastream_id, 00124 accely_datastream->datastream_id, 00125 accelz_datastream->datastream_id, 00126 heatcontrol_datastream->datastream_id); 00127 00128 //Attach ticker with 10 second timing 00129 printf("Setting ticker\n\r"); 00130 myTicker1.attach(&sendData, 10); //10*60 00131 00132 while(1) { 00133 //Get temp and Hi/Lo setting 00134 tempNow = 32+(9/5)*tmp.temp(); 00135 tempHI = 50+40*pot19.read(); 00136 tempLO = 40+40*pot20.read(); 00137 00138 //Use joystick to enable and disable heater and cooler 00139 //Cooler: up is enable, down is disable 00140 //Heater: left is enable, right is disable 00141 if (joy == 0x0) { //joystick not being used currently 00142 Pressing = 0; //release memory of being pressed 00143 } else if (Pressing == 0) { //if joystick is being pressed (and this is the start of the press) 00144 Pressing = 1; //set memory of being pressed so next cycle through doesn't repeat actions 00145 //process joystick press 00146 switch (joy) { //which button? 00147 case 0x1: //up 00148 if (coolOn < 0) { //if cooler is disabled, enable it 00149 coolOn = 0; 00150 } 00151 break; 00152 case 0x2: //down 00153 coolOn = -1; 00154 break; 00155 case 0x4: //left 00156 if (heatOn < 0) { //if heat is disabled, enable it 00157 heatOn = 0; 00158 } 00159 break; 00160 case 0x8: //right 00161 heatOn = -1; //disable heat 00162 break; 00163 } 00164 }; 00165 00166 //Turn on heat if temperature too low 00167 //Turn on cooler if temperature too high 00168 if (heatOn >= 0) { //if heat enabled 00169 if (tempNow < tempLO+heatHyst) { 00170 heatOn = 1; 00171 heatHyst = 1;//give offset so that heater will stay on 1 degree higher than target 00172 } 00173 else { 00174 heatOn = 0; 00175 heatHyst = -1; //give offset so that heater will stay off 1 degree lower than target 00176 } 00177 } 00178 if (coolOn >= 0) { //if cooler enabled 00179 if (tempNow > tempHI+coolHyst) { 00180 coolOn = 1; 00181 coolHyst = -1;//give offset so that cooler will stay on 1 degree lower than target 00182 } 00183 else { 00184 coolOn = 0; 00185 coolHyst = 1; //give offset so that cooler will stay off a bit longer 00186 } 00187 } 00188 00189 //Print information to LCD 00190 lcd.cls(); 00191 lcd.locate(0,3); 00192 lcd.printf("Temp: %.1f, Hi/LO: %.1f/%.1f\n",tempNow,tempHI,tempLO); 00193 lcd.printf("%s", ctime(¤tTime)); 00194 lcd.printf("heatOn: %d, coolOn: %d",heatOn,coolOn); 00195 00196 //If the time is right, send data to the websocket server and Xively 00197 if (led1) { 00198 printf("Sending message\n\r"); 00199 xi_set_value_f32(current_temperature, tempNow); 00200 xi_set_value_f32(current_accelx, MMA.x()); 00201 xi_set_value_f32(current_accely, MMA.y()); 00202 xi_set_value_f32(current_accelz, MMA.z()); 00203 00204 //current_led = &led_datastream->datapoints[0]; 00205 //int led_value = current_led->value.i32_value; 00206 //mbed_printf("%d",led_value); 00207 //current_heatcontrol = &heatcontrol_datastream->datapoints[0]; 00208 int heatControl = current_heatcontrol->i32_value; 00209 00210 xi_feed_update(xi_context, &feed); 00211 printf("xi_feed updated.\n\r"); 00212 xi_datastream_get(xi_context, feed.feed_id, heatcontrol_datastream->datastream_id, heatcontrol_datastream->datapoints); 00213 // heatControl = heatcontrol_datastream->datapoints[0];//current_heatcontrol.value; 00214 mbed_printf("HeatControl: %d...\n",heatcontrol_datastream->datapoints[0]); 00215 if (heatControl == -1) { 00216 heatOn = -1; 00217 } 00218 else if (heatControl == 1) { 00219 coolOn = -1; 00220 } 00221 00222 sprintf(dataOut,"{\"Temp\":%.1f,\"X\":%.1f,\"Y\":%.1f,\"Z\":%.1f}",tempNow,MMA.x(),MMA.y(),MMA.z()); 00223 printf("%s\n\r",dataOut); 00224 ws.send(dataOut);// %d",heatOn); 00225 led1 = 0; 00226 } 00227 wait(0.1); 00228 } 00229 }
Generated on Fri Jul 22 2022 17:45:28 by 1.7.2