Under construction...

Dependencies:   C12832_lcd EthernetInterface LM75B MMA7660 WebSocketClient mbed-libxively-6eca970 mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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(&currentTime));
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(&currentTime));
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 }