Kansai Electric Power usage meter (Denki-yohou) for GainSpan Wi-Fi http://mbed.org/users/okini3939/notebook/denki-yohou/

Dependencies:   mbed GSwifi (old)

Files at this revision

API Documentation at this revision

Comitter:
okini3939
Date:
Tue Jul 10 05:28:10 2012 +0000
Child:
1:beff52210994
Commit message:

Changed in this revision

7seg.cpp Show annotated file Show diff for this revision Revisions of this file
7seg.h Show annotated file Show diff for this revision Revisions of this file
GSwifi.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /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