Kansai Electric Power usage meter (Denki-yohou)
Dependencies: mbed mbed-rtos EthernetInterface
関西電力 でんき予報メーター
関電のでんき予報のリアルタイム値(使用電力状況データ CSV )をもとに、mbedのLEDを点灯させます。
そのほかの情報はこちらへ: http://mbed.org/users/okini3939/notebook/denki-yohou/
Import programdenki-yohou_b
Kansai Electric Power usage meter (Denki-yohou)
- LED1 動作中表示
- LED2 70%以上
- LED3 85%以上
- LED4 95%以上
新しい Ethernet Interface ライブラリと、独自の Tiny HTTP クライアント ライブラリを使っています。
CSVの解析処理をはしょって改行を頼りにしているので、CSVファイルの構造が変わるとうまく動かなくなります。
東電でも同様に使えると思います。
main.cpp
- Committer:
- okini3939
- Date:
- 2012-07-02
- Revision:
- 2:b50c974ed0d5
- Parent:
- 1:10bd46941b8b
- Child:
- 3:ef5af1e8558d
File content as of revision 2:b50c974ed0d5:
#include "mbed.h" #include "EthernetInterface.h" #include "TinyHTTP_b.h" // Kansai Electric Power #define HTTP_HOST "www.kepco.co.jp" #define HTTP_URI "/yamasou/juyo1_kansai.csv" Serial pc(USBTX, USBRX); EthernetInterface eth; DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); volatile int denki_flg = 0; volatile int denki_capacity = 0; volatile int denki_usage = 0; volatile int year, month, day, hour, minute; void callback_denkiyohou (char *buf, int len) { static int n = 0; static char data[100]; int i; for (i = 0; i < len; i ++) { if (buf[i] == '\r') continue; if (denki_flg <= 1) { // header if (buf[i] == '\n') { n = 0; denki_flg ++; } else { denki_flg = 0; } 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[i - 1] >= '0' && data[i - 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 ++; } } } } int main() { Timer timer; int flg = 1, r; float denki_percentage = 0; pc.baud(115200); eth.init(); //Use DHCP if (eth.connect()) { return -1; } pc.printf("Denki-yohou: %s\r\n", HTTP_HOST); timer.start(); while(1) { led1 = 1; if (flg || timer.read() >= 300) { timer.reset(); denki_flg = 0; r = httpRequest(METHOD_GET, HTTP_HOST, 80, HTTP_URI, NULL, NULL, &callback_denkiyohou); if (r == 0) { denki_percentage = (float)denki_usage / (float)denki_capacity * 100.0; pc.printf("%04d-%02d-%02d %02d:%02d : ", year, month, day, hour, minute); pc.printf("%0.1f %%\r\n", denki_percentage); led2 = denki_percentage >= 70 ? 1 : 0; led3 = denki_percentage >= 85 ? 1 : 0; led4 = denki_percentage >= 95 ? 1 : 0; } else { pc.printf("http error\r\n"); } flg = 0; } wait(0.1); led1 = 0; wait(0.9); } }