Under construction...

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

Committer:
thomas_sullivan
Date:
Mon Jun 02 19:11:38 2014 +0000
Revision:
0:e9a3d64e5bdd
Not working yet.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
thomas_sullivan 0:e9a3d64e5bdd 1 //IOT Class, HW7 Program 1. June 2, 2014. Tom Sullivan
thomas_sullivan 0:e9a3d64e5bdd 2
thomas_sullivan 0:e9a3d64e5bdd 3 #include "mbed.h"
thomas_sullivan 0:e9a3d64e5bdd 4 #include "LM75B.h"
thomas_sullivan 0:e9a3d64e5bdd 5 #include "C12832_lcd.h"
thomas_sullivan 0:e9a3d64e5bdd 6 #include "EthernetInterface.h"
thomas_sullivan 0:e9a3d64e5bdd 7 #include "NTPClient.h"
thomas_sullivan 0:e9a3d64e5bdd 8 #include "MMA7660.h"
thomas_sullivan 0:e9a3d64e5bdd 9 #include "Websocket.h"
thomas_sullivan 0:e9a3d64e5bdd 10 #include "xively.h"
thomas_sullivan 0:e9a3d64e5bdd 11 #include "xi_err.h"
thomas_sullivan 0:e9a3d64e5bdd 12 #include "xi_printf.h"
thomas_sullivan 0:e9a3d64e5bdd 13 #include <stdarg.h>
thomas_sullivan 0:e9a3d64e5bdd 14 #include <stdio.h>
thomas_sullivan 0:e9a3d64e5bdd 15
thomas_sullivan 0:e9a3d64e5bdd 16
thomas_sullivan 0:e9a3d64e5bdd 17 #define XI_FEED_ID 442300006 // set Xively Feed ID (numerical, no quoutes
thomas_sullivan 0:e9a3d64e5bdd 18 #define XI_API_KEY "FvameuMiutLFm5O135FCYEQn6okK8gijbsjPXTcSYARgkCYv" // set Xively API key (double-quoted string)
thomas_sullivan 0:e9a3d64e5bdd 19
thomas_sullivan 0:e9a3d64e5bdd 20 C12832_LCD lcd;
thomas_sullivan 0:e9a3d64e5bdd 21 DigitalOut led1(LED1);
thomas_sullivan 0:e9a3d64e5bdd 22 MMA7660 MMA(p28, p27);
thomas_sullivan 0:e9a3d64e5bdd 23 AnalogIn pot20(p20);
thomas_sullivan 0:e9a3d64e5bdd 24 AnalogIn pot19(p19);
thomas_sullivan 0:e9a3d64e5bdd 25 BusIn joy(p15,p12,p13,p16); //DigitalIn joyUp(p15), joyDown(p12), joyLeft(p13), joyRight(p16);
thomas_sullivan 0:e9a3d64e5bdd 26
thomas_sullivan 0:e9a3d64e5bdd 27 Ticker myTicker1;
thomas_sullivan 0:e9a3d64e5bdd 28 EthernetInterface eth;
thomas_sullivan 0:e9a3d64e5bdd 29 NTPClient ntp;
thomas_sullivan 0:e9a3d64e5bdd 30 time_t currentTime;
thomas_sullivan 0:e9a3d64e5bdd 31 char dataOut[128];
thomas_sullivan 0:e9a3d64e5bdd 32
thomas_sullivan 0:e9a3d64e5bdd 33 //Temperature variables
thomas_sullivan 0:e9a3d64e5bdd 34 LM75B tmp(p28,p27);
thomas_sullivan 0:e9a3d64e5bdd 35 float tempNow, tempHI=80,tempLO=60;
thomas_sullivan 0:e9a3d64e5bdd 36 float coolHyst = 1, heatHyst = 1;
thomas_sullivan 0:e9a3d64e5bdd 37 int Pressing = 0;
thomas_sullivan 0:e9a3d64e5bdd 38 int heatOn = 0, coolOn = 0; //disabled = -1, enabled/Off = 0, enabled/On = 1
thomas_sullivan 0:e9a3d64e5bdd 39 int heatControl;
thomas_sullivan 0:e9a3d64e5bdd 40
thomas_sullivan 0:e9a3d64e5bdd 41 //set flag that indicates it is time to output data to the web socket
thomas_sullivan 0:e9a3d64e5bdd 42 void sendData() {
thomas_sullivan 0:e9a3d64e5bdd 43 led1 = 1; //!led1;
thomas_sullivan 0:e9a3d64e5bdd 44 }
thomas_sullivan 0:e9a3d64e5bdd 45
thomas_sullivan 0:e9a3d64e5bdd 46 void mbed_printf( const char* fmt, ... )
thomas_sullivan 0:e9a3d64e5bdd 47 {
thomas_sullivan 0:e9a3d64e5bdd 48 char buffer[ 64 ];
thomas_sullivan 0:e9a3d64e5bdd 49
thomas_sullivan 0:e9a3d64e5bdd 50 va_list ap;
thomas_sullivan 0:e9a3d64e5bdd 51 va_start( ap, fmt );
thomas_sullivan 0:e9a3d64e5bdd 52 vsnprintf( buffer, 64, fmt, ap );
thomas_sullivan 0:e9a3d64e5bdd 53 va_end( ap );
thomas_sullivan 0:e9a3d64e5bdd 54
thomas_sullivan 0:e9a3d64e5bdd 55 printf("%s \n\r",buffer );
thomas_sullivan 0:e9a3d64e5bdd 56 }
thomas_sullivan 0:e9a3d64e5bdd 57
thomas_sullivan 0:e9a3d64e5bdd 58 int main()
thomas_sullivan 0:e9a3d64e5bdd 59 {
thomas_sullivan 0:e9a3d64e5bdd 60 printf("\n\r-----Starting HW7-1 Thermostat Heat/Cool-----\n\r");
thomas_sullivan 0:e9a3d64e5bdd 61 //Connect to ethernet. Use DHCP. **********************
thomas_sullivan 0:e9a3d64e5bdd 62 eth.init();
thomas_sullivan 0:e9a3d64e5bdd 63 eth.connect();
thomas_sullivan 0:e9a3d64e5bdd 64
thomas_sullivan 0:e9a3d64e5bdd 65 //Get time from NTP server on internet ************************
thomas_sullivan 0:e9a3d64e5bdd 66 printf("Initializing time...\r\n");
thomas_sullivan 0:e9a3d64e5bdd 67 if (ntp.setTime("0.pool.ntp.org") == 0) //connect to ntp server
thomas_sullivan 0:e9a3d64e5bdd 68 {
thomas_sullivan 0:e9a3d64e5bdd 69 set_time(time(NULL) - 7*60*60); //correct current time to Pacific Standard Time
thomas_sullivan 0:e9a3d64e5bdd 70 currentTime = time(NULL); //read corrected time from the system RTC
thomas_sullivan 0:e9a3d64e5bdd 71 printf("Time is set to (PST): %s\r\n", ctime(&currentTime));
thomas_sullivan 0:e9a3d64e5bdd 72 }
thomas_sullivan 0:e9a3d64e5bdd 73 else
thomas_sullivan 0:e9a3d64e5bdd 74 {
thomas_sullivan 0:e9a3d64e5bdd 75 printf("ntp.setTime return not zero");
thomas_sullivan 0:e9a3d64e5bdd 76 printf("Error\r\n");
thomas_sullivan 0:e9a3d64e5bdd 77 }
thomas_sullivan 0:e9a3d64e5bdd 78
thomas_sullivan 0:e9a3d64e5bdd 79 //Connect to mbed websocket server
thomas_sullivan 0:e9a3d64e5bdd 80 printf("Connecting to mbed websocket server channel 445\n\r");
thomas_sullivan 0:e9a3d64e5bdd 81 Websocket ws("ws://sockets.mbed.org/ws/445/rw");
thomas_sullivan 0:e9a3d64e5bdd 82 ws.connect();
thomas_sullivan 0:e9a3d64e5bdd 83 printf("Done connecting\n\r");
thomas_sullivan 0:e9a3d64e5bdd 84
thomas_sullivan 0:e9a3d64e5bdd 85 xi_feed_t feed;
thomas_sullivan 0:e9a3d64e5bdd 86 memset( &feed, NULL, sizeof( xi_feed_t ) );
thomas_sullivan 0:e9a3d64e5bdd 87
thomas_sullivan 0:e9a3d64e5bdd 88 feed.feed_id = XI_FEED_ID;
thomas_sullivan 0:e9a3d64e5bdd 89 feed.datastream_count = 5;
thomas_sullivan 0:e9a3d64e5bdd 90
thomas_sullivan 0:e9a3d64e5bdd 91 feed.datastreams[0].datapoint_count = 1;
thomas_sullivan 0:e9a3d64e5bdd 92 xi_datastream_t* temperature_datastream = &feed.datastreams[0];
thomas_sullivan 0:e9a3d64e5bdd 93 strcpy( temperature_datastream->datastream_id, "temperature" );
thomas_sullivan 0:e9a3d64e5bdd 94 xi_datapoint_t* current_temperature = &temperature_datastream->datapoints[0];
thomas_sullivan 0:e9a3d64e5bdd 95
thomas_sullivan 0:e9a3d64e5bdd 96 feed.datastreams[1].datapoint_count = 1;
thomas_sullivan 0:e9a3d64e5bdd 97 xi_datastream_t* accelx_datastream = &feed.datastreams[1];
thomas_sullivan 0:e9a3d64e5bdd 98 strcpy( accelx_datastream->datastream_id, "accel_x" );
thomas_sullivan 0:e9a3d64e5bdd 99 xi_datapoint_t* current_accelx = &accelx_datastream->datapoints[0];
thomas_sullivan 0:e9a3d64e5bdd 100
thomas_sullivan 0:e9a3d64e5bdd 101 feed.datastreams[2].datapoint_count = 1;
thomas_sullivan 0:e9a3d64e5bdd 102 xi_datastream_t* accely_datastream = &feed.datastreams[2];
thomas_sullivan 0:e9a3d64e5bdd 103 strcpy( accely_datastream->datastream_id, "accel_y" );
thomas_sullivan 0:e9a3d64e5bdd 104 xi_datapoint_t* current_accely = &accely_datastream->datapoints[0];
thomas_sullivan 0:e9a3d64e5bdd 105
thomas_sullivan 0:e9a3d64e5bdd 106 feed.datastreams[3].datapoint_count = 1;
thomas_sullivan 0:e9a3d64e5bdd 107 xi_datastream_t* accelz_datastream = &feed.datastreams[3];
thomas_sullivan 0:e9a3d64e5bdd 108 strcpy( accelz_datastream->datastream_id, "accel_z" );
thomas_sullivan 0:e9a3d64e5bdd 109 xi_datapoint_t* current_accelz = &accelz_datastream->datapoints[0];
thomas_sullivan 0:e9a3d64e5bdd 110
thomas_sullivan 0:e9a3d64e5bdd 111 feed.datastreams[4].datapoint_count = 1;
thomas_sullivan 0:e9a3d64e5bdd 112 xi_datastream_t* heatcontrol_datastream = &feed.datastreams[4];
thomas_sullivan 0:e9a3d64e5bdd 113 strcpy(heatcontrol_datastream->datastream_id, "HeatControl" );
thomas_sullivan 0:e9a3d64e5bdd 114 xi_datapoint_t* current_heatcontrol = &heatcontrol_datastream->datapoints[0];
thomas_sullivan 0:e9a3d64e5bdd 115 // create the cosm library context
thomas_sullivan 0:e9a3d64e5bdd 116 xi_context_t* xi_context
thomas_sullivan 0:e9a3d64e5bdd 117 = xi_create_context( XI_HTTP, XI_API_KEY, feed.feed_id );
thomas_sullivan 0:e9a3d64e5bdd 118
thomas_sullivan 0:e9a3d64e5bdd 119 // check if everything works
thomas_sullivan 0:e9a3d64e5bdd 120 if( xi_context == NULL ) {return -1;}
thomas_sullivan 0:e9a3d64e5bdd 121
thomas_sullivan 0:e9a3d64e5bdd 122 printf("feed:%d datastreams:[%s,%s,%s,%s]\n\r", feed.feed_id,
thomas_sullivan 0:e9a3d64e5bdd 123 accelx_datastream->datastream_id,
thomas_sullivan 0:e9a3d64e5bdd 124 accely_datastream->datastream_id,
thomas_sullivan 0:e9a3d64e5bdd 125 accelz_datastream->datastream_id,
thomas_sullivan 0:e9a3d64e5bdd 126 heatcontrol_datastream->datastream_id);
thomas_sullivan 0:e9a3d64e5bdd 127
thomas_sullivan 0:e9a3d64e5bdd 128 //Attach ticker with 10 second timing
thomas_sullivan 0:e9a3d64e5bdd 129 printf("Setting ticker\n\r");
thomas_sullivan 0:e9a3d64e5bdd 130 myTicker1.attach(&sendData, 10); //10*60
thomas_sullivan 0:e9a3d64e5bdd 131
thomas_sullivan 0:e9a3d64e5bdd 132 while(1) {
thomas_sullivan 0:e9a3d64e5bdd 133 //Get temp and Hi/Lo setting
thomas_sullivan 0:e9a3d64e5bdd 134 tempNow = 32+(9/5)*tmp.temp();
thomas_sullivan 0:e9a3d64e5bdd 135 tempHI = 50+40*pot19.read();
thomas_sullivan 0:e9a3d64e5bdd 136 tempLO = 40+40*pot20.read();
thomas_sullivan 0:e9a3d64e5bdd 137
thomas_sullivan 0:e9a3d64e5bdd 138 //Use joystick to enable and disable heater and cooler
thomas_sullivan 0:e9a3d64e5bdd 139 //Cooler: up is enable, down is disable
thomas_sullivan 0:e9a3d64e5bdd 140 //Heater: left is enable, right is disable
thomas_sullivan 0:e9a3d64e5bdd 141 if (joy == 0x0) { //joystick not being used currently
thomas_sullivan 0:e9a3d64e5bdd 142 Pressing = 0; //release memory of being pressed
thomas_sullivan 0:e9a3d64e5bdd 143 } else if (Pressing == 0) { //if joystick is being pressed (and this is the start of the press)
thomas_sullivan 0:e9a3d64e5bdd 144 Pressing = 1; //set memory of being pressed so next cycle through doesn't repeat actions
thomas_sullivan 0:e9a3d64e5bdd 145 //process joystick press
thomas_sullivan 0:e9a3d64e5bdd 146 switch (joy) { //which button?
thomas_sullivan 0:e9a3d64e5bdd 147 case 0x1: //up
thomas_sullivan 0:e9a3d64e5bdd 148 if (coolOn < 0) { //if cooler is disabled, enable it
thomas_sullivan 0:e9a3d64e5bdd 149 coolOn = 0;
thomas_sullivan 0:e9a3d64e5bdd 150 }
thomas_sullivan 0:e9a3d64e5bdd 151 break;
thomas_sullivan 0:e9a3d64e5bdd 152 case 0x2: //down
thomas_sullivan 0:e9a3d64e5bdd 153 coolOn = -1;
thomas_sullivan 0:e9a3d64e5bdd 154 break;
thomas_sullivan 0:e9a3d64e5bdd 155 case 0x4: //left
thomas_sullivan 0:e9a3d64e5bdd 156 if (heatOn < 0) { //if heat is disabled, enable it
thomas_sullivan 0:e9a3d64e5bdd 157 heatOn = 0;
thomas_sullivan 0:e9a3d64e5bdd 158 }
thomas_sullivan 0:e9a3d64e5bdd 159 break;
thomas_sullivan 0:e9a3d64e5bdd 160 case 0x8: //right
thomas_sullivan 0:e9a3d64e5bdd 161 heatOn = -1; //disable heat
thomas_sullivan 0:e9a3d64e5bdd 162 break;
thomas_sullivan 0:e9a3d64e5bdd 163 }
thomas_sullivan 0:e9a3d64e5bdd 164 };
thomas_sullivan 0:e9a3d64e5bdd 165
thomas_sullivan 0:e9a3d64e5bdd 166 //Turn on heat if temperature too low
thomas_sullivan 0:e9a3d64e5bdd 167 //Turn on cooler if temperature too high
thomas_sullivan 0:e9a3d64e5bdd 168 if (heatOn >= 0) { //if heat enabled
thomas_sullivan 0:e9a3d64e5bdd 169 if (tempNow < tempLO+heatHyst) {
thomas_sullivan 0:e9a3d64e5bdd 170 heatOn = 1;
thomas_sullivan 0:e9a3d64e5bdd 171 heatHyst = 1;//give offset so that heater will stay on 1 degree higher than target
thomas_sullivan 0:e9a3d64e5bdd 172 }
thomas_sullivan 0:e9a3d64e5bdd 173 else {
thomas_sullivan 0:e9a3d64e5bdd 174 heatOn = 0;
thomas_sullivan 0:e9a3d64e5bdd 175 heatHyst = -1; //give offset so that heater will stay off 1 degree lower than target
thomas_sullivan 0:e9a3d64e5bdd 176 }
thomas_sullivan 0:e9a3d64e5bdd 177 }
thomas_sullivan 0:e9a3d64e5bdd 178 if (coolOn >= 0) { //if cooler enabled
thomas_sullivan 0:e9a3d64e5bdd 179 if (tempNow > tempHI+coolHyst) {
thomas_sullivan 0:e9a3d64e5bdd 180 coolOn = 1;
thomas_sullivan 0:e9a3d64e5bdd 181 coolHyst = -1;//give offset so that cooler will stay on 1 degree lower than target
thomas_sullivan 0:e9a3d64e5bdd 182 }
thomas_sullivan 0:e9a3d64e5bdd 183 else {
thomas_sullivan 0:e9a3d64e5bdd 184 coolOn = 0;
thomas_sullivan 0:e9a3d64e5bdd 185 coolHyst = 1; //give offset so that cooler will stay off a bit longer
thomas_sullivan 0:e9a3d64e5bdd 186 }
thomas_sullivan 0:e9a3d64e5bdd 187 }
thomas_sullivan 0:e9a3d64e5bdd 188
thomas_sullivan 0:e9a3d64e5bdd 189 //Print information to LCD
thomas_sullivan 0:e9a3d64e5bdd 190 lcd.cls();
thomas_sullivan 0:e9a3d64e5bdd 191 lcd.locate(0,3);
thomas_sullivan 0:e9a3d64e5bdd 192 lcd.printf("Temp: %.1f, Hi/LO: %.1f/%.1f\n",tempNow,tempHI,tempLO);
thomas_sullivan 0:e9a3d64e5bdd 193 lcd.printf("%s", ctime(&currentTime));
thomas_sullivan 0:e9a3d64e5bdd 194 lcd.printf("heatOn: %d, coolOn: %d",heatOn,coolOn);
thomas_sullivan 0:e9a3d64e5bdd 195
thomas_sullivan 0:e9a3d64e5bdd 196 //If the time is right, send data to the websocket server and Xively
thomas_sullivan 0:e9a3d64e5bdd 197 if (led1) {
thomas_sullivan 0:e9a3d64e5bdd 198 printf("Sending message\n\r");
thomas_sullivan 0:e9a3d64e5bdd 199 xi_set_value_f32(current_temperature, tempNow);
thomas_sullivan 0:e9a3d64e5bdd 200 xi_set_value_f32(current_accelx, MMA.x());
thomas_sullivan 0:e9a3d64e5bdd 201 xi_set_value_f32(current_accely, MMA.y());
thomas_sullivan 0:e9a3d64e5bdd 202 xi_set_value_f32(current_accelz, MMA.z());
thomas_sullivan 0:e9a3d64e5bdd 203
thomas_sullivan 0:e9a3d64e5bdd 204 //current_led = &led_datastream->datapoints[0];
thomas_sullivan 0:e9a3d64e5bdd 205 //int led_value = current_led->value.i32_value;
thomas_sullivan 0:e9a3d64e5bdd 206 //mbed_printf("%d",led_value);
thomas_sullivan 0:e9a3d64e5bdd 207 //current_heatcontrol = &heatcontrol_datastream->datapoints[0];
thomas_sullivan 0:e9a3d64e5bdd 208 int heatControl = current_heatcontrol->i32_value;
thomas_sullivan 0:e9a3d64e5bdd 209
thomas_sullivan 0:e9a3d64e5bdd 210 xi_feed_update(xi_context, &feed);
thomas_sullivan 0:e9a3d64e5bdd 211 printf("xi_feed updated.\n\r");
thomas_sullivan 0:e9a3d64e5bdd 212 xi_datastream_get(xi_context, feed.feed_id, heatcontrol_datastream->datastream_id, heatcontrol_datastream->datapoints);
thomas_sullivan 0:e9a3d64e5bdd 213 // heatControl = heatcontrol_datastream->datapoints[0];//current_heatcontrol.value;
thomas_sullivan 0:e9a3d64e5bdd 214 mbed_printf("HeatControl: %d...\n",heatcontrol_datastream->datapoints[0]);
thomas_sullivan 0:e9a3d64e5bdd 215 if (heatControl == -1) {
thomas_sullivan 0:e9a3d64e5bdd 216 heatOn = -1;
thomas_sullivan 0:e9a3d64e5bdd 217 }
thomas_sullivan 0:e9a3d64e5bdd 218 else if (heatControl == 1) {
thomas_sullivan 0:e9a3d64e5bdd 219 coolOn = -1;
thomas_sullivan 0:e9a3d64e5bdd 220 }
thomas_sullivan 0:e9a3d64e5bdd 221
thomas_sullivan 0:e9a3d64e5bdd 222 sprintf(dataOut,"{\"Temp\":%.1f,\"X\":%.1f,\"Y\":%.1f,\"Z\":%.1f}",tempNow,MMA.x(),MMA.y(),MMA.z());
thomas_sullivan 0:e9a3d64e5bdd 223 printf("%s\n\r",dataOut);
thomas_sullivan 0:e9a3d64e5bdd 224 ws.send(dataOut);// %d",heatOn);
thomas_sullivan 0:e9a3d64e5bdd 225 led1 = 0;
thomas_sullivan 0:e9a3d64e5bdd 226 }
thomas_sullivan 0:e9a3d64e5bdd 227 wait(0.1);
thomas_sullivan 0:e9a3d64e5bdd 228 }
thomas_sullivan 0:e9a3d64e5bdd 229 }