mbed Weather Platform firmware http://mbed.org/users/okini3939/notebook/mbed-weather-platform-firmware/

Dependencies:   EthernetNetIf SDHCFileSystem I2CLEDDisp Agentbed NTPClient_NetServices mbed BMP085 HTTPClient ConfigFile I2CLCD

Committer:
okini3939
Date:
Fri Jun 03 15:38:22 2011 +0000
Revision:
19:69b77f9e0446
Parent:
18:9286e5010c14

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 18:9286e5010c14 1 #include "mbed.h"
okini3939 18:9286e5010c14 2 #include "ConfigFile.h"
okini3939 18:9286e5010c14 3 #include "SDHCFileSystem.h"
okini3939 18:9286e5010c14 4 #include "EthernetNetIf.h"
okini3939 18:9286e5010c14 5 #include "NTPClient.h"
okini3939 18:9286e5010c14 6 #include "HTTPClient.h"
okini3939 18:9286e5010c14 7 #include "weather.h"
okini3939 18:9286e5010c14 8
okini3939 18:9286e5010c14 9 /** @file
okini3939 18:9286e5010c14 10 * @brief mbed Weather Platform
okini3939 18:9286e5010c14 11 */
okini3939 18:9286e5010c14 12
okini3939 18:9286e5010c14 13 #define TIMEZONE 9
okini3939 18:9286e5010c14 14 //#define NONBLOCKING
okini3939 18:9286e5010c14 15
okini3939 18:9286e5010c14 16 #define STATION_URL "http://weather.sugakoubou.com/p"
okini3939 18:9286e5010c14 17 #define TWITTER_URL "http://api.supertweet.net/1/statuses/update.xml"
okini3939 18:9286e5010c14 18
okini3939 18:9286e5010c14 19
okini3939 18:9286e5010c14 20 void writefile (char *buf) {
okini3939 18:9286e5010c14 21 FILE *fp;
okini3939 18:9286e5010c14 22
okini3939 18:9286e5010c14 23 fp = fopen(filename, "a");
okini3939 18:9286e5010c14 24 if (fp) {
okini3939 18:9286e5010c14 25 fprintf(fp, buf);
okini3939 18:9286e5010c14 26 fclose(fp);
okini3939 18:9286e5010c14 27 } else {
okini3939 18:9286e5010c14 28 led2 = 0;
okini3939 18:9286e5010c14 29 conf.filetype = 0;
okini3939 18:9286e5010c14 30 }
okini3939 18:9286e5010c14 31 }
okini3939 18:9286e5010c14 32
okini3939 18:9286e5010c14 33 void weatherstations () {
okini3939 18:9286e5010c14 34 char post_data[200];
okini3939 18:9286e5010c14 35 HTTPResult ret;
okini3939 18:9286e5010c14 36 HTTPText postContent("application/x-www-form-urlencoded");
okini3939 18:9286e5010c14 37
okini3939 18:9286e5010c14 38 led_y = 0;
okini3939 18:9286e5010c14 39 strcpy(post_data, "fcd=");
okini3939 18:9286e5010c14 40 strcat(post_data, conf.stations_id);
okini3939 18:9286e5010c14 41 strcat(post_data, "&pin=");
okini3939 18:9286e5010c14 42 strcat(post_data, conf.stations_pin);
okini3939 18:9286e5010c14 43 sprintf(&post_data[strlen(post_data)], "&d0=%.2f&d1=%.2f&d2=%.2f&d3=%.2f&d4=%.2f&d5=%.2f&d6=%.2f&d7=%.2f&d8=%.2f&d9=%.2f",
okini3939 18:9286e5010c14 44 sensor.pres, sensor.temp, sensor.humi, sensor.anemo, sensor.vane, sensor.rain, sensor.light, sensor.uv, sensor.moist, sensor.temp2);
okini3939 18:9286e5010c14 45 postContent.puts(post_data);
okini3939 18:9286e5010c14 46
okini3939 18:9286e5010c14 47 #ifdef NONBLOCKING
okini3939 18:9286e5010c14 48 Net::poll();
okini3939 18:9286e5010c14 49 ret = clientP->post(STATION_URL, postContent, NULL, &cb_clientP);
okini3939 18:9286e5010c14 50 Net::poll();
okini3939 18:9286e5010c14 51 #else
okini3939 18:9286e5010c14 52 ret = clientP->post(STATION_URL, postContent, NULL);
okini3939 18:9286e5010c14 53 #endif
okini3939 18:9286e5010c14 54
okini3939 18:9286e5010c14 55 if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
okini3939 18:9286e5010c14 56 pc.printf("error: Weather Statuons %d\r\n", ret);
okini3939 18:9286e5010c14 57 }
okini3939 18:9286e5010c14 58 }
okini3939 18:9286e5010c14 59
okini3939 18:9286e5010c14 60 void pachube (char *buf) {
okini3939 18:9286e5010c14 61 char uri[100];
okini3939 18:9286e5010c14 62 HTTPResult ret;
okini3939 18:9286e5010c14 63 HTTPText csvContent("text/csv");
okini3939 18:9286e5010c14 64
okini3939 18:9286e5010c14 65 led_y = 0;
okini3939 18:9286e5010c14 66 clientP->setRequestHeader("X-PachubeApiKey", conf.pachube_apikey);
okini3939 18:9286e5010c14 67 csvContent.set(buf);
okini3939 18:9286e5010c14 68 strcpy(uri, "http://api.pachube.com/v1/feeds/");
okini3939 18:9286e5010c14 69 strcat(uri, conf.pachube_feedid);
okini3939 18:9286e5010c14 70 strcat(uri, ".csv?_method=put");
okini3939 18:9286e5010c14 71 #ifdef NONBLOCKING
okini3939 18:9286e5010c14 72 Net::poll();
okini3939 18:9286e5010c14 73 ret = clientP->post(uri, csvContent, NULL, &cb_clientP);
okini3939 18:9286e5010c14 74 Net::poll();
okini3939 18:9286e5010c14 75 #else
okini3939 18:9286e5010c14 76 ret = clientP->post(uri, csvContent, NULL);
okini3939 18:9286e5010c14 77 #endif
okini3939 18:9286e5010c14 78
okini3939 18:9286e5010c14 79 if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
okini3939 18:9286e5010c14 80 pc.printf("error: Pachube %d\r\n", ret);
okini3939 18:9286e5010c14 81 }
okini3939 18:9286e5010c14 82 }
okini3939 18:9286e5010c14 83
okini3939 18:9286e5010c14 84 void cb_clientP (HTTPResult status) {
okini3939 18:9286e5010c14 85 if (status != HTTP_OK) {
okini3939 18:9286e5010c14 86 pc.printf("Pachube failure (%d)\r\n", status);
okini3939 18:9286e5010c14 87 // pc.printf("Pachube failure (%d, %d)\r\n", status, clientP->getHTTPResponseCode());
okini3939 18:9286e5010c14 88 }
okini3939 18:9286e5010c14 89 }
okini3939 18:9286e5010c14 90
okini3939 18:9286e5010c14 91 char *fmtstr (char *fmt, char *buf, int len) {
okini3939 18:9286e5010c14 92 int i, j, flg;
okini3939 18:9286e5010c14 93 char c;
okini3939 18:9286e5010c14 94 float value;
okini3939 18:9286e5010c14 95 time_t sec = time(NULL);
okini3939 18:9286e5010c14 96 struct tm *tim = localtime(&sec);
okini3939 18:9286e5010c14 97
okini3939 18:9286e5010c14 98 j = 0;
okini3939 18:9286e5010c14 99 for (i = 0; i < strlen(fmt) && j < len; i ++) {
okini3939 18:9286e5010c14 100 c = fmt[i];
okini3939 18:9286e5010c14 101 if (c == '%') {
okini3939 18:9286e5010c14 102 flg = 0;
okini3939 18:9286e5010c14 103 i ++;
okini3939 18:9286e5010c14 104 c = fmt[i];
okini3939 18:9286e5010c14 105
okini3939 18:9286e5010c14 106 if (c == '.') {
okini3939 18:9286e5010c14 107 // float format
okini3939 18:9286e5010c14 108 if (fmt[i + 1] >= '0' && fmt[i + 1] <= '9') {
okini3939 18:9286e5010c14 109 flg = fmt[i + 1] - '0';
okini3939 18:9286e5010c14 110 i ++;
okini3939 18:9286e5010c14 111
okini3939 18:9286e5010c14 112 c = fmt[i + 1];
okini3939 18:9286e5010c14 113 i ++;
okini3939 18:9286e5010c14 114 }
okini3939 18:9286e5010c14 115 }
okini3939 18:9286e5010c14 116
okini3939 18:9286e5010c14 117 switch (c) {
okini3939 18:9286e5010c14 118 case 'P':
okini3939 18:9286e5010c14 119 value = sensor.pres;
okini3939 18:9286e5010c14 120 break;
okini3939 18:9286e5010c14 121 case 'T':
okini3939 18:9286e5010c14 122 value = sensor.temp;
okini3939 18:9286e5010c14 123 break;
okini3939 18:9286e5010c14 124 case 'H':
okini3939 18:9286e5010c14 125 value = sensor.humi;
okini3939 18:9286e5010c14 126 break;
okini3939 18:9286e5010c14 127 case 'A':
okini3939 18:9286e5010c14 128 value = sensor.anemo;
okini3939 18:9286e5010c14 129 break;
okini3939 18:9286e5010c14 130 case 'V':
okini3939 18:9286e5010c14 131 value = sensor.vane;
okini3939 18:9286e5010c14 132 break;
okini3939 18:9286e5010c14 133 case 'R':
okini3939 18:9286e5010c14 134 value = sensor.rain;
okini3939 18:9286e5010c14 135 break;
okini3939 18:9286e5010c14 136 case 'L':
okini3939 18:9286e5010c14 137 value = sensor.light;
okini3939 18:9286e5010c14 138 break;
okini3939 18:9286e5010c14 139 case 'U':
okini3939 18:9286e5010c14 140 value = sensor.uv;
okini3939 18:9286e5010c14 141 break;
okini3939 18:9286e5010c14 142 case 'M':
okini3939 18:9286e5010c14 143 value = sensor.moist;
okini3939 18:9286e5010c14 144 break;
okini3939 18:9286e5010c14 145
okini3939 18:9286e5010c14 146 case 'y':
okini3939 18:9286e5010c14 147 value = tim->tm_year + 1900;
okini3939 18:9286e5010c14 148 break;
okini3939 18:9286e5010c14 149 case 'm':
okini3939 18:9286e5010c14 150 value = tim->tm_mon;
okini3939 18:9286e5010c14 151 break;
okini3939 18:9286e5010c14 152 case 'd':
okini3939 18:9286e5010c14 153 value = tim->tm_mday;
okini3939 18:9286e5010c14 154 break;
okini3939 18:9286e5010c14 155 case 'h':
okini3939 18:9286e5010c14 156 value = tim->tm_hour;
okini3939 18:9286e5010c14 157 break;
okini3939 18:9286e5010c14 158 case 'i':
okini3939 18:9286e5010c14 159 value = tim->tm_min;
okini3939 18:9286e5010c14 160 break;
okini3939 18:9286e5010c14 161 case 's':
okini3939 18:9286e5010c14 162 value = tim->tm_sec;
okini3939 18:9286e5010c14 163 break;
okini3939 18:9286e5010c14 164
okini3939 18:9286e5010c14 165 case '0':
okini3939 18:9286e5010c14 166 case '1':
okini3939 18:9286e5010c14 167 case '2':
okini3939 18:9286e5010c14 168 case '3':
okini3939 18:9286e5010c14 169 case '4':
okini3939 18:9286e5010c14 170 case '5':
okini3939 18:9286e5010c14 171 case '6':
okini3939 18:9286e5010c14 172 case '7':
okini3939 18:9286e5010c14 173 case '8':
okini3939 18:9286e5010c14 174 case '9':
okini3939 18:9286e5010c14 175 // Ascii
okini3939 18:9286e5010c14 176 c = c - '0';
okini3939 18:9286e5010c14 177 if (fmt[i + 1] >= '0' && fmt[i + 1] <= '9') {
okini3939 18:9286e5010c14 178 c = (c << 3) | (fmt[i + 1] - '0');
okini3939 18:9286e5010c14 179 i ++;
okini3939 18:9286e5010c14 180 if (fmt[i + 1] >= '0' && fmt[i + 1] <= '9') {
okini3939 18:9286e5010c14 181 c = (c << 3) | (fmt[i + 1] - '0');
okini3939 18:9286e5010c14 182 i ++;
okini3939 18:9286e5010c14 183 }
okini3939 18:9286e5010c14 184 }
okini3939 18:9286e5010c14 185 buf[j] = c;
okini3939 18:9286e5010c14 186 j ++;
okini3939 18:9286e5010c14 187 continue;
okini3939 18:9286e5010c14 188
okini3939 18:9286e5010c14 189 default:
okini3939 18:9286e5010c14 190 buf[j] = c;
okini3939 18:9286e5010c14 191 j ++;
okini3939 18:9286e5010c14 192 continue;
okini3939 18:9286e5010c14 193 }
okini3939 18:9286e5010c14 194
okini3939 18:9286e5010c14 195 switch (flg) {
okini3939 18:9286e5010c14 196 case 1:
okini3939 18:9286e5010c14 197 sprintf(&buf[j], "%.1f", value);
okini3939 18:9286e5010c14 198 break;
okini3939 18:9286e5010c14 199 case 2:
okini3939 18:9286e5010c14 200 sprintf(&buf[j], "%.2f", value);
okini3939 18:9286e5010c14 201 break;
okini3939 18:9286e5010c14 202 default:
okini3939 18:9286e5010c14 203 sprintf(&buf[j], "%02d", (int)value);
okini3939 18:9286e5010c14 204 break;
okini3939 18:9286e5010c14 205 }
okini3939 18:9286e5010c14 206 j = strlen(buf);
okini3939 18:9286e5010c14 207 } else {
okini3939 18:9286e5010c14 208 buf[j] = c;
okini3939 18:9286e5010c14 209 j ++;
okini3939 18:9286e5010c14 210 }
okini3939 18:9286e5010c14 211 }
okini3939 18:9286e5010c14 212 buf[j] = 0;
okini3939 18:9286e5010c14 213 return buf;
okini3939 18:9286e5010c14 214 }
okini3939 18:9286e5010c14 215
okini3939 18:9286e5010c14 216 void twitter (int num) {
okini3939 18:9286e5010c14 217 HTTPMap msg;
okini3939 18:9286e5010c14 218 HTTPResult ret;
okini3939 18:9286e5010c14 219 char buf[170];
okini3939 18:9286e5010c14 220
okini3939 18:9286e5010c14 221 led_y = 0;
okini3939 18:9286e5010c14 222 fmtstr(conf.twitter_mesg[num], buf, sizeof(buf));
okini3939 18:9286e5010c14 223 msg["status"] = buf;
okini3939 18:9286e5010c14 224
okini3939 18:9286e5010c14 225 clientT->basicAuth(conf.twitter_user, conf.twitter_pwd);
okini3939 18:9286e5010c14 226 #ifdef NONBLOCKING
okini3939 18:9286e5010c14 227 Net::poll();
okini3939 18:9286e5010c14 228 ret = clientT->post(TWITTER_URL, msg, NULL, &cb_clientT);
okini3939 18:9286e5010c14 229 Net::poll();
okini3939 18:9286e5010c14 230 #else
okini3939 18:9286e5010c14 231 ret = clientT->post(TWITTER_URL, msg, NULL);
okini3939 18:9286e5010c14 232 #endif
okini3939 18:9286e5010c14 233
okini3939 18:9286e5010c14 234 if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
okini3939 18:9286e5010c14 235 pc.printf("error: Twitter %d\r\n", ret);
okini3939 18:9286e5010c14 236 }
okini3939 18:9286e5010c14 237 }
okini3939 18:9286e5010c14 238
okini3939 18:9286e5010c14 239 void ntpdate () {
okini3939 18:9286e5010c14 240 ntp = new NTPClient;
okini3939 18:9286e5010c14 241 Host ntpserver(IpAddr(), 123, conf.ntpserver);
okini3939 18:9286e5010c14 242
okini3939 18:9286e5010c14 243 led_y = 0;
okini3939 18:9286e5010c14 244 #ifdef NONBLOCKING
okini3939 18:9286e5010c14 245 Net::poll();
okini3939 18:9286e5010c14 246 ntp->setTime(ntpserver, &cb_settime);
okini3939 18:9286e5010c14 247 Net::poll();
okini3939 18:9286e5010c14 248 #else
okini3939 18:9286e5010c14 249 ntp->setTime(ntpserver);
okini3939 18:9286e5010c14 250 time_t sec = time(NULL) + (60 * 60 * TIMEZONE);
okini3939 18:9286e5010c14 251 set_time(sec);
okini3939 18:9286e5010c14 252 #endif
okini3939 18:9286e5010c14 253 }
okini3939 18:9286e5010c14 254
okini3939 18:9286e5010c14 255 void cb_settime (NTPResult status) {
okini3939 18:9286e5010c14 256 if (status == NTP_OK) {
okini3939 18:9286e5010c14 257 led_y = 0;
okini3939 18:9286e5010c14 258 time_t sec = time(NULL) + (60 * 60 * TIMEZONE);
okini3939 18:9286e5010c14 259 set_time(sec);
okini3939 18:9286e5010c14 260 pc.printf("Ntp success: %s\r\n", ctime(&sec));
okini3939 18:9286e5010c14 261 } else {
okini3939 18:9286e5010c14 262 pc.printf("Ntp failure (%d)\r\n", status);
okini3939 18:9286e5010c14 263 }
okini3939 18:9286e5010c14 264 // ntp->close();
okini3939 18:9286e5010c14 265 }