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

Dependencies:   ChaNFSSD EthernetNetIf I2CLEDDisp Agentbed ChaNFSUSB ILinterpreter mbed BMP085 WeatherMeters ConfigFile ChaNFS I2CLCD

Committer:
okini3939
Date:
Sun Jul 10 15:36:46 2011 +0000
Revision:
1:6c7141895545
Parent:
0:bdb53686c194
Child:
2:a3e5edf84f74

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 1:6c7141895545 1 /*
okini3939 1:6c7141895545 2 * Weather Station - mbed Weather Platform
okini3939 1:6c7141895545 3 * Copyright (c) 2011 Hiroshi Suga
okini3939 1:6c7141895545 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 1:6c7141895545 5 */
okini3939 1:6c7141895545 6
okini3939 1:6c7141895545 7 /** @file
okini3939 1:6c7141895545 8 * @brief Weather Station
okini3939 1:6c7141895545 9 */
okini3939 1:6c7141895545 10
okini3939 0:bdb53686c194 11 #include "mbed.h"
okini3939 0:bdb53686c194 12 #include "weather.h"
okini3939 0:bdb53686c194 13 #include "EthernetNetIf.h"
okini3939 0:bdb53686c194 14 #ifdef USE_NTP
okini3939 0:bdb53686c194 15 #include "NTPClient.h"
okini3939 0:bdb53686c194 16 #endif
okini3939 0:bdb53686c194 17 #include "HTTPClient.h"
okini3939 0:bdb53686c194 18 #ifdef USE_EMAIL
okini3939 0:bdb53686c194 19 #include "SMTPClient.h"
okini3939 0:bdb53686c194 20 #endif
okini3939 0:bdb53686c194 21
okini3939 0:bdb53686c194 22 #define STATION_URL "http://weather.sugakoubou.com/p"
okini3939 0:bdb53686c194 23 #define TWITTER_URL "http://api.supertweet.net/1/statuses/update.xml"
okini3939 0:bdb53686c194 24 #define PACHUBE_URL "http://api.pachube.com/v1/feeds/"
okini3939 0:bdb53686c194 25
okini3939 0:bdb53686c194 26 EthernetNetIf *eth;
okini3939 1:6c7141895545 27 DigitalOut led_gayk(p24),led_gkya(p25), led_yk(p26);
okini3939 0:bdb53686c194 28 static DigitalIn eth_link(P1_25), eth_speed(P1_26);
okini3939 0:bdb53686c194 29 static volatile int ethernet_flg = 0;
okini3939 0:bdb53686c194 30 static HTTPClient *http;
okini3939 1:6c7141895545 31 #ifdef USE_NTP
okini3939 1:6c7141895545 32 static NTPClient ntp;
okini3939 1:6c7141895545 33 #endif
okini3939 1:6c7141895545 34 #ifdef USE_EMAIL
okini3939 1:6c7141895545 35 static SMTPClient smtp;
okini3939 1:6c7141895545 36 #endif
okini3939 0:bdb53686c194 37
okini3939 0:bdb53686c194 38 int weatherstations () {
okini3939 0:bdb53686c194 39 char post_data[200];
okini3939 0:bdb53686c194 40 char id[10], pin[40];
okini3939 0:bdb53686c194 41 // HTTPClient http;
okini3939 0:bdb53686c194 42 HTTPResult ret;
okini3939 0:bdb53686c194 43 HTTPText postContent("application/x-www-form-urlencoded");
okini3939 0:bdb53686c194 44
okini3939 0:bdb53686c194 45 if (! ethernet_flg) return 0;
okini3939 0:bdb53686c194 46 if (! cfg.getValue("STATIONS_ID", id, sizeof(id)) ||
okini3939 0:bdb53686c194 47 ! cfg.getValue("STATIONS_PIN", pin, sizeof(pin))) {
okini3939 0:bdb53686c194 48 return -1;
okini3939 0:bdb53686c194 49 }
okini3939 0:bdb53686c194 50 #ifdef DEBUG
okini3939 0:bdb53686c194 51 pc.printf("S: %s %s\r\n", id, pin);
okini3939 0:bdb53686c194 52 #endif
okini3939 0:bdb53686c194 53
okini3939 1:6c7141895545 54 LED_NET_ACT_ON;
okini3939 0:bdb53686c194 55 format_str("d0=%.2P&d1=%.2T&d2=%.2H&d3=%.2A&d4=%.2V&d5=%.2R&d6=%.2L&d7=%.2U&d8=%.2M&d9=%.2p", post_data, sizeof(post_data));
okini3939 0:bdb53686c194 56 strcat(post_data, "&fcd=");
okini3939 0:bdb53686c194 57 strcat(post_data, chop(id));
okini3939 0:bdb53686c194 58 strcat(post_data, "&pin=");
okini3939 0:bdb53686c194 59 strcat(post_data, chop(pin));
okini3939 0:bdb53686c194 60 postContent.puts(post_data);
okini3939 0:bdb53686c194 61
okini3939 0:bdb53686c194 62 http->resetRequestHeaders();
okini3939 0:bdb53686c194 63 http->basicAuth(NULL, NULL);
okini3939 0:bdb53686c194 64 http->setTimeout(NET_TIMEOUT);
okini3939 0:bdb53686c194 65 ret = http->post(STATION_URL, postContent, NULL);
okini3939 0:bdb53686c194 66
okini3939 0:bdb53686c194 67 if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
okini3939 0:bdb53686c194 68 pc.printf("Weather Statuons failure: %d\r\n", ret);
okini3939 0:bdb53686c194 69 return -1;
okini3939 0:bdb53686c194 70 #ifdef DEBUG
okini3939 0:bdb53686c194 71 } else {
okini3939 0:bdb53686c194 72 pc.printf("Weather Stations success: %d\r\n", ret);
okini3939 0:bdb53686c194 73 #endif
okini3939 0:bdb53686c194 74 }
okini3939 0:bdb53686c194 75 return 0;
okini3939 0:bdb53686c194 76 }
okini3939 0:bdb53686c194 77
okini3939 0:bdb53686c194 78 int pachube (char *csv) {
okini3939 0:bdb53686c194 79 char uri[100];
okini3939 0:bdb53686c194 80 char apikey[70], feedid[10];
okini3939 0:bdb53686c194 81 // HTTPClient http;
okini3939 0:bdb53686c194 82 HTTPResult ret;
okini3939 0:bdb53686c194 83 HTTPText csvContent("text/csv");
okini3939 0:bdb53686c194 84
okini3939 0:bdb53686c194 85 if (! ethernet_flg) return 0;
okini3939 0:bdb53686c194 86 if (! cfg.getValue("PACHUBE_APIKEY", apikey, sizeof(apikey)) ||
okini3939 0:bdb53686c194 87 ! cfg.getValue("PACHUBE_FEEDID", feedid, sizeof(feedid))) {
okini3939 0:bdb53686c194 88 return -1;
okini3939 0:bdb53686c194 89 }
okini3939 0:bdb53686c194 90 #ifdef DEBUG
okini3939 0:bdb53686c194 91 pc.printf("P: %s %s\r\n", apikey, feedid);
okini3939 0:bdb53686c194 92 #endif
okini3939 0:bdb53686c194 93
okini3939 1:6c7141895545 94 LED_NET_ACT_ON;
okini3939 0:bdb53686c194 95 csvContent.set(csv);
okini3939 0:bdb53686c194 96 strcpy(uri, PACHUBE_URL);
okini3939 0:bdb53686c194 97 strcat(uri, chop(feedid));
okini3939 0:bdb53686c194 98 strcat(uri, ".csv?_method=put");
okini3939 0:bdb53686c194 99
okini3939 0:bdb53686c194 100 http->resetRequestHeaders();
okini3939 0:bdb53686c194 101 http->basicAuth(NULL, NULL);
okini3939 0:bdb53686c194 102 http->setTimeout(NET_TIMEOUT);
okini3939 0:bdb53686c194 103 http->setRequestHeader("X-PachubeApiKey", chop(apikey));
okini3939 0:bdb53686c194 104 ret = http->post(uri, csvContent, NULL);
okini3939 0:bdb53686c194 105
okini3939 0:bdb53686c194 106 if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
okini3939 0:bdb53686c194 107 pc.printf("Pachube failure: %d\r\n", ret);
okini3939 0:bdb53686c194 108 return -1;
okini3939 0:bdb53686c194 109 #ifdef DEBUG
okini3939 0:bdb53686c194 110 } else {
okini3939 0:bdb53686c194 111 pc.printf("Pachube success: %d\r\n", ret);
okini3939 0:bdb53686c194 112 #endif
okini3939 0:bdb53686c194 113 }
okini3939 0:bdb53686c194 114 return 0;
okini3939 0:bdb53686c194 115 }
okini3939 0:bdb53686c194 116
okini3939 0:bdb53686c194 117 int twitter (int num) {
okini3939 0:bdb53686c194 118 char buf[170], tmp[128];
okini3939 0:bdb53686c194 119 char user[20], pwd[20], key[20];
okini3939 0:bdb53686c194 120 // HTTPClient http;
okini3939 0:bdb53686c194 121 HTTPMap msg;
okini3939 0:bdb53686c194 122 HTTPResult ret;
okini3939 0:bdb53686c194 123
okini3939 0:bdb53686c194 124 if (! ethernet_flg || num >= CF_TWITTER_NUM) return 0;
okini3939 0:bdb53686c194 125 sprintf(key, "TWITTER_MESG[%d]", num);
okini3939 0:bdb53686c194 126 if (! cfg.getValue("TWITTER_USER", user, sizeof(user)) ||
okini3939 0:bdb53686c194 127 ! cfg.getValue("TWITTER_PWD", pwd, sizeof(pwd)) ||
okini3939 0:bdb53686c194 128 ! cfg.getValue(key, tmp, sizeof(tmp))) {
okini3939 0:bdb53686c194 129 return -1;
okini3939 0:bdb53686c194 130 }
okini3939 0:bdb53686c194 131 #ifdef DEBUG
okini3939 0:bdb53686c194 132 pc.printf("T: %s %s %s\r\n", user, pwd, tmp);
okini3939 0:bdb53686c194 133 #endif
okini3939 0:bdb53686c194 134
okini3939 1:6c7141895545 135 LED_NET_ACT_ON;
okini3939 0:bdb53686c194 136 format_str(tmp, buf, sizeof(buf));
okini3939 0:bdb53686c194 137 msg["status"] = buf;
okini3939 0:bdb53686c194 138
okini3939 0:bdb53686c194 139 http->resetRequestHeaders();
okini3939 0:bdb53686c194 140 http->setTimeout(NET_TIMEOUT);
okini3939 0:bdb53686c194 141 http->basicAuth(chop(user), chop(pwd));
okini3939 0:bdb53686c194 142 ret = http->post(TWITTER_URL, msg, NULL);
okini3939 0:bdb53686c194 143
okini3939 0:bdb53686c194 144 if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
okini3939 0:bdb53686c194 145 pc.printf("Twitter failure: %d\r\n", ret);
okini3939 0:bdb53686c194 146 return -1;
okini3939 0:bdb53686c194 147 #ifdef DEBUG
okini3939 0:bdb53686c194 148 } else {
okini3939 0:bdb53686c194 149 pc.printf("Twitter success: %d\r\n", ret);
okini3939 0:bdb53686c194 150 #endif
okini3939 0:bdb53686c194 151 }
okini3939 0:bdb53686c194 152 return 0;
okini3939 0:bdb53686c194 153 }
okini3939 0:bdb53686c194 154
okini3939 0:bdb53686c194 155 int email (int num) {
okini3939 0:bdb53686c194 156 #ifdef USE_EMAIL
okini3939 0:bdb53686c194 157 int port = 25;
okini3939 0:bdb53686c194 158 char buf[170], smtphost[40], from[40], to[40], tmp[128];
okini3939 0:bdb53686c194 159 char key[40], key2[40];
okini3939 0:bdb53686c194 160 Host smtpserver;
okini3939 0:bdb53686c194 161 EmailMessage msg;
okini3939 0:bdb53686c194 162 SMTPResult ret;
okini3939 0:bdb53686c194 163
okini3939 0:bdb53686c194 164 if (! ethernet_flg || num >= CF_MAIL_NUM) return 0;
okini3939 0:bdb53686c194 165 sprintf(key, "MAIL_MESG[%d]", num);
okini3939 0:bdb53686c194 166 sprintf(key2, "MAIL_TO[%d]", num);
okini3939 0:bdb53686c194 167 if (! cfg.getValue("SMTPSERVER", smtphost, sizeof(smtphost)) ||
okini3939 0:bdb53686c194 168 ! cfg.getValue("MAIL_FROM", from, sizeof(from)) ||
okini3939 0:bdb53686c194 169 ! cfg.getValue(key2, to, sizeof(to)) ||
okini3939 0:bdb53686c194 170 ! cfg.getValue(key, tmp, sizeof(tmp))) {
okini3939 0:bdb53686c194 171 return -1;
okini3939 0:bdb53686c194 172 }
okini3939 0:bdb53686c194 173
okini3939 1:6c7141895545 174 LED_NET_ACT_ON;
okini3939 0:bdb53686c194 175 if (cfg.getValue("SMTPPORT", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 176 port = atoi(buf);
okini3939 0:bdb53686c194 177 }
okini3939 0:bdb53686c194 178 smtpserver.setName(chop(smtphost));
okini3939 0:bdb53686c194 179 smtpserver.setPort(port);
okini3939 0:bdb53686c194 180 smtp.setServer(smtpserver);
okini3939 0:bdb53686c194 181 smtp.setHeloDomain("mbed");
okini3939 0:bdb53686c194 182
okini3939 0:bdb53686c194 183 msg.setFrom(chop(from));
okini3939 0:bdb53686c194 184 msg.addTo(chop(to));
okini3939 0:bdb53686c194 185 #ifdef DEBUG
okini3939 0:bdb53686c194 186 pc.printf("SMTP %s %s %s\r\n", smtphost, from, to);
okini3939 0:bdb53686c194 187 #endif
okini3939 0:bdb53686c194 188 /*
okini3939 0:bdb53686c194 189 msg.printf("Content-Type: text/plain; charset=UTF-8\n");
okini3939 0:bdb53686c194 190 msg.printf("Content-Transfer-Encoding: 8bit\n");
okini3939 0:bdb53686c194 191 msg.printf("From: %s\n", from);
okini3939 0:bdb53686c194 192 msg.printf("To: %s\n", to);
okini3939 0:bdb53686c194 193 */
okini3939 0:bdb53686c194 194 msg.printf("Subject: Message from weather\n");
okini3939 0:bdb53686c194 195 format_str(tmp, buf, sizeof(buf));
okini3939 0:bdb53686c194 196 msg.printf("\n%s\n", buf);
okini3939 0:bdb53686c194 197
okini3939 0:bdb53686c194 198 if (cfg.getValue("SMTPUSER", key, sizeof(key)) &&
okini3939 0:bdb53686c194 199 cfg.getValue("SMTPPWD", key2, sizeof(key2))) {
okini3939 0:bdb53686c194 200 // SMTP auth
okini3939 0:bdb53686c194 201 smtp.setAuth(chop(key), chop(key2));
okini3939 0:bdb53686c194 202 }
okini3939 0:bdb53686c194 203 smtp.setTimeout(NET_TIMEOUT);
okini3939 0:bdb53686c194 204 ret = smtp.send(&msg);
okini3939 0:bdb53686c194 205
okini3939 0:bdb53686c194 206 if (ret != HTTP_OK) {
okini3939 0:bdb53686c194 207 pc.printf("Mail failure: %d\r\n", ret);
okini3939 0:bdb53686c194 208 return -1;
okini3939 0:bdb53686c194 209 #ifdef DEBUG
okini3939 0:bdb53686c194 210 } else {
okini3939 0:bdb53686c194 211 pc.printf("Mail success: %d\r\n", ret);
okini3939 0:bdb53686c194 212 pc.printf("SMTP response %s", smtp.getLastResponse().c_str());
okini3939 0:bdb53686c194 213 #endif
okini3939 0:bdb53686c194 214 }
okini3939 0:bdb53686c194 215 #endif
okini3939 0:bdb53686c194 216 return 0;
okini3939 0:bdb53686c194 217 }
okini3939 0:bdb53686c194 218
okini3939 0:bdb53686c194 219 int ntpdate (char *hostname) {
okini3939 0:bdb53686c194 220 #ifdef USE_NTP
okini3939 0:bdb53686c194 221 Host ntpserver;
okini3939 0:bdb53686c194 222 NTPResult ret;
okini3939 0:bdb53686c194 223 time_t sec;
okini3939 0:bdb53686c194 224
okini3939 0:bdb53686c194 225 if (! ethernet_flg) return 0;
okini3939 0:bdb53686c194 226
okini3939 1:6c7141895545 227 LED_NET_ACT_ON;
okini3939 0:bdb53686c194 228 ntpserver.setName(hostname);
okini3939 0:bdb53686c194 229 ntpserver.setPort(123);
okini3939 0:bdb53686c194 230
okini3939 0:bdb53686c194 231 ret = ntp.setTime(ntpserver);
okini3939 0:bdb53686c194 232 if (ret == NTP_OK) {
okini3939 0:bdb53686c194 233 sec = time(NULL) + (60 * 60 * TIMEZONE);
okini3939 0:bdb53686c194 234 set_time(sec);
okini3939 0:bdb53686c194 235 }
okini3939 0:bdb53686c194 236 // ntp.close();
okini3939 0:bdb53686c194 237
okini3939 0:bdb53686c194 238 if (ret != NTP_OK) {
okini3939 0:bdb53686c194 239 pc.printf("NTP failure: %d\r\n", ret);
okini3939 0:bdb53686c194 240 return -1;
okini3939 0:bdb53686c194 241 #ifdef DEBUG
okini3939 0:bdb53686c194 242 } else {
okini3939 0:bdb53686c194 243 pc.printf("NTP success %s\r\n", ctime(&sec));
okini3939 0:bdb53686c194 244 #endif
okini3939 0:bdb53686c194 245 }
okini3939 0:bdb53686c194 246 #endif
okini3939 0:bdb53686c194 247 return 0;
okini3939 0:bdb53686c194 248 }
okini3939 0:bdb53686c194 249
okini3939 0:bdb53686c194 250 int init_net () {
okini3939 0:bdb53686c194 251 char buf[128];
okini3939 0:bdb53686c194 252 int ip0, ip1, ip2, ip3;
okini3939 0:bdb53686c194 253 IpAddr ipaddr, netmask, gateway, nameserver;
okini3939 0:bdb53686c194 254 EthernetErr ethErr;
okini3939 0:bdb53686c194 255
okini3939 0:bdb53686c194 256 eth_link.mode(PullUp);
okini3939 0:bdb53686c194 257 eth_speed.mode(PullUp);
okini3939 0:bdb53686c194 258
okini3939 0:bdb53686c194 259 if (cfg.getValue("IPADDRESS", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 260
okini3939 1:6c7141895545 261 if (! eth_link) {
okini3939 1:6c7141895545 262 LED_NET_G_ON;
okini3939 1:6c7141895545 263 }
okini3939 1:6c7141895545 264 LED_NET_ACT_ON;
okini3939 1:6c7141895545 265
okini3939 0:bdb53686c194 266 if (strncmp(buf, "DHCP", 4) == 0) {
okini3939 0:bdb53686c194 267 // dhcp ip address
okini3939 0:bdb53686c194 268
okini3939 0:bdb53686c194 269 eth = new EthernetNetIf;
okini3939 0:bdb53686c194 270
okini3939 0:bdb53686c194 271 } else {
okini3939 0:bdb53686c194 272 // static ip address
okini3939 0:bdb53686c194 273
okini3939 0:bdb53686c194 274 sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 0:bdb53686c194 275 ipaddr = IpAddr(ip0, ip1, ip2, ip3);
okini3939 0:bdb53686c194 276
okini3939 0:bdb53686c194 277 if (cfg.getValue("NETMASK", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 278 sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 0:bdb53686c194 279 netmask = IpAddr(ip0, ip1, ip2, ip3);
okini3939 0:bdb53686c194 280 }
okini3939 0:bdb53686c194 281
okini3939 0:bdb53686c194 282 if (cfg.getValue("GATEWAY", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 283 sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 0:bdb53686c194 284 gateway = IpAddr(ip0, ip1, ip2, ip3);
okini3939 0:bdb53686c194 285 }
okini3939 0:bdb53686c194 286
okini3939 0:bdb53686c194 287 if (cfg.getValue("NAMESERVER", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 288 sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 0:bdb53686c194 289 nameserver = IpAddr(ip0, ip1, ip2, ip3);
okini3939 0:bdb53686c194 290 }
okini3939 0:bdb53686c194 291
okini3939 0:bdb53686c194 292 eth = new EthernetNetIf(ipaddr, netmask, gateway, nameserver);
okini3939 0:bdb53686c194 293
okini3939 0:bdb53686c194 294 }
okini3939 0:bdb53686c194 295 if (eth == NULL) return -1;
okini3939 0:bdb53686c194 296
okini3939 0:bdb53686c194 297 ethErr = eth->setup();
okini3939 0:bdb53686c194 298 if (ethErr) {
okini3939 0:bdb53686c194 299 // error
okini3939 1:6c7141895545 300 LED_NET_Y_ON;
okini3939 0:bdb53686c194 301 return -1;
okini3939 0:bdb53686c194 302 }
okini3939 0:bdb53686c194 303
okini3939 0:bdb53686c194 304 pc.printf("\r\nEthernet: %d.%d.%d.%d\r\n", eth->getIp()[0], eth->getIp()[1], eth->getIp()[2], eth->getIp()[3]);
okini3939 0:bdb53686c194 305 ethernet_flg = 1;
okini3939 0:bdb53686c194 306 pool_net();
okini3939 0:bdb53686c194 307
okini3939 0:bdb53686c194 308 http = new HTTPClient;
okini3939 0:bdb53686c194 309 if (http == NULL) return -1;
okini3939 0:bdb53686c194 310 }
okini3939 0:bdb53686c194 311
okini3939 0:bdb53686c194 312 if (cfg.getValue("NTPSERVER", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 313 pc.printf("NTP: %s\r\n", buf);
okini3939 0:bdb53686c194 314 ntpdate(chop(buf));
okini3939 0:bdb53686c194 315 }
okini3939 0:bdb53686c194 316
okini3939 0:bdb53686c194 317 if (cfg.getValue("SNMP_COMMNAME", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 318 snmp_init(chop(buf));
okini3939 0:bdb53686c194 319 pc.printf("SNMP community name: %s\r\n", buf);
okini3939 0:bdb53686c194 320 }
okini3939 0:bdb53686c194 321
okini3939 0:bdb53686c194 322 return 0;
okini3939 0:bdb53686c194 323 }
okini3939 0:bdb53686c194 324
okini3939 0:bdb53686c194 325 void pool_net () {
okini3939 0:bdb53686c194 326
okini3939 0:bdb53686c194 327 if (ethernet_flg) {
okini3939 0:bdb53686c194 328 Net::poll();
okini3939 0:bdb53686c194 329
okini3939 1:6c7141895545 330 if (! eth_link) {
okini3939 1:6c7141895545 331 LED_NET_G_ON;
okini3939 1:6c7141895545 332 } else {
okini3939 1:6c7141895545 333 LED_NET_GY_OFF;
okini3939 1:6c7141895545 334 }
okini3939 0:bdb53686c194 335 }
okini3939 0:bdb53686c194 336 }