Kansai Electric Power usage meter (Denki-yohou) for GainSpan Wi-Fi http://mbed.org/users/okini3939/notebook/denki-yohou/
Dependencies: mbed GSwifi (old)
Revision 0:d8a2cab7091c, committed 2012-07-10
- Comitter:
- okini3939
- Date:
- Tue Jul 10 05:28:10 2012 +0000
- Child:
- 1:beff52210994
- Commit message:
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/7seg.cpp Tue Jul 10 05:28:10 2012 +0000 @@ -0,0 +1,74 @@ +#include "mbed.h" +#include "7seg.h" + +static DigitalOut led_k[8] = {p34, p36, p26, p24, p23, p35, p30, p25}; +static DigitalOut led_a[4] = {p16, p17, p18, p19}; +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}; + +void leddisp () { + static int n = 0; + int i, bit; + + for (i = 0; i < 8; i ++) { + led_k[i] = 1; + } + led_a[n] = 1; + + n ++; + if (n >= 4) n = 0; + + 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; + } + led_a[n] = 0; +} + +void writeled (int num, int dot, int place) { + if (num >= 1000 && place & 0x08) { + ledbuf[0] = num / 1000; + } else { + ledbuf[0] = -1; + } + if (num >= 100 && place & 0x04) { + ledbuf[1] = (num / 100) % 10; + } else { + ledbuf[1] = -1; + } + if (num >= 10 && place & 0x02) { + ledbuf[2] = (num / 10) % 10; + } else { + ledbuf[2] = -1; + } + if (place & 0x01) { + ledbuf[3] = num % 10; + } else { + ledbuf[3] = -1; + } + + if (dot >= 1 && dot <= 4) { + ledbuf[dot - 1] |= 0x80; + } +} + +void initled () { + int i; + + for (i = 0; i < 4; i ++) { + led_a[i] = 1; + } + for (i = 0; i < 8; i ++) { + led_k[i] = 1; + } +} + +void startled () { + tick.attach_us(&leddisp, 2500); // 400Hz +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/7seg.h Tue Jul 10 05:28:10 2012 +0000 @@ -0,0 +1,4 @@ + +void writeled (int num, int dot, int place); +void initled (); +void startled ();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GSwifi.lib Tue Jul 10 05:28:10 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/gsfan/code/GSwifi/#2f6062c6d018
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Jul 10 05:28:10 2012 +0000 @@ -0,0 +1,197 @@ +#include "mbed.h" +#include "GSwifi.h" +#include "7seg.h" + +#define HTTP_HOST "www.kepco.co.jp" +#define HTTP_URI "/yamasou/juyo1_kansai.csv" +#define SSID "SSID" +#define PASS "pass1234567" + +#define VREF 3.3 +#define B 3435 // thermistor B +#define T0 25.0 +#define R0 10000.0 // R0 ohm +#define RU 10000.0 // pullup ohm + +#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) +Serial pc(USBTX, USBRX); +GSwifi gs(p13, p14, p12, P0_22); // TX, RX, CTS, RTS +DigitalOut gs_reset(p9), gs_wakeup(p10); +DigitalOut led1(LED1); +PwmOut led2(LED2), led3(LED3), led4(LED4); +#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(p27), gs_wakeup(p28); +DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); +#endif + +volatile int denki_flg = 0; +volatile int denki_capacity = 0; +volatile int denki_usage = 0; +volatile int year, month, day, hour, minute; + +AnalogIn adtemp(p20); + +void callback_http (int cid, int acid, int len) { + static int n = 0; +// static char buf[1024], data[80]; + static char buf[200], 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; + + if (denki_flg <= 1) { + // header + if (strncmp(buf, "200 OK", 6) == 0) { + i += 7; + denki_flg = 2; + } + continue; + } + + // body + if (buf[i] == '\n') { + data[n] = 0; + switch (denki_flg) { + case 2: + // update + break; + case 4: + // capacity + if (data[0] >= '0' && data[0] <= '9') { + denki_capacity = atoi(data); + } + 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) { + data[n] = buf[i]; + n ++; + } + } + + } + + } +} + +float get_temp () { + float ad, v, r, t; + + v = adtemp * VREF; + r = v / ((VREF - v) / RU); + t = (1.0 / ((1.0 / (T0 + 273.15)) + (log(r / R0) / B))) - 273.15; + if (t < -50) t = 0; + return t; +} + +void Sleep () { + __WFI(); +} + +int main() { + int flg = 1, r; + float denki_percentage = 0; + Host host; + int count = 0; + + initled(); +#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) + pc.baud(115200); +#endif + gs_reset = 0; + gs_wakeup = 1; + wait_ms(100); + gs_reset = 1; + wait_ms(500); + led1 = 1; + + if (gs.connect(GSSEC_WPA2_PSK, SSID, PASS, 1)) { + return -1; + } + +#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(); + + if (flg || gs.getStatus() == GSSTAT_WAKEUP) { + led1 = 1; + if (gs.getStatus() == GSSTAT_WAKEUP) { + gs.wakeup(); + } + + 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 + } else { +#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) + pc.printf("http error\r\n"); +#endif + } + flg = 0; + + gs.standby(180000); + } + + count ++; + if (count > 4000) count = 0; // 10sec + + if (count == 0) { // 0sec + writeled(denki_percentage * 100, 2, 0x0e); + } else + if (count == 2000) { // 5sec + writeled(get_temp() * 10, 3, 0x07); + } + + if (count % 400 == 0) { // 0sec + led1 = 1; + } else + if (count % 400 == 40) { // 0.1sec + led1 = 0; + } + + Sleep(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Jul 10 05:28:10 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/737756e0b479