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:
Sat Mar 19 21:24:01 2011 +0000
Revision:
13:20c0f845df68
Parent:
10:848a2205aed1
Child:
14:ee6cc1632166

        

Who changed what in which revision?

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