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:
Wed Aug 24 13:22:32 2011 +0000
Revision:
2:a3e5edf84f74
Parent:
1:6c7141895545
Child:
3:058292da2cee

        

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 2:a3e5edf84f74 15 //#include "NTPClient.h"
okini3939 2:a3e5edf84f74 16 #include "TinySNTP.h"
okini3939 0:bdb53686c194 17 #endif
okini3939 2:a3e5edf84f74 18 #ifdef USE_HTTP
okini3939 0:bdb53686c194 19 #include "HTTPClient.h"
okini3939 2:a3e5edf84f74 20 #endif
okini3939 0:bdb53686c194 21 #ifdef USE_EMAIL
okini3939 0:bdb53686c194 22 #include "SMTPClient.h"
okini3939 0:bdb53686c194 23 #endif
okini3939 0:bdb53686c194 24
okini3939 2:a3e5edf84f74 25 #define STATIONS_URL "http://weather.sugakoubou.com/p"
okini3939 0:bdb53686c194 26 #define TWITTER_URL "http://api.supertweet.net/1/statuses/update.xml"
okini3939 0:bdb53686c194 27 #define PACHUBE_URL "http://api.pachube.com/v1/feeds/"
okini3939 0:bdb53686c194 28
okini3939 0:bdb53686c194 29 EthernetNetIf *eth;
okini3939 1:6c7141895545 30 DigitalOut led_gayk(p24),led_gkya(p25), led_yk(p26);
okini3939 0:bdb53686c194 31 static DigitalIn eth_link(P1_25), eth_speed(P1_26);
okini3939 0:bdb53686c194 32 static volatile int ethernet_flg = 0;
okini3939 2:a3e5edf84f74 33 #ifdef USE_HTTP
okini3939 2:a3e5edf84f74 34 //static HTTPClient *http;
okini3939 1:6c7141895545 35 #endif
okini3939 2:a3e5edf84f74 36 //static NTPClient *ntp;
okini3939 0:bdb53686c194 37
okini3939 0:bdb53686c194 38 int weatherstations () {
okini3939 2:a3e5edf84f74 39 #ifdef USE_HTTP
okini3939 2:a3e5edf84f74 40 char post_data[150];
okini3939 2:a3e5edf84f74 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 2:a3e5edf84f74 46 if (! conf.stations_id[0] || ! conf.stations_pin[0]) {
okini3939 0:bdb53686c194 47 return -1;
okini3939 0:bdb53686c194 48 }
okini3939 0:bdb53686c194 49
okini3939 1:6c7141895545 50 LED_NET_ACT_ON;
okini3939 2:a3e5edf84f74 51 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_1(post_data));
okini3939 2:a3e5edf84f74 52 strncat(post_data, "&fcd=", sizeof_len(post_data));
okini3939 2:a3e5edf84f74 53 strncat(post_data, conf.stations_id, sizeof_len(post_data));
okini3939 2:a3e5edf84f74 54 strncat(post_data, "&pin=", sizeof_len(post_data));
okini3939 2:a3e5edf84f74 55 strncat(post_data, conf.stations_pin, sizeof_len(post_data));
okini3939 0:bdb53686c194 56 postContent.puts(post_data);
okini3939 0:bdb53686c194 57
okini3939 2:a3e5edf84f74 58 #ifdef DEBUG
okini3939 2:a3e5edf84f74 59 pc.printf("S: %s %s\r\n%s\r\n", conf.stations_id, conf.stations_pin, post_data);
okini3939 2:a3e5edf84f74 60 #endif
okini3939 2:a3e5edf84f74 61 // http->resetRequestHeaders();
okini3939 2:a3e5edf84f74 62 // http->basicAuth(NULL, NULL);
okini3939 2:a3e5edf84f74 63 http.setTimeout(NET_TIMEOUT);
okini3939 2:a3e5edf84f74 64 ret = http.post(STATIONS_URL, postContent, NULL);
okini3939 0:bdb53686c194 65
okini3939 0:bdb53686c194 66 if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
okini3939 0:bdb53686c194 67 pc.printf("Weather Statuons failure: %d\r\n", ret);
okini3939 0:bdb53686c194 68 return -1;
okini3939 0:bdb53686c194 69 #ifdef DEBUG
okini3939 0:bdb53686c194 70 } else {
okini3939 0:bdb53686c194 71 pc.printf("Weather Stations success: %d\r\n", ret);
okini3939 0:bdb53686c194 72 #endif
okini3939 0:bdb53686c194 73 }
okini3939 2:a3e5edf84f74 74 #endif
okini3939 0:bdb53686c194 75 return 0;
okini3939 0:bdb53686c194 76 }
okini3939 0:bdb53686c194 77
okini3939 2:a3e5edf84f74 78 int pachube () {
okini3939 2:a3e5edf84f74 79 #ifdef USE_HTTP
okini3939 2:a3e5edf84f74 80 char buf[100], uri[100];
okini3939 2:a3e5edf84f74 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 2:a3e5edf84f74 86 if (! conf.pachube_apikey[0] || ! conf.pachube_feedid[0]) {
okini3939 0:bdb53686c194 87 return -1;
okini3939 0:bdb53686c194 88 }
okini3939 0:bdb53686c194 89
okini3939 1:6c7141895545 90 LED_NET_ACT_ON;
okini3939 2:a3e5edf84f74 91 format_str(conf.pachube_mesg, buf, sizeof_1(buf));
okini3939 2:a3e5edf84f74 92 csvContent.set(buf);
okini3939 2:a3e5edf84f74 93
okini3939 2:a3e5edf84f74 94 snprintf(uri, sizeof(uri), PACHUBE_URL "%s.csv?_method=put", conf.pachube_feedid);
okini3939 0:bdb53686c194 95
okini3939 2:a3e5edf84f74 96 #ifdef DEBUG
okini3939 2:a3e5edf84f74 97 pc.printf("P: %s %s %s\r\n", conf.pachube_apikey, conf.pachube_feedid, uri);
okini3939 2:a3e5edf84f74 98 #endif
okini3939 2:a3e5edf84f74 99 // http->resetRequestHeaders();
okini3939 2:a3e5edf84f74 100 // http->basicAuth(NULL, NULL);
okini3939 2:a3e5edf84f74 101 http.setTimeout(NET_TIMEOUT);
okini3939 2:a3e5edf84f74 102 http.setRequestHeader("X-PachubeApiKey", conf.pachube_apikey);
okini3939 2:a3e5edf84f74 103 ret = http.post(uri, csvContent, NULL);
okini3939 0:bdb53686c194 104
okini3939 0:bdb53686c194 105 if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
okini3939 0:bdb53686c194 106 pc.printf("Pachube failure: %d\r\n", ret);
okini3939 0:bdb53686c194 107 return -1;
okini3939 0:bdb53686c194 108 #ifdef DEBUG
okini3939 0:bdb53686c194 109 } else {
okini3939 0:bdb53686c194 110 pc.printf("Pachube success: %d\r\n", ret);
okini3939 0:bdb53686c194 111 #endif
okini3939 0:bdb53686c194 112 }
okini3939 2:a3e5edf84f74 113 #endif
okini3939 0:bdb53686c194 114 return 0;
okini3939 0:bdb53686c194 115 }
okini3939 0:bdb53686c194 116
okini3939 0:bdb53686c194 117 int twitter (int num) {
okini3939 2:a3e5edf84f74 118 #ifdef USE_HTTP
okini3939 2:a3e5edf84f74 119 char buf[FORMAT_STR_SIZE];
okini3939 2:a3e5edf84f74 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 2:a3e5edf84f74 125 if (! conf.twitter_user[0] || ! conf.twitter_pwd[0] || ! conf.twitter_mesg[num][0]) {
okini3939 0:bdb53686c194 126 return -1;
okini3939 0:bdb53686c194 127 }
okini3939 0:bdb53686c194 128
okini3939 1:6c7141895545 129 LED_NET_ACT_ON;
okini3939 2:a3e5edf84f74 130 format_str(conf.twitter_mesg[num], buf, sizeof_1(buf));
okini3939 0:bdb53686c194 131 msg["status"] = buf;
okini3939 0:bdb53686c194 132
okini3939 2:a3e5edf84f74 133 #ifdef DEBUG
okini3939 2:a3e5edf84f74 134 pc.printf("T: %s %s %s\r\n%s\r\n", conf.twitter_user, conf.twitter_pwd, conf.twitter_mesg[num], buf);
okini3939 2:a3e5edf84f74 135 #endif
okini3939 2:a3e5edf84f74 136 // http->resetRequestHeaders();
okini3939 2:a3e5edf84f74 137 http.setTimeout(NET_TIMEOUT);
okini3939 2:a3e5edf84f74 138 http.basicAuth(conf.twitter_user, conf.twitter_pwd);
okini3939 2:a3e5edf84f74 139 ret = http.post(TWITTER_URL, msg, NULL);
okini3939 0:bdb53686c194 140
okini3939 0:bdb53686c194 141 if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
okini3939 0:bdb53686c194 142 pc.printf("Twitter failure: %d\r\n", ret);
okini3939 0:bdb53686c194 143 return -1;
okini3939 0:bdb53686c194 144 #ifdef DEBUG
okini3939 0:bdb53686c194 145 } else {
okini3939 0:bdb53686c194 146 pc.printf("Twitter success: %d\r\n", ret);
okini3939 0:bdb53686c194 147 #endif
okini3939 0:bdb53686c194 148 }
okini3939 2:a3e5edf84f74 149 #endif
okini3939 0:bdb53686c194 150 return 0;
okini3939 0:bdb53686c194 151 }
okini3939 0:bdb53686c194 152
okini3939 0:bdb53686c194 153 int email (int num) {
okini3939 0:bdb53686c194 154 #ifdef USE_EMAIL
okini3939 2:a3e5edf84f74 155 char buf[FORMAT_STR_SIZE];
okini3939 2:a3e5edf84f74 156 static SMTPClient smtp;
okini3939 0:bdb53686c194 157 Host smtpserver;
okini3939 0:bdb53686c194 158 EmailMessage msg;
okini3939 0:bdb53686c194 159 SMTPResult ret;
okini3939 0:bdb53686c194 160
okini3939 0:bdb53686c194 161 if (! ethernet_flg || num >= CF_MAIL_NUM) return 0;
okini3939 2:a3e5edf84f74 162 if (! conf.smtphost[0] || ! conf.mailfrom[0] ||
okini3939 2:a3e5edf84f74 163 ! conf.mailto[num][0] || ! conf.mailmesg[num][0]) {
okini3939 0:bdb53686c194 164 return -1;
okini3939 0:bdb53686c194 165 }
okini3939 0:bdb53686c194 166
okini3939 1:6c7141895545 167 LED_NET_ACT_ON;
okini3939 2:a3e5edf84f74 168 smtpserver.setName(conf.smtphost);
okini3939 2:a3e5edf84f74 169 smtpserver.setPort(conf.smtpport);
okini3939 0:bdb53686c194 170 smtp.setServer(smtpserver);
okini3939 0:bdb53686c194 171 smtp.setHeloDomain("mbed");
okini3939 2:a3e5edf84f74 172 if (conf.smtpuser[0] && conf.smtppwd[0]) {
okini3939 2:a3e5edf84f74 173 // SMTP auth
okini3939 2:a3e5edf84f74 174 smtp.setAuth(conf.smtpuser, conf.smtppwd);
okini3939 2:a3e5edf84f74 175 }
okini3939 0:bdb53686c194 176
okini3939 2:a3e5edf84f74 177 msg.setFrom(conf.mailfrom);
okini3939 2:a3e5edf84f74 178 msg.addTo(conf.mailto[num]);
okini3939 0:bdb53686c194 179 /*
okini3939 0:bdb53686c194 180 msg.printf("Content-Type: text/plain; charset=UTF-8\n");
okini3939 0:bdb53686c194 181 msg.printf("Content-Transfer-Encoding: 8bit\n");
okini3939 2:a3e5edf84f74 182 msg.printf("From: %s\n", conf.mailfrom);
okini3939 2:a3e5edf84f74 183 msg.printf("To: %s\n", conf.mailto[num]);
okini3939 0:bdb53686c194 184 */
okini3939 0:bdb53686c194 185 msg.printf("Subject: Message from weather\n");
okini3939 2:a3e5edf84f74 186 format_str(conf.mailmesg[num], buf, sizeof_1(buf));
okini3939 0:bdb53686c194 187 msg.printf("\n%s\n", buf);
okini3939 0:bdb53686c194 188
okini3939 2:a3e5edf84f74 189 #ifdef DEBUG
okini3939 2:a3e5edf84f74 190 pc.printf("SMTP %s %s %s\r\n%s\r\n", conf.smtphost, conf.mailfrom, conf.mailto[num], buf);
okini3939 2:a3e5edf84f74 191 #endif
okini3939 0:bdb53686c194 192 smtp.setTimeout(NET_TIMEOUT);
okini3939 0:bdb53686c194 193 ret = smtp.send(&msg);
okini3939 0:bdb53686c194 194
okini3939 0:bdb53686c194 195 if (ret != HTTP_OK) {
okini3939 0:bdb53686c194 196 pc.printf("Mail failure: %d\r\n", ret);
okini3939 0:bdb53686c194 197 return -1;
okini3939 0:bdb53686c194 198 #ifdef DEBUG
okini3939 0:bdb53686c194 199 } else {
okini3939 0:bdb53686c194 200 pc.printf("Mail success: %d\r\n", ret);
okini3939 0:bdb53686c194 201 pc.printf("SMTP response %s", smtp.getLastResponse().c_str());
okini3939 0:bdb53686c194 202 #endif
okini3939 0:bdb53686c194 203 }
okini3939 0:bdb53686c194 204 #endif
okini3939 0:bdb53686c194 205 return 0;
okini3939 0:bdb53686c194 206 }
okini3939 0:bdb53686c194 207
okini3939 2:a3e5edf84f74 208 int ntp (char *hostname) {
okini3939 0:bdb53686c194 209 #ifdef USE_NTP
okini3939 2:a3e5edf84f74 210 time_t sec;
okini3939 2:a3e5edf84f74 211
okini3939 2:a3e5edf84f74 212 if (! ethernet_flg) return 0;
okini3939 2:a3e5edf84f74 213 pc.printf("NTP: %s\r\n", hostname);
okini3939 2:a3e5edf84f74 214
okini3939 2:a3e5edf84f74 215 if (! ntpdate(hostname, &sec)) {
okini3939 2:a3e5edf84f74 216 sec = sec + (60 * 60 * TIMEZONE);
okini3939 2:a3e5edf84f74 217 set_time(sec);
okini3939 2:a3e5edf84f74 218 #ifdef DEBUG
okini3939 2:a3e5edf84f74 219 pc.printf("NTP success %s\r\n", ctime(&sec));
okini3939 2:a3e5edf84f74 220 #endif
okini3939 2:a3e5edf84f74 221 } else {
okini3939 2:a3e5edf84f74 222 pc.printf("NTP failure\r\n");
okini3939 2:a3e5edf84f74 223 return -1;
okini3939 2:a3e5edf84f74 224 }
okini3939 2:a3e5edf84f74 225
okini3939 2:a3e5edf84f74 226 /*
okini3939 2:a3e5edf84f74 227 // NTPClient ntp;
okini3939 0:bdb53686c194 228 Host ntpserver;
okini3939 0:bdb53686c194 229 NTPResult ret;
okini3939 0:bdb53686c194 230 time_t sec;
okini3939 0:bdb53686c194 231
okini3939 0:bdb53686c194 232 if (! ethernet_flg) return 0;
okini3939 2:a3e5edf84f74 233 pc.printf("NTP: %s\r\n", hostname);
okini3939 0:bdb53686c194 234
okini3939 1:6c7141895545 235 LED_NET_ACT_ON;
okini3939 0:bdb53686c194 236 ntpserver.setName(hostname);
okini3939 0:bdb53686c194 237 ntpserver.setPort(123);
okini3939 0:bdb53686c194 238
okini3939 2:a3e5edf84f74 239 ret = ntp->setTime(ntpserver);
okini3939 0:bdb53686c194 240 if (ret == NTP_OK) {
okini3939 0:bdb53686c194 241 sec = time(NULL) + (60 * 60 * TIMEZONE);
okini3939 0:bdb53686c194 242 set_time(sec);
okini3939 0:bdb53686c194 243 }
okini3939 0:bdb53686c194 244
okini3939 0:bdb53686c194 245 if (ret != NTP_OK) {
okini3939 0:bdb53686c194 246 pc.printf("NTP failure: %d\r\n", ret);
okini3939 0:bdb53686c194 247 return -1;
okini3939 0:bdb53686c194 248 #ifdef DEBUG
okini3939 0:bdb53686c194 249 } else {
okini3939 0:bdb53686c194 250 pc.printf("NTP success %s\r\n", ctime(&sec));
okini3939 0:bdb53686c194 251 #endif
okini3939 0:bdb53686c194 252 }
okini3939 2:a3e5edf84f74 253 */
okini3939 0:bdb53686c194 254 #endif
okini3939 0:bdb53686c194 255 return 0;
okini3939 0:bdb53686c194 256 }
okini3939 0:bdb53686c194 257
okini3939 0:bdb53686c194 258 int init_net () {
okini3939 0:bdb53686c194 259 EthernetErr ethErr;
okini3939 0:bdb53686c194 260
okini3939 0:bdb53686c194 261 eth_link.mode(PullUp);
okini3939 0:bdb53686c194 262 eth_speed.mode(PullUp);
okini3939 0:bdb53686c194 263
okini3939 2:a3e5edf84f74 264 if (conf.ipaddr[0]) {
okini3939 0:bdb53686c194 265
okini3939 1:6c7141895545 266 if (! eth_link) {
okini3939 1:6c7141895545 267 LED_NET_G_ON;
okini3939 1:6c7141895545 268 }
okini3939 1:6c7141895545 269 LED_NET_ACT_ON;
okini3939 1:6c7141895545 270
okini3939 2:a3e5edf84f74 271 if (conf.ipaddr[0] == 255) {
okini3939 0:bdb53686c194 272 // dhcp ip address
okini3939 0:bdb53686c194 273 eth = new EthernetNetIf;
okini3939 0:bdb53686c194 274 } else {
okini3939 0:bdb53686c194 275 // static ip address
okini3939 2:a3e5edf84f74 276 eth = new EthernetNetIf(conf.ipaddr, conf.netmask, conf.gateway, conf.nameserver);
okini3939 0:bdb53686c194 277 }
okini3939 0:bdb53686c194 278
okini3939 0:bdb53686c194 279 ethErr = eth->setup();
okini3939 0:bdb53686c194 280 if (ethErr) {
okini3939 0:bdb53686c194 281 // error
okini3939 1:6c7141895545 282 LED_NET_Y_ON;
okini3939 0:bdb53686c194 283 return -1;
okini3939 0:bdb53686c194 284 }
okini3939 0:bdb53686c194 285
okini3939 0:bdb53686c194 286 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 287 ethernet_flg = 1;
okini3939 0:bdb53686c194 288 pool_net();
okini3939 0:bdb53686c194 289
okini3939 2:a3e5edf84f74 290 #ifdef USE_HTTP
okini3939 2:a3e5edf84f74 291 // http = new HTTPClient;
okini3939 2:a3e5edf84f74 292 #endif
okini3939 2:a3e5edf84f74 293 // ntp = new NTPClient;
okini3939 0:bdb53686c194 294 }
okini3939 0:bdb53686c194 295
okini3939 2:a3e5edf84f74 296 if (conf.ntpserver[0]) {
okini3939 2:a3e5edf84f74 297 ntp(conf.ntpserver);
okini3939 0:bdb53686c194 298 }
okini3939 0:bdb53686c194 299
okini3939 2:a3e5edf84f74 300 if (conf.snmp_commname[0]) {
okini3939 2:a3e5edf84f74 301 snmp_init(conf.snmp_commname);
okini3939 0:bdb53686c194 302 }
okini3939 0:bdb53686c194 303
okini3939 0:bdb53686c194 304 return 0;
okini3939 0:bdb53686c194 305 }
okini3939 0:bdb53686c194 306
okini3939 0:bdb53686c194 307 void pool_net () {
okini3939 0:bdb53686c194 308
okini3939 0:bdb53686c194 309 if (ethernet_flg) {
okini3939 0:bdb53686c194 310 Net::poll();
okini3939 0:bdb53686c194 311
okini3939 1:6c7141895545 312 if (! eth_link) {
okini3939 1:6c7141895545 313 LED_NET_G_ON;
okini3939 1:6c7141895545 314 } else {
okini3939 1:6c7141895545 315 LED_NET_GY_OFF;
okini3939 1:6c7141895545 316 }
okini3939 0:bdb53686c194 317 }
okini3939 0:bdb53686c194 318 }