http://mbed.org/users/okini3939/notebook/tsutenkaku/
Dependencies: GSwifi (old) WDT mbed
Fork of GSwifi_denki-yohou by
Revision 2:8646918ffff2, committed 2012-10-17
- Comitter:
- okini3939
- Date:
- Wed Oct 17 13:43:52 2012 +0000
- Parent:
- 1:beff52210994
- Commit message:
- 1st build
Changed in this revision
diff -r beff52210994 -r 8646918ffff2 7seg.cpp --- a/7seg.cpp Wed Sep 05 00:51:19 2012 +0000 +++ b/7seg.cpp Wed Oct 17 13:43:52 2012 +0000 @@ -1,12 +1,19 @@ #include "mbed.h" #include "7seg.h" +#define LED_NUM 6 +#define DIGITS_NUM 37 + +const int digits[DIGITS_NUM] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, // 0-9 + 0x77, 0x7c, 0x58, 0x5e, 0x79, 0x71, 0x3d, 0x74, 0x04, 0x1e, // a-j + 0x76, 0x38, 0x54, 0x54, 0x5c, 0x73, 0x67, 0x50, 0x6d, 0x78, // k-t + 0x1c, 0x1c, 0x1c, 0x76, 0x6e, 0x5b, 0x40}; // u-z,- + static DigitalOut led_k[8] = {p34, p36, p26, p24, p23, p35, p30, p25}; -static DigitalOut led_a[4] = {p16, p17, p18, p19}; +static DigitalOut led_a[LED_NUM] = {p16, p17, p18, p19, p15, p14}; static Ticker tick; -static int ledbuf[4] = {-1, -1, -1, -1}; -const int digits[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; +static int ledbuf[LED_NUM]; void leddisp () { static int n = 0; @@ -19,40 +26,37 @@ led_a[n] = 1; // common off n ++; - if (n >= 4) n = 0; + if (n >= LED_NUM) n = 0; // led on - if (ledbuf[n] >= 0) { - bit = 1; - for (i = 0; i < 7; i ++) { - led_k[i] = digits[ledbuf[n] & 0x7f] & bit ? 0 : 1; - bit = bit << 1; - } - led_k[7] = ledbuf[n] & 0x80 ? 0 : 1; + bit = 1; + for (i = 0; i < 8; i ++) { + led_k[i] = ledbuf[n] & bit ? 0 : 1; + bit = bit << 1; } led_a[n] = 0; // common on } void writeled (int num, int dot, int mask, int zero) { if (((num >= 1000) || (zero & 0x08)) && (mask & 0x08)) { - ledbuf[0] = num / 1000 % 10; + ledbuf[0] = digits[num / 1000 % 10]; } else { - ledbuf[0] = -1; + ledbuf[0] = 0; } if (((num >= 100) || (zero & 0x04)) && (mask & 0x04)) { - ledbuf[1] = (num / 100) % 10; + ledbuf[1] = digits[(num / 100) % 10]; } else { - ledbuf[1] = -1; + ledbuf[1] = 0; } if (((num >= 10) || (zero & 0x02)) && (mask & 0x02)) { - ledbuf[2] = (num / 10) % 10; + ledbuf[2] = digits[(num / 10) % 10]; } else { - ledbuf[2] = -1; + ledbuf[2] = 0; } if (mask & 0x01) { - ledbuf[3] = num % 10; + ledbuf[3] = digits[num % 10]; } else { - ledbuf[3] = -1; + ledbuf[3] = 0; } if (dot >= 1 && dot <= 4) { @@ -60,11 +64,20 @@ } } +void writeled5 (int n, int d, int f) { + if (f) { + ledbuf[n] = digits[d]; + } else { + ledbuf[n] = d; + } +} + void initled () { int i; - for (i = 0; i < 4; i ++) { + for (i = 0; i < LED_NUM; i ++) { led_a[i] = 1; + ledbuf[i] = 0; } for (i = 0; i < 8; i ++) { led_k[i] = 1;
diff -r beff52210994 -r 8646918ffff2 7seg.h --- a/7seg.h Wed Sep 05 00:51:19 2012 +0000 +++ b/7seg.h Wed Oct 17 13:43:52 2012 +0000 @@ -1,4 +1,5 @@ void writeled (int num, int dot, int mask, int zero); +void writeled5 (int n, int d, int f); void initled (); void startled ();
diff -r beff52210994 -r 8646918ffff2 GSwifi.lib --- a/GSwifi.lib Wed Sep 05 00:51:19 2012 +0000 +++ b/GSwifi.lib Wed Oct 17 13:43:52 2012 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/gsfan/code/GSwifi/#983f4e832a3e +http://mbed.org/users/gsfan/code/GSwifi/#5febfc399099
diff -r beff52210994 -r 8646918ffff2 WDT.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WDT.lib Wed Oct 17 13:43:52 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/okini3939/code/WDT/#f7baa89f84bc
diff -r beff52210994 -r 8646918ffff2 main.cpp --- a/main.cpp Wed Sep 05 00:51:19 2012 +0000 +++ b/main.cpp Wed Oct 17 13:43:52 2012 +0000 @@ -1,13 +1,16 @@ #include "mbed.h" #include "GSwifi.h" #include "7seg.h" +#include "WDT.h" -#define HTTP_HOST "www.kepco.co.jp" -#define HTTP_URI "/yamasou/juyo1_kansai.csv" -#define SSID "ROBOBA" -#define PASS "roboba1234567" +#define HTTP_HOST "www.jma.go.jp" +#define HTTP_URI "/en/yoho/331.html" #define NTP_HOST "ntp1.sakura.ad.jp" +#define SECURE GSSEC_WPA2_PSK +#define SSID "SSID" +#define PASS "password" + #define VREF 3.3 #define B 3435 // thermistor B #define T0 25.0 @@ -20,74 +23,111 @@ DigitalOut gs_reset(p9), gs_wakeup(p10); DigitalOut led1(LED1); PwmOut led2(LED2), led3(LED3), led4(LED4); +DigitalOut bz(p13); #elif defined(TARGET_LPC11U24) GSwifi gs(p9, p10, p21, p22); // TX, RX, CTS, RTS -//DigitalOut gs_reset(P1_14), gs_wakeup(P1_3); -DigitalOut gs_reset(p15), gs_wakeup(p14); +DigitalOut gs_reset(P1_14), gs_wakeup(P1_3); +//DigitalOut gs_reset(p15), gs_wakeup(p14); DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); +DigitalOut bz(p13); #endif -volatile int denki_flg = 0; -volatile int denki_capacity = 0; -volatile int denki_usage = 0; +volatile int weather_count = 0, weather_data = 0, weather_flg = 0; volatile int year, month, day, hour, minute; +volatile int remote_flg = 0; AnalogIn adtemp(p20); +Watchdog wdt; + +extern "C" void HardFault_Handler() { + register unsigned int _msp __asm("msp"); + printf("Hard Fault! address: %08x\n", *((unsigned int *)(_msp + 24))); + while(1); +} + +int weather_info (char *buf) { + int i, w = 0; + char *tmp = NULL; + + for (i = 0; i < strlen(buf); i ++) { + if (buf[i] == ',') { + buf[i] = 0; + tmp = &buf[i + 1]; + } else + if (buf[i] == '<') { + buf[i] = 0; + break; + } + } + + if (tmp) { + } else + if (strstr(buf, "PARTLY CLOUDY")) { + return 0x73; // WY + } else + if (strstr(buf, "MOSTLY CLOUDY")) { + return 0x37; // YW + } + + if (strstr(buf, "CLEAR")) { + w = 0x70; // W + } else + if (strstr(buf, "CLOUDY")) { + w = 0x30; // Y + } else + if (strstr(buf, "RAIN") || strstr(buf, "SHOWERS")) { + w = 0x40; // B + } else + if (strstr(buf, "SNOW")) { + w = 0x60; // P + } + + if (tmp) { + if (strstr(tmp, "CLEAR") || strstr(tmp, "PARTLY CLOUDY")) { + w |= 0x07; // W + } else + if (strstr(tmp, "CLOUDY")) { + w |= 0x03; // Y + } else + if (strstr(tmp, "RAIN") || strstr(tmp, "SHOWERS")) { + w |= 0x04; // B + } else + if (strstr(tmp, "SNOW")) { + w |= 0x06; // P + } + } else { + w |= (w >> 4); + } + + return w; +} void callback_http (int cid, int len) { static int n = 0; -// static char buf[1024], data[80]; - static char buf[200], data[100]; + static char buf[20], data[100]; int i; int last = len; - while (last) { - len = gs.recv(cid, buf, last < sizeof(buf) ? last : sizeof(buf)); - last = last - len; - - for (i = 0; i < len; i ++) { - if (buf[i] == '\r') continue; + while (last) { + len = gs.recv(cid, buf, last < sizeof(buf) ? last : sizeof(buf)); + if (len == 0) break; + last = last - len; - if (denki_flg <= 1) { - // header - if (strncmp(buf, "200 OK", 6) == 0) { - i += 7; - denki_flg = 2; - } - continue; - } + for (i = 0; i < len; i ++) { + if (buf[i] == '\r') continue; // body if (buf[i] == '\n') { + // end of line data[n] = 0; - switch (denki_flg) { - case 2: - // update - break; - case 4: - // capacity - if (data[0] >= '0' && data[0] <= '9') { - denki_capacity = atoi(data); + if (strstr(data, "class=\"info")) { + n = weather_info(&data[17]); + weather_flg ++; + if (n && weather_flg == 2) { + weather_data = n; } - break; - case 7: - // yosou1 - break; - case 10: - // yosou2 - break; - default: - // text - if (data[0] == 'D' && data[1] == 'A') { - denki_flg = denki_flg < 100 ? 100 : 200; - } - break; - } - if (denki_flg > 200 && data[n - 1] >= '0' && data[n - 1] <= '9') { - sscanf(data, "%d/%d/%d,%d:%d,%d", &year, &month, &day, &hour, &minute, &denki_usage); } n = 0; - denki_flg ++; } else { // data if (n < sizeof(data) - 1) { @@ -96,9 +136,9 @@ } } - } + } - } + } } float get_temp () { @@ -116,8 +156,7 @@ } int main() { - int flg = 1, r; - float denki_percentage = 0; + int flg = 0, r; Host host, ntp; int count = 0; time_t time; @@ -127,6 +166,7 @@ #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) pc.baud(115200); #endif + bz = 1; gs_reset = 0; gs_wakeup = 1; wait_ms(100); @@ -134,64 +174,93 @@ wait_ms(500); led1 = 1; - if (gs.connect(GSSEC_WPA2_PSK, SSID, PASS, 1)) { - return -1; + startled(); + writeled5(0, 18, 1); // i + writeled5(1, 23, 1); // n + writeled5(2, 18, 1); // i + writeled5(3, 29, 1); // t + + if (gs.connect(SECURE, SSID, PASS, 1)) { + writeled5(0, 14, 1); // e + writeled5(1, 27, 1); // r + writeled5(2, 27, 1); // r + writeled5(3, 0, 0); // + writeled5(4, 2, 0); // R + writeled5(5, 2, 0); // R + for (;;) Sleep(); } + wdt.init(8); + + host.setName(HTTP_HOST); ntp.setName(NTP_HOST); + gs.ntpdate(ntp, 0); - wait(15); + wait(10); gs.ntpdate(ntp, 3 * 60 * 60); #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) pc.printf("Denki-yohou: %s\r\n", HTTP_HOST); #endif - host.setName(HTTP_HOST); - startled(); while(1) { gs.poll(); + wdt.kick(); - if (flg || gs.getStatus() == GSSTAT_WAKEUP) { - led1 = 1; - if (gs.getStatus() == GSSTAT_WAKEUP) { - gs.wakeup(); + if (flg == 0) { + if (gs.isConnected()) { + flg = 180; + led2 = 1; + + // Weather + if (weather_count == 0) { + weather_flg = 0; + r = gs.httpGet(host, HTTP_URI, 0, &callback_http); + if (r >= 0) { + led3 = 0; + } else { + led3 = 1; + } + gs.poll(); + weather_count = 20; + } else { + weather_count --; } - r = gs.httpGet(host, HTTP_URI, 0, &callback_http); - if (r >= 0) { - denki_percentage = (float)denki_usage / (float)denki_capacity * 100.0; -#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) - pc.printf("%04d-%02d-%02d %02d:%02d :", year, month, day, hour, minute); - pc.printf(" %d MW / %d MW", denki_usage * 10, denki_capacity * 10); - pc.printf(" (%0.1f %%)\r\n", denki_percentage); - led2 = denki_percentage >= 70 ? (denki_percentage >= 77.5 ? 1 : 0.5) : 0; - led3 = denki_percentage >= 85 ? (denki_percentage >= 90 ? 1 : 0.5) : 0; - led4 = denki_percentage >= 95 ? (denki_percentage >= 97 ? 1 : 0.5) : 0; -#elif defined(TARGET_LPC11U24) - led2 = denki_percentage >= 70 ? 1 : 0; - led3 = denki_percentage >= 85 ? 1 : 0; - led4 = denki_percentage >= 95 ? 1 : 0; -#endif + wdt.kick(); + wait(3); + gs.poll(); + wdt.kick(); + + // NTP date + r = gs.getTime(); + if (r) { + time = r + (9 * 3600); // JST + } + + led2 = 0; + wdt.kick(); + } else { + // re-connected + led2 = 1; + if (gs.connect(SECURE, SSID, PASS, 1)) { + led4 = 1; } else { -#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) - pc.printf("http error\r\n"); -#endif + led4 = 0; } - flg = 0; - - wait(5); - time = gs.getTime() + (9 * 3600); - - gs.standby(180000); + led2 = 0; + } } if (count == 0) { // 0sec // time t = localtime(&time); writeled(t->tm_hour * 100 + t->tm_min, 2, 0x0f, 0x0f); + writeled5(4, weather_data & 0x07, 0); + writeled5(5, (weather_data >> 4) & 0x07, 0); + remote_flg = 0; } else - if (count > 0 && count < 4000) { + if (count > 0 /* && count < 6000 */ && !remote_flg) { // time blink if (count % 400 == 0) { // 0sec writeled(t->tm_hour * 100 + t->tm_min, 2, 0x0f, 0x0f); @@ -199,23 +268,34 @@ if (count % 400 == 200) { // 0.1sec writeled(t->tm_hour * 100 + t->tm_min, 0, 0x0f, 0x0f); } - } else - if (count == 4000) { // 10sec - // denki yohou - writeled(denki_percentage * 100, 2, 0x0e, 0); +/* } else if (count == 6000) { // 15sec // temp. - writeled(get_temp() * 10, 3, 0x07, 0); + writeled(get_temp() * 100, 2, 0x0e, 0); + writeled5(3, 12, 1); +*/ } - if (count % 400 == 0) { // 0sec + if (count % 400 == 0) { // every 0sec led1 = 1; + + // oclock buzzer + t = localtime(&time); + if (t->tm_min == 0) { + if (t->tm_sec == 0) { + bz = 0; + } else + if (t->tm_sec == 1) { + bz = 1; + } + } } else - if (count % 400 == 40) { // 0.1sec + if (count % 400 == 10) { // every 0.1sec led1 = 0; time ++; + if (flg) flg --; } count ++;