Connections to Xively working; has 5 channels on Xively (axl_x, axl_y, axl_z, heater_status, temperature)

Dependencies:   C12832_lcd EthernetInterface LM75B MMA7660 NTPClient libxively mbed-rtos mbed

Committer:
wren301
Date:
Mon Jun 02 19:13:07 2014 +0000
Revision:
6:d5023e875887
Parent:
4:05986b9ea330
Actually HW7 :)  All connections to Xively operational as of last test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wren301 0:785d351db1ad 1 #include "mbed.h"
wren301 0:785d351db1ad 2 #include "EthernetInterface.h"
wren301 0:785d351db1ad 3 #include "NTPClient.h"
wren301 0:785d351db1ad 4 #include "C12832_lcd.h"
wren301 0:785d351db1ad 5 #include "LM75B.h"
wren301 0:785d351db1ad 6 #include "MMA7660.h"
wren301 6:d5023e875887 7 #define XI_FEED_ID 1000476735 // set Xively Feed ID (numerical, no quoutes)
wren301 6:d5023e875887 8 #define XI_API_KEY "ROxvAOZ6RznZjFPGufMNNn1LiMbYseCgEwF0qn1WAmcZPPY2" // set Xively API key (double-quoted string)
wren301 6:d5023e875887 9
wren301 6:d5023e875887 10 #include "app_board_io.h"
wren301 6:d5023e875887 11
wren301 6:d5023e875887 12 #include "xively.h"
wren301 6:d5023e875887 13 #include "xi_err.h"
wren301 0:785d351db1ad 14
wren301 0:785d351db1ad 15 #define PST_OFFSET 7*60*60
wren301 0:785d351db1ad 16
wren301 0:785d351db1ad 17 Ticker timer;
wren301 0:785d351db1ad 18 C12832_LCD lcd; //Graphics LCD
wren301 0:785d351db1ad 19 EthernetInterface eth; //Networking functions
wren301 0:785d351db1ad 20 NTPClient ntp; //NTP client
wren301 0:785d351db1ad 21 LM75B tmp(p28,p27);
wren301 2:cf992d90396e 22 float lowTemp = 74;
wren301 2:cf992d90396e 23 float highTemp = 86;
wren301 0:785d351db1ad 24 float temp;
wren301 0:785d351db1ad 25 int heaterOn = 0;
wren301 2:cf992d90396e 26 AnalogIn pot1(p20);
wren301 2:cf992d90396e 27 AnalogIn pot2(p19);
wren301 0:785d351db1ad 28 #define LOOP_DELAY_MS 100
wren301 0:785d351db1ad 29 //update time every 10 minutes
wren301 3:3a48ed10d6fe 30 #define UPDATE_TIME 60*1
wren301 6:d5023e875887 31 #define UPDATE_XIVELY 60*1
wren301 6:d5023e875887 32 MMA7660 axl(p28, p27);// accelerometer
wren301 3:3a48ed10d6fe 33 int updateTimeFromServer = 1;
wren301 1:0d467ac74808 34
wren301 6:d5023e875887 35 //Xively globals
wren301 6:d5023e875887 36 int update_xively = 1;
wren301 6:d5023e875887 37 xi_feed_t feed;
wren301 6:d5023e875887 38 xi_datapoint_t* current_temperature;
wren301 6:d5023e875887 39 xi_datapoint_t* current_x;
wren301 6:d5023e875887 40 xi_datapoint_t* current_y;
wren301 6:d5023e875887 41 xi_datapoint_t* current_z;
wren301 6:d5023e875887 42 xi_datapoint_t* current_heaterstatus;
wren301 6:d5023e875887 43 xi_datastream_t* heaterstatus_datastream;
wren301 6:d5023e875887 44 xi_context_t* xi_context;
wren301 6:d5023e875887 45
wren301 6:d5023e875887 46
wren301 6:d5023e875887 47 void setUpXively() {
wren301 6:d5023e875887 48 memset( &feed, NULL, sizeof( xi_feed_t ) );
wren301 6:d5023e875887 49
wren301 6:d5023e875887 50 feed.feed_id = XI_FEED_ID;
wren301 6:d5023e875887 51 feed.datastream_count = 5;
wren301 6:d5023e875887 52
wren301 6:d5023e875887 53 feed.datastreams[0].datapoint_count = 1;
wren301 6:d5023e875887 54 xi_datastream_t* temperature_datastream = &feed.datastreams[0];
wren301 6:d5023e875887 55 strcpy( temperature_datastream->datastream_id, "temperature" );
wren301 6:d5023e875887 56 current_temperature = &temperature_datastream->datapoints[0];
wren301 6:d5023e875887 57
wren301 6:d5023e875887 58 feed.datastreams[1].datapoint_count = 1;
wren301 6:d5023e875887 59 xi_datastream_t* axl_x_datastream = &feed.datastreams[1];
wren301 6:d5023e875887 60 strcpy( axl_x_datastream->datastream_id, "axl_x" );
wren301 6:d5023e875887 61 current_x = &axl_x_datastream->datapoints[0];
wren301 6:d5023e875887 62
wren301 6:d5023e875887 63 feed.datastreams[2].datapoint_count = 1;
wren301 6:d5023e875887 64 xi_datastream_t* axl_y_datastream = &feed.datastreams[2];
wren301 6:d5023e875887 65 strcpy( axl_y_datastream->datastream_id, "axl_y" );
wren301 6:d5023e875887 66 current_y = &axl_y_datastream->datapoints[0];
wren301 6:d5023e875887 67
wren301 6:d5023e875887 68 feed.datastreams[3].datapoint_count = 1;
wren301 6:d5023e875887 69 xi_datastream_t* axl_z_datastream = &feed.datastreams[3];
wren301 6:d5023e875887 70 strcpy( axl_z_datastream->datastream_id, "axl_z" );
wren301 6:d5023e875887 71 current_z = &axl_z_datastream->datapoints[0];
wren301 6:d5023e875887 72
wren301 6:d5023e875887 73 feed.datastreams[4].datapoint_count = 1;
wren301 6:d5023e875887 74 heaterstatus_datastream = &feed.datastreams[4];
wren301 6:d5023e875887 75 strcpy( heaterstatus_datastream->datastream_id, "heater_status" );
wren301 6:d5023e875887 76 current_heaterstatus = &heaterstatus_datastream->datapoints[0];
wren301 6:d5023e875887 77
wren301 6:d5023e875887 78 // create the cosm library context
wren301 6:d5023e875887 79 xi_context = xi_create_context( XI_HTTP, XI_API_KEY, feed.feed_id );
wren301 6:d5023e875887 80
wren301 6:d5023e875887 81 }
wren301 6:d5023e875887 82
wren301 3:3a48ed10d6fe 83 void connectToTheInternet()
wren301 3:3a48ed10d6fe 84 {
wren301 0:785d351db1ad 85 eth.init(); //Init and use DHCP
wren301 0:785d351db1ad 86 wait(2);
wren301 0:785d351db1ad 87 lcd.cls();
wren301 0:785d351db1ad 88 lcd.printf("Getting IP Address\r\n");
wren301 2:cf992d90396e 89 printf("\n\rGetting IP Address\r\n");
wren301 0:785d351db1ad 90 if(eth.connect(60000)!=0) {
wren301 0:785d351db1ad 91 lcd.printf("DHCP error - No IP");
wren301 0:785d351db1ad 92 wait(10);
wren301 0:785d351db1ad 93 } else {
wren301 0:785d351db1ad 94 lcd.printf("IP is %s\n", eth.getIPAddress());
wren301 0:785d351db1ad 95 printf("IP is %s\n", eth.getIPAddress());
wren301 0:785d351db1ad 96 wait(2);
wren301 0:785d351db1ad 97 }
wren301 0:785d351db1ad 98 lcd.cls();
wren301 0:785d351db1ad 99 }
wren301 0:785d351db1ad 100
wren301 3:3a48ed10d6fe 101 void updateTimeRoutine()
wren301 3:3a48ed10d6fe 102 {
wren301 1:0d467ac74808 103 if (ntp.setTime("0.pool.ntp.org") == 0) {
wren301 1:0d467ac74808 104 printf("Time updated!");
wren301 1:0d467ac74808 105 } else {
wren301 1:0d467ac74808 106 lcd.locate(0,0);
wren301 1:0d467ac74808 107 printf("Time update failed \n\r");
wren301 1:0d467ac74808 108 lcd.printf("Time update failed");
wren301 1:0d467ac74808 109 }
wren301 1:0d467ac74808 110 updateTimeFromServer = 0;
wren301 1:0d467ac74808 111 }
wren301 1:0d467ac74808 112
wren301 3:3a48ed10d6fe 113 void updateTime()
wren301 3:3a48ed10d6fe 114 {
wren301 0:785d351db1ad 115 updateTimeFromServer = 1;
wren301 0:785d351db1ad 116 }
wren301 0:785d351db1ad 117
wren301 6:d5023e875887 118 void updateXively() {
wren301 6:d5023e875887 119 update_xively = 1;
wren301 6:d5023e875887 120 }
wren301 6:d5023e875887 121
wren301 6:d5023e875887 122 void updateXivelyRoutine() {
wren301 6:d5023e875887 123 xi_set_value_f32( current_temperature, tmp.read() );
wren301 6:d5023e875887 124 xi_set_value_f32( current_x, axl.x() );
wren301 6:d5023e875887 125 xi_set_value_f32( current_y, axl.y() );
wren301 6:d5023e875887 126 xi_set_value_f32( current_z, axl.z() );
wren301 6:d5023e875887 127 update_xively = 0;
wren301 6:d5023e875887 128 printf( "update...\n" );
wren301 6:d5023e875887 129 xi_feed_update( xi_context, &feed );
wren301 6:d5023e875887 130
wren301 6:d5023e875887 131 //xi_response_t myInData;
wren301 6:d5023e875887 132 //myInData = xi_feed_get(xi_context, &feed);
wren301 6:d5023e875887 133 xi_datastream_get(xi_context, feed.feed_id, heaterstatus_datastream->datastream_id, heaterstatus_datastream->datapoints);
wren301 6:d5023e875887 134 printf( "\n\rHEATER STATUS: %d...\n",heaterstatus_datastream->datapoints[0]);
wren301 6:d5023e875887 135 current_heaterstatus = &heaterstatus_datastream->datapoints[0];
wren301 6:d5023e875887 136 int heatervalue = current_heaterstatus->value.i32_value;
wren301 6:d5023e875887 137 printf("HeaterStatus: %d", heatervalue);
wren301 6:d5023e875887 138 printf( "done...\n" );
wren301 3:3a48ed10d6fe 139 }
wren301 3:3a48ed10d6fe 140
wren301 2:cf992d90396e 141 //POT values are 0:1, will allow high and low temperatures
wren301 2:cf992d90396e 142 //lets you set temp between 50 and 100 degrees
wren301 3:3a48ed10d6fe 143 void updateTempsFromPots()
wren301 3:3a48ed10d6fe 144 {
wren301 2:cf992d90396e 145 float lowTempPot = pot2*50.0+50;
wren301 2:cf992d90396e 146 float highTempPot = pot1*50.0+50;
wren301 2:cf992d90396e 147 //round to the nearest whole number
wren301 2:cf992d90396e 148 lowTempPot = floor(lowTempPot+.5);
wren301 2:cf992d90396e 149 highTempPot = floor(highTempPot+.5);
wren301 2:cf992d90396e 150 //high temp must be at least 1 degree above low temp
wren301 3:3a48ed10d6fe 151 if (highTempPot <= lowTempPot) {
wren301 3:3a48ed10d6fe 152 highTempPot = lowTempPot +1;
wren301 3:3a48ed10d6fe 153 }
wren301 2:cf992d90396e 154 //Refresh the display if the temps have changed by more than a degree
wren301 2:cf992d90396e 155 if ((lowTemp != lowTempPot) || (highTemp != highTempPot)) {
wren301 2:cf992d90396e 156 lowTemp = lowTempPot;
wren301 2:cf992d90396e 157 highTemp = highTempPot;
wren301 2:cf992d90396e 158 lcd.locate(0,0);
wren301 2:cf992d90396e 159 lcd.printf("\n\r%.1f LOW: %.0f HIGH: %.0f", temp, lowTemp, highTemp);
wren301 2:cf992d90396e 160 printf("LOW: %.2f HIGH: %.2f\n\r", lowTemp, highTemp);
wren301 1:0d467ac74808 161 }
wren301 1:0d467ac74808 162 }
wren301 1:0d467ac74808 163
wren301 0:785d351db1ad 164 int main()
wren301 3:3a48ed10d6fe 165 {
wren301 3:3a48ed10d6fe 166 connectToTheInternet();
wren301 6:d5023e875887 167 setUpXively();
wren301 0:785d351db1ad 168 //Variable to hold the current minute so we only update the display when the minute changes
wren301 0:785d351db1ad 169 char currentMinute[2];
wren301 0:785d351db1ad 170 currentMinute[1] = 'a';
wren301 0:785d351db1ad 171 char minute[2];
wren301 3:3a48ed10d6fe 172
wren301 0:785d351db1ad 173 float currentTemp = -200;
wren301 3:3a48ed10d6fe 174 lcd.printf("Updating time...\r\n");
wren301 3:3a48ed10d6fe 175 printf("Updating time...\r\n");
wren301 0:785d351db1ad 176 if (ntp.setTime("0.pool.ntp.org") == 0) {
wren301 3:3a48ed10d6fe 177 printf("Set time successfully\r\n");
wren301 0:785d351db1ad 178 lcd.cls();
wren301 0:785d351db1ad 179 timer.attach(&updateTime, UPDATE_TIME);
wren301 6:d5023e875887 180 timer.attach(&updateXively, UPDATE_XIVELY);
wren301 0:785d351db1ad 181 lcd.printf("\n\r\n\rHEATER OFF");
wren301 3:3a48ed10d6fe 182
wren301 3:3a48ed10d6fe 183 while(1) {
wren301 0:785d351db1ad 184 if(updateTimeFromServer) {
wren301 3:3a48ed10d6fe 185 updateTimeRoutine();
wren301 3:3a48ed10d6fe 186 }
wren301 6:d5023e875887 187 if(update_xively){
wren301 6:d5023e875887 188 updateXivelyRoutine();
wren301 6:d5023e875887 189 }
wren301 2:cf992d90396e 190 //Sets temp from POTs
wren301 3:3a48ed10d6fe 191 updateTempsFromPots();
wren301 3:3a48ed10d6fe 192 //Fetch the time
wren301 1:0d467ac74808 193 time_t ctTime;
wren301 0:785d351db1ad 194 ctTime = time(NULL)- PST_OFFSET;
wren301 3:3a48ed10d6fe 195 char timeBuffer[32];
wren301 3:3a48ed10d6fe 196
wren301 0:785d351db1ad 197 //See if the minute has changed; set an update display flag if it has
wren301 3:3a48ed10d6fe 198 strftime(minute, 8, "%M", localtime(&ctTime));
wren301 3:3a48ed10d6fe 199 if ( (minute[1] != currentMinute[1]) ) {
wren301 0:785d351db1ad 200 //Formats the time for display
wren301 3:3a48ed10d6fe 201 strftime(timeBuffer, 32, "%a %b %d %I:%M%p\n\r", localtime(&ctTime));
wren301 0:785d351db1ad 202 printf("%s\r", timeBuffer);
wren301 0:785d351db1ad 203 lcd.locate(0,0);
wren301 0:785d351db1ad 204 lcd.printf("%s\r", timeBuffer);
wren301 0:785d351db1ad 205 currentMinute[1] = minute[1];
wren301 3:3a48ed10d6fe 206 }
wren301 3:3a48ed10d6fe 207
wren301 0:785d351db1ad 208 //Update the temperature display if the temperature, set temp has changed
wren301 3:3a48ed10d6fe 209 temp = tmp.read()*9.0/5.0 + 32.0;
wren301 3:3a48ed10d6fe 210
wren301 3:3a48ed10d6fe 211 //checks if the temperature (rounded to the nearest whole number) has changed
wren301 0:785d351db1ad 212 if (floor(temp+.5) != floor(currentTemp+.5)) {
wren301 2:cf992d90396e 213 printf("Temp change: %.1f F\n\r", temp);
wren301 0:785d351db1ad 214 currentTemp = temp;
wren301 0:785d351db1ad 215 lcd.locate(0,0);
wren301 4:05986b9ea330 216 //updates the temperature line of the display
wren301 2:cf992d90396e 217 lcd.printf("\n\r%.1f LOW: %.0f HIGH: %.0f", temp, lowTemp, highTemp);
wren301 3:3a48ed10d6fe 218 }
wren301 3:3a48ed10d6fe 219
wren301 3:3a48ed10d6fe 220 lcd.locate(0,0);
wren301 4:05986b9ea330 221
wren301 4:05986b9ea330 222 //Heater logic: turns off if it has gone over the high temp and is on,
wren301 4:05986b9ea330 223 //or if under the low temp and is off
wren301 2:cf992d90396e 224 if (heaterOn && (temp > highTemp) ) {
wren301 0:785d351db1ad 225 printf("Heater turned OFF\n\r");
wren301 3:3a48ed10d6fe 226 heaterOn = 0;
wren301 0:785d351db1ad 227 lcd.locate(0,0);
wren301 0:785d351db1ad 228 lcd.printf("\n\r\n\rHEATER OFF");
wren301 2:cf992d90396e 229 } else if (!heaterOn && (temp < lowTemp) ) {
wren301 0:785d351db1ad 230 printf("Heater turned ON\n\r");
wren301 0:785d351db1ad 231 heaterOn = 1;
wren301 0:785d351db1ad 232 lcd.locate(0,0);
wren301 0:785d351db1ad 233 lcd.printf("\n\r\n\rHEATER ON");
wren301 3:3a48ed10d6fe 234 }
wren301 3:3a48ed10d6fe 235 wait(LOOP_DELAY_MS*.001);
wren301 0:785d351db1ad 236 }
wren301 0:785d351db1ad 237 } else {
wren301 0:785d351db1ad 238 lcd.printf("NTP Error\r\n");
wren301 0:785d351db1ad 239 }
wren301 0:785d351db1ad 240 eth.disconnect();
wren301 0:785d351db1ad 241 }