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:
Fri Mar 16 15:26:46 2012 +0000
Revision:
8:bed0b81794ba
Parent:
7:f7c98d836f81

        

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 "TinySNTP.h"
okini3939 0:bdb53686c194 16 #endif
okini3939 2:a3e5edf84f74 17 #ifdef USE_HTTP
okini3939 3:058292da2cee 18 #include "TinyHTTP.h"
okini3939 2:a3e5edf84f74 19 #endif
okini3939 0:bdb53686c194 20 #ifdef USE_EMAIL
okini3939 3:058292da2cee 21 #include "TinySMTP.h"
okini3939 0:bdb53686c194 22 #endif
okini3939 3:058292da2cee 23 #include "TCPSocket.h"
okini3939 0:bdb53686c194 24
okini3939 0:bdb53686c194 25 EthernetNetIf *eth;
okini3939 1:6c7141895545 26 DigitalOut led_gayk(p24),led_gkya(p25), led_yk(p26);
okini3939 0:bdb53686c194 27 static DigitalIn eth_link(P1_25), eth_speed(P1_26);
okini3939 0:bdb53686c194 28 static volatile int ethernet_flg = 0;
okini3939 0:bdb53686c194 29
okini3939 0:bdb53686c194 30 int weatherstations () {
okini3939 2:a3e5edf84f74 31 #ifdef USE_HTTP
okini3939 3:058292da2cee 32 Host host;
okini3939 3:058292da2cee 33 char buf[FORMAT_STR_SIZE];
okini3939 3:058292da2cee 34 char head[80];
okini3939 0:bdb53686c194 35
okini3939 0:bdb53686c194 36 if (! ethernet_flg) return 0;
okini3939 2:a3e5edf84f74 37 if (! conf.stations_id[0] || ! conf.stations_pin[0]) {
okini3939 0:bdb53686c194 38 return -1;
okini3939 0:bdb53686c194 39 }
okini3939 0:bdb53686c194 40
okini3939 1:6c7141895545 41 LED_NET_ACT_ON;
okini3939 3:058292da2cee 42
okini3939 3:058292da2cee 43 format_str("d0=%.2P&d1=%.2T&d2=%.2H&d3=%.2A&d4=%.2V&d5=%.2R&d6=%.2L&d7=%.2U&d8=%.2M&d9=%.2p", buf, sizeof_1(buf));
okini3939 3:058292da2cee 44 snprintf(&buf[strlen(buf)], sizeof_len(buf),
okini3939 3:058292da2cee 45 "&fcd=%s&pin=%s", conf.stations_id, conf.stations_pin);
okini3939 0:bdb53686c194 46
okini3939 2:a3e5edf84f74 47 #ifdef DEBUG
okini3939 3:058292da2cee 48 pc.printf("S: %s %s\r\n%s\r\n", conf.stations_id, conf.stations_pin, buf);
okini3939 2:a3e5edf84f74 49 #endif
okini3939 2:a3e5edf84f74 50 // http->resetRequestHeaders();
okini3939 2:a3e5edf84f74 51 // http->basicAuth(NULL, NULL);
okini3939 3:058292da2cee 52
okini3939 3:058292da2cee 53 strncpy(head, "Content-type: application/x-www-form-urlencoded\r\n", sizeof_1(head));
okini3939 0:bdb53686c194 54
okini3939 3:058292da2cee 55 host.setName("weather.sugakoubou.com");
okini3939 3:058292da2cee 56 host.setPort(HTTP_PORT);
okini3939 3:058292da2cee 57 return httpRequest(METHOD_POST, &host, "/p", head, buf) == 200 ? 0 : -1;
okini3939 0:bdb53686c194 58 #endif
okini3939 0:bdb53686c194 59 }
okini3939 0:bdb53686c194 60
okini3939 2:a3e5edf84f74 61 int pachube () {
okini3939 2:a3e5edf84f74 62 #ifdef USE_HTTP
okini3939 3:058292da2cee 63 Host host;
okini3939 3:058292da2cee 64 char buf[FORMAT_STR_SIZE];
okini3939 3:058292da2cee 65 char uri[40], head[160];
okini3939 0:bdb53686c194 66
okini3939 0:bdb53686c194 67 if (! ethernet_flg) return 0;
okini3939 2:a3e5edf84f74 68 if (! conf.pachube_apikey[0] || ! conf.pachube_feedid[0]) {
okini3939 0:bdb53686c194 69 return -1;
okini3939 0:bdb53686c194 70 }
okini3939 0:bdb53686c194 71
okini3939 1:6c7141895545 72 LED_NET_ACT_ON;
okini3939 3:058292da2cee 73 // body
okini3939 2:a3e5edf84f74 74 format_str(conf.pachube_mesg, buf, sizeof_1(buf));
okini3939 3:058292da2cee 75 // header
okini3939 3:058292da2cee 76 snprintf(head, sizeof(head), "Content-type: text/csv\r\nX-PachubeApiKey: %s\r\n", conf.pachube_apikey);
okini3939 3:058292da2cee 77 // uri
okini3939 3:058292da2cee 78 snprintf(uri, sizeof(uri), "/v1/feeds/%s.csv?_method=put", conf.pachube_feedid);
okini3939 2:a3e5edf84f74 79 #ifdef DEBUG
okini3939 2:a3e5edf84f74 80 pc.printf("P: %s %s %s\r\n", conf.pachube_apikey, conf.pachube_feedid, uri);
okini3939 2:a3e5edf84f74 81 #endif
okini3939 0:bdb53686c194 82
okini3939 3:058292da2cee 83 host.setName("api.pachube.com");
okini3939 3:058292da2cee 84 host.setPort(HTTP_PORT);
okini3939 3:058292da2cee 85 return httpRequest(METHOD_POST, &host, uri, head, buf) == 200 ? 0 : -1;
okini3939 0:bdb53686c194 86 #endif
okini3939 0:bdb53686c194 87 }
okini3939 0:bdb53686c194 88
okini3939 0:bdb53686c194 89 int twitter (int num) {
okini3939 2:a3e5edf84f74 90 #ifdef USE_HTTP
okini3939 3:058292da2cee 91 Host host;
okini3939 2:a3e5edf84f74 92 char buf[FORMAT_STR_SIZE];
okini3939 3:058292da2cee 93 char msg[FORMAT_STR_SIZE];
okini3939 3:058292da2cee 94 char head[160];
okini3939 0:bdb53686c194 95
okini3939 0:bdb53686c194 96 if (! ethernet_flg || num >= CF_TWITTER_NUM) return 0;
okini3939 2:a3e5edf84f74 97 if (! conf.twitter_user[0] || ! conf.twitter_pwd[0] || ! conf.twitter_mesg[num][0]) {
okini3939 0:bdb53686c194 98 return -1;
okini3939 0:bdb53686c194 99 }
okini3939 0:bdb53686c194 100
okini3939 1:6c7141895545 101 LED_NET_ACT_ON;
okini3939 3:058292da2cee 102 // header
okini3939 3:058292da2cee 103 createauth(conf.twitter_user, conf.twitter_pwd, head, sizeof(head));
okini3939 3:058292da2cee 104 strncat(head, "Content-type: application/x-www-form-urlencoded\r\n", sizeof_len(head));
okini3939 3:058292da2cee 105 // post data
okini3939 3:058292da2cee 106 format_str(conf.twitter_mesg[num], msg, sizeof_1(msg));
okini3939 3:058292da2cee 107 strcpy(buf, "status=");
okini3939 3:058292da2cee 108 urlencode(msg, &buf[strlen(buf)], sizeof_len(buf));
okini3939 2:a3e5edf84f74 109 #ifdef DEBUG
okini3939 2:a3e5edf84f74 110 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 111 #endif
okini3939 0:bdb53686c194 112
okini3939 3:058292da2cee 113 host.setName("api.supertweet.net");
okini3939 3:058292da2cee 114 host.setPort(HTTP_PORT);
okini3939 3:058292da2cee 115 return httpRequest(METHOD_POST, &host, "/1/statuses/update.xml", head, buf) == 200 ? 0 : -1;
okini3939 0:bdb53686c194 116 #endif
okini3939 0:bdb53686c194 117 }
okini3939 0:bdb53686c194 118
okini3939 0:bdb53686c194 119 int email (int num) {
okini3939 0:bdb53686c194 120 #ifdef USE_EMAIL
okini3939 3:058292da2cee 121 Host host;
okini3939 2:a3e5edf84f74 122 char buf[FORMAT_STR_SIZE];
okini3939 0:bdb53686c194 123
okini3939 0:bdb53686c194 124 if (! ethernet_flg || num >= CF_MAIL_NUM) return 0;
okini3939 2:a3e5edf84f74 125 if (! conf.smtphost[0] || ! conf.mailfrom[0] ||
okini3939 2:a3e5edf84f74 126 ! conf.mailto[num][0] || ! conf.mailmesg[num][0]) {
okini3939 0:bdb53686c194 127 return -1;
okini3939 0:bdb53686c194 128 }
okini3939 0:bdb53686c194 129
okini3939 1:6c7141895545 130 LED_NET_ACT_ON;
okini3939 0:bdb53686c194 131
okini3939 7:f7c98d836f81 132 snprintf(buf, sizeof(buf), "From: %s\nTo: %s\nSubject: Message from weather\n\n", conf.mailfrom, conf.mailto[0]);
okini3939 3:058292da2cee 133 format_str(conf.mailmesg[num], &buf[strlen(buf)], sizeof_len(buf));
okini3939 2:a3e5edf84f74 134 #ifdef DEBUG
okini3939 2:a3e5edf84f74 135 pc.printf("SMTP %s %s %s\r\n%s\r\n", conf.smtphost, conf.mailfrom, conf.mailto[num], buf);
okini3939 2:a3e5edf84f74 136 #endif
okini3939 0:bdb53686c194 137
okini3939 3:058292da2cee 138 host.setName(conf.smtphost);
okini3939 3:058292da2cee 139 host.setPort(conf.smtpport);
okini3939 3:058292da2cee 140 return sendmail(conf.mailfrom, conf.mailto[num], buf, &host, conf.smtpuser, conf.smtppwd);
okini3939 0:bdb53686c194 141 #endif
okini3939 0:bdb53686c194 142 }
okini3939 0:bdb53686c194 143
okini3939 2:a3e5edf84f74 144 int ntp (char *hostname) {
okini3939 0:bdb53686c194 145 #ifdef USE_NTP
okini3939 2:a3e5edf84f74 146 time_t sec;
okini3939 2:a3e5edf84f74 147
okini3939 2:a3e5edf84f74 148 if (! ethernet_flg) return 0;
okini3939 2:a3e5edf84f74 149 pc.printf("NTP: %s\r\n", hostname);
okini3939 2:a3e5edf84f74 150
okini3939 2:a3e5edf84f74 151 if (! ntpdate(hostname, &sec)) {
okini3939 2:a3e5edf84f74 152 sec = sec + (60 * 60 * TIMEZONE);
okini3939 2:a3e5edf84f74 153 set_time(sec);
okini3939 2:a3e5edf84f74 154 #ifdef DEBUG
okini3939 2:a3e5edf84f74 155 pc.printf("NTP success %s\r\n", ctime(&sec));
okini3939 2:a3e5edf84f74 156 #endif
okini3939 2:a3e5edf84f74 157 } else {
okini3939 2:a3e5edf84f74 158 pc.printf("NTP failure\r\n");
okini3939 2:a3e5edf84f74 159 return -1;
okini3939 2:a3e5edf84f74 160 }
okini3939 2:a3e5edf84f74 161
okini3939 2:a3e5edf84f74 162 /*
okini3939 2:a3e5edf84f74 163 // NTPClient ntp;
okini3939 0:bdb53686c194 164 Host ntpserver;
okini3939 0:bdb53686c194 165 NTPResult ret;
okini3939 0:bdb53686c194 166 time_t sec;
okini3939 0:bdb53686c194 167
okini3939 0:bdb53686c194 168 if (! ethernet_flg) return 0;
okini3939 2:a3e5edf84f74 169 pc.printf("NTP: %s\r\n", hostname);
okini3939 0:bdb53686c194 170
okini3939 1:6c7141895545 171 LED_NET_ACT_ON;
okini3939 0:bdb53686c194 172 ntpserver.setName(hostname);
okini3939 0:bdb53686c194 173 ntpserver.setPort(123);
okini3939 0:bdb53686c194 174
okini3939 2:a3e5edf84f74 175 ret = ntp->setTime(ntpserver);
okini3939 0:bdb53686c194 176 if (ret == NTP_OK) {
okini3939 0:bdb53686c194 177 sec = time(NULL) + (60 * 60 * TIMEZONE);
okini3939 0:bdb53686c194 178 set_time(sec);
okini3939 0:bdb53686c194 179 }
okini3939 0:bdb53686c194 180
okini3939 0:bdb53686c194 181 if (ret != NTP_OK) {
okini3939 0:bdb53686c194 182 pc.printf("NTP failure: %d\r\n", ret);
okini3939 0:bdb53686c194 183 return -1;
okini3939 0:bdb53686c194 184 #ifdef DEBUG
okini3939 0:bdb53686c194 185 } else {
okini3939 0:bdb53686c194 186 pc.printf("NTP success %s\r\n", ctime(&sec));
okini3939 0:bdb53686c194 187 #endif
okini3939 0:bdb53686c194 188 }
okini3939 2:a3e5edf84f74 189 */
okini3939 0:bdb53686c194 190 #endif
okini3939 0:bdb53686c194 191 return 0;
okini3939 0:bdb53686c194 192 }
okini3939 0:bdb53686c194 193
okini3939 0:bdb53686c194 194 int init_net () {
okini3939 0:bdb53686c194 195 EthernetErr ethErr;
okini3939 0:bdb53686c194 196
okini3939 0:bdb53686c194 197 eth_link.mode(PullUp);
okini3939 0:bdb53686c194 198 eth_speed.mode(PullUp);
okini3939 0:bdb53686c194 199
okini3939 2:a3e5edf84f74 200 if (conf.ipaddr[0]) {
okini3939 0:bdb53686c194 201
okini3939 1:6c7141895545 202 if (! eth_link) {
okini3939 1:6c7141895545 203 LED_NET_G_ON;
okini3939 1:6c7141895545 204 }
okini3939 1:6c7141895545 205 LED_NET_ACT_ON;
okini3939 1:6c7141895545 206
okini3939 2:a3e5edf84f74 207 if (conf.ipaddr[0] == 255) {
okini3939 0:bdb53686c194 208 // dhcp ip address
okini3939 0:bdb53686c194 209 eth = new EthernetNetIf;
okini3939 0:bdb53686c194 210 } else {
okini3939 0:bdb53686c194 211 // static ip address
okini3939 2:a3e5edf84f74 212 eth = new EthernetNetIf(conf.ipaddr, conf.netmask, conf.gateway, conf.nameserver);
okini3939 0:bdb53686c194 213 }
okini3939 0:bdb53686c194 214
okini3939 0:bdb53686c194 215 ethErr = eth->setup();
okini3939 0:bdb53686c194 216 if (ethErr) {
okini3939 0:bdb53686c194 217 // error
okini3939 1:6c7141895545 218 LED_NET_Y_ON;
okini3939 0:bdb53686c194 219 return -1;
okini3939 0:bdb53686c194 220 }
okini3939 0:bdb53686c194 221
okini3939 0:bdb53686c194 222 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 223 ethernet_flg = 1;
okini3939 0:bdb53686c194 224 pool_net();
okini3939 0:bdb53686c194 225
okini3939 2:a3e5edf84f74 226 #ifdef USE_HTTP
okini3939 2:a3e5edf84f74 227 // http = new HTTPClient;
okini3939 2:a3e5edf84f74 228 #endif
okini3939 2:a3e5edf84f74 229 // ntp = new NTPClient;
okini3939 0:bdb53686c194 230 }
okini3939 0:bdb53686c194 231
okini3939 2:a3e5edf84f74 232 if (conf.ntpserver[0]) {
okini3939 2:a3e5edf84f74 233 ntp(conf.ntpserver);
okini3939 0:bdb53686c194 234 }
okini3939 0:bdb53686c194 235
okini3939 2:a3e5edf84f74 236 if (conf.snmp_commname[0]) {
okini3939 2:a3e5edf84f74 237 snmp_init(conf.snmp_commname);
okini3939 0:bdb53686c194 238 }
okini3939 0:bdb53686c194 239
okini3939 0:bdb53686c194 240 return 0;
okini3939 0:bdb53686c194 241 }
okini3939 0:bdb53686c194 242
okini3939 0:bdb53686c194 243 void pool_net () {
okini3939 0:bdb53686c194 244
okini3939 0:bdb53686c194 245 if (ethernet_flg) {
okini3939 0:bdb53686c194 246 Net::poll();
okini3939 0:bdb53686c194 247
okini3939 1:6c7141895545 248 if (! eth_link) {
okini3939 1:6c7141895545 249 LED_NET_G_ON;
okini3939 1:6c7141895545 250 } else {
okini3939 1:6c7141895545 251 LED_NET_GY_OFF;
okini3939 1:6c7141895545 252 }
okini3939 0:bdb53686c194 253 }
okini3939 0:bdb53686c194 254 }