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

Dependencies:   mbed GSwifi (old)

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "GSwifi.h"
00003 #include "7seg.h"
00004 
00005 #define HTTP_HOST "www.kepco.co.jp"
00006 #define HTTP_URI "/yamasou/juyo1_kansai.csv"
00007 #define SSID "ssid"
00008 #define PASS "password"
00009 #define NTP_HOST "ntp1.sakura.ad.jp"
00010 
00011 #define VREF 3.3
00012 #define B 3435 // thermistor B
00013 #define T0 25.0
00014 #define R0 10000.0 // R0 ohm
00015 #define RU 10000.0 // pullup ohm
00016 
00017 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00018 Serial pc(USBTX, USBRX);
00019 GSwifi gs(p13, p14, p12, P0_22); // TX, RX, CTS, RTS
00020 DigitalOut gs_reset(p9), gs_wakeup(p10);
00021 DigitalOut led1(LED1);
00022 PwmOut led2(LED2), led3(LED3), led4(LED4);
00023 #elif defined(TARGET_LPC11U24)
00024 GSwifi gs(p9, p10, p21, p22); // TX, RX, CTS, RTS
00025 //DigitalOut gs_reset(P1_14), gs_wakeup(P1_3);
00026 DigitalOut gs_reset(p15), gs_wakeup(p14);
00027 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
00028 #endif
00029 
00030 volatile int denki_flg = 0;
00031 volatile int denki_capacity = 0;
00032 volatile int denki_usage = 0;
00033 volatile int year, month, day, hour, minute;
00034 
00035 AnalogIn adtemp(p20);
00036 
00037 void callback_http (int cid, int len) {
00038     static int n = 0;
00039 //    static char buf[1024], data[80];
00040     static char buf[200], data[100];
00041     int i;
00042     int last = len;
00043 
00044   while (last) {
00045     len = gs.recv(cid, buf, last < sizeof(buf) ? last : sizeof(buf));
00046     last = last - len;
00047 
00048     for (i = 0; i < len; i ++) {
00049         if (buf[i] == '\r') continue;
00050 
00051         if (denki_flg <= 1) {
00052             // header
00053             if (strncmp(buf, "200 OK", 6) == 0) {
00054                 i += 7;
00055                 denki_flg = 2;
00056             }
00057             continue;
00058         }
00059 
00060         // body        
00061         if (buf[i] == '\n') {
00062             data[n] = 0;
00063             switch (denki_flg) {
00064             case 2:
00065                 // update
00066                 break;
00067             case 4:
00068                 // capacity
00069                 if (data[0] >= '0' && data[0] <= '9') {
00070                     denki_capacity = atoi(data);
00071                 }
00072                 break;
00073             case 7:
00074                 // yosou1
00075                 break;
00076             case 10:
00077                 // yosou2
00078                 break;
00079             default:
00080                 // text
00081                 if (data[0] == 'D' && data[1] == 'A') {
00082                     denki_flg = denki_flg < 100 ? 100 : 200;
00083                 }
00084                 break;
00085             }
00086             if (denki_flg > 200 && data[n - 1] >= '0' && data[n - 1] <= '9') {
00087                 sscanf(data, "%d/%d/%d,%d:%d,%d", &year, &month, &day, &hour, &minute, &denki_usage);
00088             }
00089             n = 0;
00090             denki_flg ++;
00091         } else {
00092             // data
00093             if (n < sizeof(data) - 1) {
00094                 data[n] = buf[i];
00095                 n ++;
00096             }
00097         }
00098 
00099     }
00100 
00101   }
00102 }
00103 
00104 float get_temp () {
00105     float v, r, t;
00106 
00107     v = adtemp * VREF;
00108     r = v / ((VREF - v) / RU);
00109     t = (1.0 / ((1.0 / (T0 + 273.15)) + (log(r / R0) / B))) - 273.15;
00110     if (t < -50) t = 0;
00111     return t;
00112 }
00113 
00114 void Sleep () {
00115     __WFI();
00116 }
00117 
00118 int main() {
00119     int flg = 1, r;
00120     float denki_percentage = 0;
00121     Host host, ntp;
00122     int count = 0;
00123     time_t time;
00124     struct tm *t;
00125 
00126     initled();
00127 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00128     pc.baud(115200);
00129 #endif
00130     gs_reset = 0;
00131     gs_wakeup = 1;
00132     wait_ms(100);
00133     gs_reset = 1;
00134     wait_ms(500);
00135     led1 = 1;
00136 
00137     if (gs.connect(GSSEC_WPA2_PSK, SSID, PASS, 1)) {
00138         return -1;
00139     }
00140 
00141     ntp.setName(NTP_HOST);
00142     gs.ntpdate(ntp, 0);
00143     wait(15);
00144     gs.ntpdate(ntp, 3 * 60 * 60);
00145 
00146 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00147     pc.printf("Denki-yohou: %s\r\n", HTTP_HOST);
00148 #endif
00149     host.setName(HTTP_HOST);
00150 
00151     startled();
00152     while(1) {
00153         gs.poll();
00154         
00155         if (flg || gs.getStatus() == GSSTAT_WAKEUP) {
00156             led1 = 1;
00157             if (gs.getStatus() == GSSTAT_WAKEUP) {
00158                 gs.wakeup();
00159             }
00160 
00161             r = gs.httpGet(host, HTTP_URI, 0, &callback_http);
00162             if (r >= 0) {
00163                 denki_percentage = (float)denki_usage / (float)denki_capacity * 100.0;
00164 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00165                 pc.printf("%04d-%02d-%02d %02d:%02d :", year, month, day, hour, minute);
00166                 pc.printf(" %d MW / %d MW", denki_usage * 10, denki_capacity * 10);
00167                 pc.printf(" (%0.1f %%)\r\n", denki_percentage);
00168                 led2 = denki_percentage >= 70 ? (denki_percentage >= 77.5 ? 1 : 0.5) : 0;
00169                 led3 = denki_percentage >= 85 ? (denki_percentage >= 90 ? 1 : 0.5) : 0;
00170                 led4 = denki_percentage >= 95 ? (denki_percentage >= 97 ? 1 : 0.5) : 0;
00171 #elif defined(TARGET_LPC11U24)
00172                 led2 = denki_percentage >= 70 ? 1 : 0;
00173                 led3 = denki_percentage >= 85 ? 1 : 0;
00174                 led4 = denki_percentage >= 95 ? 1 : 0;
00175 #endif
00176             } else {
00177 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
00178                 pc.printf("http error\r\n");
00179 #endif
00180             }
00181             flg = 0;
00182             
00183             wait(5);
00184             time = gs.getTime() + (9 * 3600);
00185 
00186             gs.standby(180000);
00187         }
00188 
00189         if (count == 0) { // 0sec
00190             // time
00191             t = localtime(&time);
00192             writeled(t->tm_hour * 100 + t->tm_min, 2, 0x0f, 0x0f);
00193         } else
00194         if (count > 0 && count < 4000) {
00195             // time blink
00196             if (count % 400 == 0) { // 0sec
00197                 writeled(t->tm_hour * 100 + t->tm_min, 2, 0x0f, 0x0f);
00198             } else
00199             if (count % 400 == 200) { // 0.1sec
00200                 writeled(t->tm_hour * 100 + t->tm_min, 0, 0x0f, 0x0f);
00201             }
00202         } else
00203         if (count == 4000) { // 10sec
00204             // denki yohou
00205             writeled(denki_percentage * 100, 2, 0x0e, 0);
00206         } else
00207         if (count == 6000) { // 15sec
00208             // temp.
00209             writeled(get_temp() * 10, 3, 0x07, 0);
00210         }
00211 
00212         if (count % 400 == 0) { // 0sec
00213             led1 = 1;
00214         } else
00215         if (count % 400 == 40) { // 0.1sec
00216             led1 = 0;
00217 
00218             time ++;
00219         }
00220 
00221         count ++;
00222         if (count >= 8000) count = 0; // 20sec
00223 
00224         Sleep();
00225     }
00226 }