http://mbed.org/users/okini3939/notebook/tsutenkaku/

Dependencies:   GSwifi (old) WDT mbed

Fork of GSwifi_denki-yohou by Suga koubou

Committer:
okini3939
Date:
Wed Oct 17 13:43:52 2012 +0000
Revision:
2:8646918ffff2
Parent:
1:beff52210994
1st build

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:d8a2cab7091c 1 #include "mbed.h"
okini3939 0:d8a2cab7091c 2 #include "GSwifi.h"
okini3939 0:d8a2cab7091c 3 #include "7seg.h"
okini3939 2:8646918ffff2 4 #include "WDT.h"
okini3939 0:d8a2cab7091c 5
okini3939 2:8646918ffff2 6 #define HTTP_HOST "www.jma.go.jp"
okini3939 2:8646918ffff2 7 #define HTTP_URI "/en/yoho/331.html"
okini3939 1:beff52210994 8 #define NTP_HOST "ntp1.sakura.ad.jp"
okini3939 0:d8a2cab7091c 9
okini3939 2:8646918ffff2 10 #define SECURE GSSEC_WPA2_PSK
okini3939 2:8646918ffff2 11 #define SSID "SSID"
okini3939 2:8646918ffff2 12 #define PASS "password"
okini3939 2:8646918ffff2 13
okini3939 0:d8a2cab7091c 14 #define VREF 3.3
okini3939 0:d8a2cab7091c 15 #define B 3435 // thermistor B
okini3939 0:d8a2cab7091c 16 #define T0 25.0
okini3939 0:d8a2cab7091c 17 #define R0 10000.0 // R0 ohm
okini3939 0:d8a2cab7091c 18 #define RU 10000.0 // pullup ohm
okini3939 0:d8a2cab7091c 19
okini3939 0:d8a2cab7091c 20 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:d8a2cab7091c 21 Serial pc(USBTX, USBRX);
okini3939 0:d8a2cab7091c 22 GSwifi gs(p13, p14, p12, P0_22); // TX, RX, CTS, RTS
okini3939 0:d8a2cab7091c 23 DigitalOut gs_reset(p9), gs_wakeup(p10);
okini3939 0:d8a2cab7091c 24 DigitalOut led1(LED1);
okini3939 0:d8a2cab7091c 25 PwmOut led2(LED2), led3(LED3), led4(LED4);
okini3939 2:8646918ffff2 26 DigitalOut bz(p13);
okini3939 0:d8a2cab7091c 27 #elif defined(TARGET_LPC11U24)
okini3939 0:d8a2cab7091c 28 GSwifi gs(p9, p10, p21, p22); // TX, RX, CTS, RTS
okini3939 2:8646918ffff2 29 DigitalOut gs_reset(P1_14), gs_wakeup(P1_3);
okini3939 2:8646918ffff2 30 //DigitalOut gs_reset(p15), gs_wakeup(p14);
okini3939 0:d8a2cab7091c 31 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
okini3939 2:8646918ffff2 32 DigitalOut bz(p13);
okini3939 0:d8a2cab7091c 33 #endif
okini3939 0:d8a2cab7091c 34
okini3939 2:8646918ffff2 35 volatile int weather_count = 0, weather_data = 0, weather_flg = 0;
okini3939 0:d8a2cab7091c 36 volatile int year, month, day, hour, minute;
okini3939 2:8646918ffff2 37 volatile int remote_flg = 0;
okini3939 0:d8a2cab7091c 38
okini3939 0:d8a2cab7091c 39 AnalogIn adtemp(p20);
okini3939 2:8646918ffff2 40 Watchdog wdt;
okini3939 2:8646918ffff2 41
okini3939 2:8646918ffff2 42 extern "C" void HardFault_Handler() {
okini3939 2:8646918ffff2 43 register unsigned int _msp __asm("msp");
okini3939 2:8646918ffff2 44 printf("Hard Fault! address: %08x\n", *((unsigned int *)(_msp + 24)));
okini3939 2:8646918ffff2 45 while(1);
okini3939 2:8646918ffff2 46 }
okini3939 2:8646918ffff2 47
okini3939 2:8646918ffff2 48 int weather_info (char *buf) {
okini3939 2:8646918ffff2 49 int i, w = 0;
okini3939 2:8646918ffff2 50 char *tmp = NULL;
okini3939 2:8646918ffff2 51
okini3939 2:8646918ffff2 52 for (i = 0; i < strlen(buf); i ++) {
okini3939 2:8646918ffff2 53 if (buf[i] == ',') {
okini3939 2:8646918ffff2 54 buf[i] = 0;
okini3939 2:8646918ffff2 55 tmp = &buf[i + 1];
okini3939 2:8646918ffff2 56 } else
okini3939 2:8646918ffff2 57 if (buf[i] == '<') {
okini3939 2:8646918ffff2 58 buf[i] = 0;
okini3939 2:8646918ffff2 59 break;
okini3939 2:8646918ffff2 60 }
okini3939 2:8646918ffff2 61 }
okini3939 2:8646918ffff2 62
okini3939 2:8646918ffff2 63 if (tmp) {
okini3939 2:8646918ffff2 64 } else
okini3939 2:8646918ffff2 65 if (strstr(buf, "PARTLY CLOUDY")) {
okini3939 2:8646918ffff2 66 return 0x73; // WY
okini3939 2:8646918ffff2 67 } else
okini3939 2:8646918ffff2 68 if (strstr(buf, "MOSTLY CLOUDY")) {
okini3939 2:8646918ffff2 69 return 0x37; // YW
okini3939 2:8646918ffff2 70 }
okini3939 2:8646918ffff2 71
okini3939 2:8646918ffff2 72 if (strstr(buf, "CLEAR")) {
okini3939 2:8646918ffff2 73 w = 0x70; // W
okini3939 2:8646918ffff2 74 } else
okini3939 2:8646918ffff2 75 if (strstr(buf, "CLOUDY")) {
okini3939 2:8646918ffff2 76 w = 0x30; // Y
okini3939 2:8646918ffff2 77 } else
okini3939 2:8646918ffff2 78 if (strstr(buf, "RAIN") || strstr(buf, "SHOWERS")) {
okini3939 2:8646918ffff2 79 w = 0x40; // B
okini3939 2:8646918ffff2 80 } else
okini3939 2:8646918ffff2 81 if (strstr(buf, "SNOW")) {
okini3939 2:8646918ffff2 82 w = 0x60; // P
okini3939 2:8646918ffff2 83 }
okini3939 2:8646918ffff2 84
okini3939 2:8646918ffff2 85 if (tmp) {
okini3939 2:8646918ffff2 86 if (strstr(tmp, "CLEAR") || strstr(tmp, "PARTLY CLOUDY")) {
okini3939 2:8646918ffff2 87 w |= 0x07; // W
okini3939 2:8646918ffff2 88 } else
okini3939 2:8646918ffff2 89 if (strstr(tmp, "CLOUDY")) {
okini3939 2:8646918ffff2 90 w |= 0x03; // Y
okini3939 2:8646918ffff2 91 } else
okini3939 2:8646918ffff2 92 if (strstr(tmp, "RAIN") || strstr(tmp, "SHOWERS")) {
okini3939 2:8646918ffff2 93 w |= 0x04; // B
okini3939 2:8646918ffff2 94 } else
okini3939 2:8646918ffff2 95 if (strstr(tmp, "SNOW")) {
okini3939 2:8646918ffff2 96 w |= 0x06; // P
okini3939 2:8646918ffff2 97 }
okini3939 2:8646918ffff2 98 } else {
okini3939 2:8646918ffff2 99 w |= (w >> 4);
okini3939 2:8646918ffff2 100 }
okini3939 2:8646918ffff2 101
okini3939 2:8646918ffff2 102 return w;
okini3939 2:8646918ffff2 103 }
okini3939 0:d8a2cab7091c 104
okini3939 1:beff52210994 105 void callback_http (int cid, int len) {
okini3939 0:d8a2cab7091c 106 static int n = 0;
okini3939 2:8646918ffff2 107 static char buf[20], data[100];
okini3939 0:d8a2cab7091c 108 int i;
okini3939 0:d8a2cab7091c 109 int last = len;
okini3939 0:d8a2cab7091c 110
okini3939 2:8646918ffff2 111 while (last) {
okini3939 2:8646918ffff2 112 len = gs.recv(cid, buf, last < sizeof(buf) ? last : sizeof(buf));
okini3939 2:8646918ffff2 113 if (len == 0) break;
okini3939 2:8646918ffff2 114 last = last - len;
okini3939 0:d8a2cab7091c 115
okini3939 2:8646918ffff2 116 for (i = 0; i < len; i ++) {
okini3939 2:8646918ffff2 117 if (buf[i] == '\r') continue;
okini3939 0:d8a2cab7091c 118
okini3939 0:d8a2cab7091c 119 // body
okini3939 0:d8a2cab7091c 120 if (buf[i] == '\n') {
okini3939 2:8646918ffff2 121 // end of line
okini3939 0:d8a2cab7091c 122 data[n] = 0;
okini3939 2:8646918ffff2 123 if (strstr(data, "class=\"info")) {
okini3939 2:8646918ffff2 124 n = weather_info(&data[17]);
okini3939 2:8646918ffff2 125 weather_flg ++;
okini3939 2:8646918ffff2 126 if (n && weather_flg == 2) {
okini3939 2:8646918ffff2 127 weather_data = n;
okini3939 0:d8a2cab7091c 128 }
okini3939 0:d8a2cab7091c 129 }
okini3939 0:d8a2cab7091c 130 n = 0;
okini3939 0:d8a2cab7091c 131 } else {
okini3939 0:d8a2cab7091c 132 // data
okini3939 0:d8a2cab7091c 133 if (n < sizeof(data) - 1) {
okini3939 0:d8a2cab7091c 134 data[n] = buf[i];
okini3939 0:d8a2cab7091c 135 n ++;
okini3939 0:d8a2cab7091c 136 }
okini3939 0:d8a2cab7091c 137 }
okini3939 0:d8a2cab7091c 138
okini3939 2:8646918ffff2 139 }
okini3939 0:d8a2cab7091c 140
okini3939 2:8646918ffff2 141 }
okini3939 0:d8a2cab7091c 142 }
okini3939 0:d8a2cab7091c 143
okini3939 0:d8a2cab7091c 144 float get_temp () {
okini3939 1:beff52210994 145 float v, r, t;
okini3939 0:d8a2cab7091c 146
okini3939 0:d8a2cab7091c 147 v = adtemp * VREF;
okini3939 0:d8a2cab7091c 148 r = v / ((VREF - v) / RU);
okini3939 0:d8a2cab7091c 149 t = (1.0 / ((1.0 / (T0 + 273.15)) + (log(r / R0) / B))) - 273.15;
okini3939 0:d8a2cab7091c 150 if (t < -50) t = 0;
okini3939 0:d8a2cab7091c 151 return t;
okini3939 0:d8a2cab7091c 152 }
okini3939 0:d8a2cab7091c 153
okini3939 0:d8a2cab7091c 154 void Sleep () {
okini3939 0:d8a2cab7091c 155 __WFI();
okini3939 0:d8a2cab7091c 156 }
okini3939 0:d8a2cab7091c 157
okini3939 0:d8a2cab7091c 158 int main() {
okini3939 2:8646918ffff2 159 int flg = 0, r;
okini3939 1:beff52210994 160 Host host, ntp;
okini3939 0:d8a2cab7091c 161 int count = 0;
okini3939 1:beff52210994 162 time_t time;
okini3939 1:beff52210994 163 struct tm *t;
okini3939 0:d8a2cab7091c 164
okini3939 0:d8a2cab7091c 165 initled();
okini3939 0:d8a2cab7091c 166 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:d8a2cab7091c 167 pc.baud(115200);
okini3939 0:d8a2cab7091c 168 #endif
okini3939 2:8646918ffff2 169 bz = 1;
okini3939 0:d8a2cab7091c 170 gs_reset = 0;
okini3939 0:d8a2cab7091c 171 gs_wakeup = 1;
okini3939 0:d8a2cab7091c 172 wait_ms(100);
okini3939 0:d8a2cab7091c 173 gs_reset = 1;
okini3939 0:d8a2cab7091c 174 wait_ms(500);
okini3939 0:d8a2cab7091c 175 led1 = 1;
okini3939 0:d8a2cab7091c 176
okini3939 2:8646918ffff2 177 startled();
okini3939 2:8646918ffff2 178 writeled5(0, 18, 1); // i
okini3939 2:8646918ffff2 179 writeled5(1, 23, 1); // n
okini3939 2:8646918ffff2 180 writeled5(2, 18, 1); // i
okini3939 2:8646918ffff2 181 writeled5(3, 29, 1); // t
okini3939 2:8646918ffff2 182
okini3939 2:8646918ffff2 183 if (gs.connect(SECURE, SSID, PASS, 1)) {
okini3939 2:8646918ffff2 184 writeled5(0, 14, 1); // e
okini3939 2:8646918ffff2 185 writeled5(1, 27, 1); // r
okini3939 2:8646918ffff2 186 writeled5(2, 27, 1); // r
okini3939 2:8646918ffff2 187 writeled5(3, 0, 0); //
okini3939 2:8646918ffff2 188 writeled5(4, 2, 0); // R
okini3939 2:8646918ffff2 189 writeled5(5, 2, 0); // R
okini3939 2:8646918ffff2 190 for (;;) Sleep();
okini3939 0:d8a2cab7091c 191 }
okini3939 0:d8a2cab7091c 192
okini3939 2:8646918ffff2 193 wdt.init(8);
okini3939 2:8646918ffff2 194
okini3939 2:8646918ffff2 195 host.setName(HTTP_HOST);
okini3939 1:beff52210994 196 ntp.setName(NTP_HOST);
okini3939 2:8646918ffff2 197
okini3939 1:beff52210994 198 gs.ntpdate(ntp, 0);
okini3939 2:8646918ffff2 199 wait(10);
okini3939 1:beff52210994 200 gs.ntpdate(ntp, 3 * 60 * 60);
okini3939 1:beff52210994 201
okini3939 0:d8a2cab7091c 202 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:d8a2cab7091c 203 pc.printf("Denki-yohou: %s\r\n", HTTP_HOST);
okini3939 0:d8a2cab7091c 204 #endif
okini3939 0:d8a2cab7091c 205
okini3939 0:d8a2cab7091c 206 while(1) {
okini3939 0:d8a2cab7091c 207 gs.poll();
okini3939 2:8646918ffff2 208 wdt.kick();
okini3939 0:d8a2cab7091c 209
okini3939 2:8646918ffff2 210 if (flg == 0) {
okini3939 2:8646918ffff2 211 if (gs.isConnected()) {
okini3939 2:8646918ffff2 212 flg = 180;
okini3939 2:8646918ffff2 213 led2 = 1;
okini3939 2:8646918ffff2 214
okini3939 2:8646918ffff2 215 // Weather
okini3939 2:8646918ffff2 216 if (weather_count == 0) {
okini3939 2:8646918ffff2 217 weather_flg = 0;
okini3939 2:8646918ffff2 218 r = gs.httpGet(host, HTTP_URI, 0, &callback_http);
okini3939 2:8646918ffff2 219 if (r >= 0) {
okini3939 2:8646918ffff2 220 led3 = 0;
okini3939 2:8646918ffff2 221 } else {
okini3939 2:8646918ffff2 222 led3 = 1;
okini3939 2:8646918ffff2 223 }
okini3939 2:8646918ffff2 224 gs.poll();
okini3939 2:8646918ffff2 225 weather_count = 20;
okini3939 2:8646918ffff2 226 } else {
okini3939 2:8646918ffff2 227 weather_count --;
okini3939 0:d8a2cab7091c 228 }
okini3939 1:beff52210994 229
okini3939 2:8646918ffff2 230 wdt.kick();
okini3939 2:8646918ffff2 231 wait(3);
okini3939 2:8646918ffff2 232 gs.poll();
okini3939 2:8646918ffff2 233 wdt.kick();
okini3939 2:8646918ffff2 234
okini3939 2:8646918ffff2 235 // NTP date
okini3939 2:8646918ffff2 236 r = gs.getTime();
okini3939 2:8646918ffff2 237 if (r) {
okini3939 2:8646918ffff2 238 time = r + (9 * 3600); // JST
okini3939 2:8646918ffff2 239 }
okini3939 2:8646918ffff2 240
okini3939 2:8646918ffff2 241 led2 = 0;
okini3939 2:8646918ffff2 242 wdt.kick();
okini3939 2:8646918ffff2 243 } else {
okini3939 2:8646918ffff2 244 // re-connected
okini3939 2:8646918ffff2 245 led2 = 1;
okini3939 2:8646918ffff2 246 if (gs.connect(SECURE, SSID, PASS, 1)) {
okini3939 2:8646918ffff2 247 led4 = 1;
okini3939 0:d8a2cab7091c 248 } else {
okini3939 2:8646918ffff2 249 led4 = 0;
okini3939 0:d8a2cab7091c 250 }
okini3939 2:8646918ffff2 251 led2 = 0;
okini3939 2:8646918ffff2 252 }
okini3939 0:d8a2cab7091c 253 }
okini3939 0:d8a2cab7091c 254
okini3939 0:d8a2cab7091c 255 if (count == 0) { // 0sec
okini3939 1:beff52210994 256 // time
okini3939 1:beff52210994 257 t = localtime(&time);
okini3939 1:beff52210994 258 writeled(t->tm_hour * 100 + t->tm_min, 2, 0x0f, 0x0f);
okini3939 2:8646918ffff2 259 writeled5(4, weather_data & 0x07, 0);
okini3939 2:8646918ffff2 260 writeled5(5, (weather_data >> 4) & 0x07, 0);
okini3939 2:8646918ffff2 261 remote_flg = 0;
okini3939 0:d8a2cab7091c 262 } else
okini3939 2:8646918ffff2 263 if (count > 0 /* && count < 6000 */ && !remote_flg) {
okini3939 1:beff52210994 264 // time blink
okini3939 1:beff52210994 265 if (count % 400 == 0) { // 0sec
okini3939 1:beff52210994 266 writeled(t->tm_hour * 100 + t->tm_min, 2, 0x0f, 0x0f);
okini3939 1:beff52210994 267 } else
okini3939 1:beff52210994 268 if (count % 400 == 200) { // 0.1sec
okini3939 1:beff52210994 269 writeled(t->tm_hour * 100 + t->tm_min, 0, 0x0f, 0x0f);
okini3939 1:beff52210994 270 }
okini3939 2:8646918ffff2 271 /*
okini3939 1:beff52210994 272 } else
okini3939 1:beff52210994 273 if (count == 6000) { // 15sec
okini3939 1:beff52210994 274 // temp.
okini3939 2:8646918ffff2 275 writeled(get_temp() * 100, 2, 0x0e, 0);
okini3939 2:8646918ffff2 276 writeled5(3, 12, 1);
okini3939 2:8646918ffff2 277 */
okini3939 0:d8a2cab7091c 278 }
okini3939 0:d8a2cab7091c 279
okini3939 2:8646918ffff2 280 if (count % 400 == 0) { // every 0sec
okini3939 0:d8a2cab7091c 281 led1 = 1;
okini3939 2:8646918ffff2 282
okini3939 2:8646918ffff2 283 // oclock buzzer
okini3939 2:8646918ffff2 284 t = localtime(&time);
okini3939 2:8646918ffff2 285 if (t->tm_min == 0) {
okini3939 2:8646918ffff2 286 if (t->tm_sec == 0) {
okini3939 2:8646918ffff2 287 bz = 0;
okini3939 2:8646918ffff2 288 } else
okini3939 2:8646918ffff2 289 if (t->tm_sec == 1) {
okini3939 2:8646918ffff2 290 bz = 1;
okini3939 2:8646918ffff2 291 }
okini3939 2:8646918ffff2 292 }
okini3939 0:d8a2cab7091c 293 } else
okini3939 2:8646918ffff2 294 if (count % 400 == 10) { // every 0.1sec
okini3939 0:d8a2cab7091c 295 led1 = 0;
okini3939 1:beff52210994 296
okini3939 1:beff52210994 297 time ++;
okini3939 2:8646918ffff2 298 if (flg) flg --;
okini3939 0:d8a2cab7091c 299 }
okini3939 0:d8a2cab7091c 300
okini3939 1:beff52210994 301 count ++;
okini3939 1:beff52210994 302 if (count >= 8000) count = 0; // 20sec
okini3939 1:beff52210994 303
okini3939 0:d8a2cab7091c 304 Sleep();
okini3939 0:d8a2cab7091c 305 }
okini3939 0:d8a2cab7091c 306 }