Kansai Electric Power usage meter (Denki-yohou) for GainSpan Wi-Fi http://mbed.org/users/okini3939/notebook/denki-yohou/
Dependencies: mbed GSwifi (old)
Diff: main.cpp
- Revision:
- 0:d8a2cab7091c
- Child:
- 1:beff52210994
--- /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(); + } +}