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

Dependencies:   mbed GSwifi (old)

Committer:
okini3939
Date:
Tue Jul 10 05:28:10 2012 +0000
Revision:
0:d8a2cab7091c
Child:
1:beff52210994

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:d8a2cab7091c 1 #include "mbed.h"
okini3939 0:d8a2cab7091c 2 #include "GSwifi.h"
okini3939 0:d8a2cab7091c 3 #include "7seg.h"
okini3939 0:d8a2cab7091c 4
okini3939 0:d8a2cab7091c 5 #define HTTP_HOST "www.kepco.co.jp"
okini3939 0:d8a2cab7091c 6 #define HTTP_URI "/yamasou/juyo1_kansai.csv"
okini3939 0:d8a2cab7091c 7 #define SSID "SSID"
okini3939 0:d8a2cab7091c 8 #define PASS "pass1234567"
okini3939 0:d8a2cab7091c 9
okini3939 0:d8a2cab7091c 10 #define VREF 3.3
okini3939 0:d8a2cab7091c 11 #define B 3435 // thermistor B
okini3939 0:d8a2cab7091c 12 #define T0 25.0
okini3939 0:d8a2cab7091c 13 #define R0 10000.0 // R0 ohm
okini3939 0:d8a2cab7091c 14 #define RU 10000.0 // pullup ohm
okini3939 0:d8a2cab7091c 15
okini3939 0:d8a2cab7091c 16 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:d8a2cab7091c 17 Serial pc(USBTX, USBRX);
okini3939 0:d8a2cab7091c 18 GSwifi gs(p13, p14, p12, P0_22); // TX, RX, CTS, RTS
okini3939 0:d8a2cab7091c 19 DigitalOut gs_reset(p9), gs_wakeup(p10);
okini3939 0:d8a2cab7091c 20 DigitalOut led1(LED1);
okini3939 0:d8a2cab7091c 21 PwmOut led2(LED2), led3(LED3), led4(LED4);
okini3939 0:d8a2cab7091c 22 #elif defined(TARGET_LPC11U24)
okini3939 0:d8a2cab7091c 23 GSwifi gs(p9, p10, p21, p22); // TX, RX, CTS, RTS
okini3939 0:d8a2cab7091c 24 DigitalOut gs_reset(P1_14), gs_wakeup(P1_3);
okini3939 0:d8a2cab7091c 25 //DigitalOut gs_reset(p27), gs_wakeup(p28);
okini3939 0:d8a2cab7091c 26 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
okini3939 0:d8a2cab7091c 27 #endif
okini3939 0:d8a2cab7091c 28
okini3939 0:d8a2cab7091c 29 volatile int denki_flg = 0;
okini3939 0:d8a2cab7091c 30 volatile int denki_capacity = 0;
okini3939 0:d8a2cab7091c 31 volatile int denki_usage = 0;
okini3939 0:d8a2cab7091c 32 volatile int year, month, day, hour, minute;
okini3939 0:d8a2cab7091c 33
okini3939 0:d8a2cab7091c 34 AnalogIn adtemp(p20);
okini3939 0:d8a2cab7091c 35
okini3939 0:d8a2cab7091c 36 void callback_http (int cid, int acid, int len) {
okini3939 0:d8a2cab7091c 37 static int n = 0;
okini3939 0:d8a2cab7091c 38 // static char buf[1024], data[80];
okini3939 0:d8a2cab7091c 39 static char buf[200], data[100];
okini3939 0:d8a2cab7091c 40 int i;
okini3939 0:d8a2cab7091c 41 int last = len;
okini3939 0:d8a2cab7091c 42
okini3939 0:d8a2cab7091c 43 while (last) {
okini3939 0:d8a2cab7091c 44 len = gs.recv(cid, buf, last < sizeof(buf) ? last : sizeof(buf));
okini3939 0:d8a2cab7091c 45 last = last - len;
okini3939 0:d8a2cab7091c 46
okini3939 0:d8a2cab7091c 47 for (i = 0; i < len; i ++) {
okini3939 0:d8a2cab7091c 48 if (buf[i] == '\r') continue;
okini3939 0:d8a2cab7091c 49
okini3939 0:d8a2cab7091c 50 if (denki_flg <= 1) {
okini3939 0:d8a2cab7091c 51 // header
okini3939 0:d8a2cab7091c 52 if (strncmp(buf, "200 OK", 6) == 0) {
okini3939 0:d8a2cab7091c 53 i += 7;
okini3939 0:d8a2cab7091c 54 denki_flg = 2;
okini3939 0:d8a2cab7091c 55 }
okini3939 0:d8a2cab7091c 56 continue;
okini3939 0:d8a2cab7091c 57 }
okini3939 0:d8a2cab7091c 58
okini3939 0:d8a2cab7091c 59 // body
okini3939 0:d8a2cab7091c 60 if (buf[i] == '\n') {
okini3939 0:d8a2cab7091c 61 data[n] = 0;
okini3939 0:d8a2cab7091c 62 switch (denki_flg) {
okini3939 0:d8a2cab7091c 63 case 2:
okini3939 0:d8a2cab7091c 64 // update
okini3939 0:d8a2cab7091c 65 break;
okini3939 0:d8a2cab7091c 66 case 4:
okini3939 0:d8a2cab7091c 67 // capacity
okini3939 0:d8a2cab7091c 68 if (data[0] >= '0' && data[0] <= '9') {
okini3939 0:d8a2cab7091c 69 denki_capacity = atoi(data);
okini3939 0:d8a2cab7091c 70 }
okini3939 0:d8a2cab7091c 71 break;
okini3939 0:d8a2cab7091c 72 case 7:
okini3939 0:d8a2cab7091c 73 // yosou1
okini3939 0:d8a2cab7091c 74 break;
okini3939 0:d8a2cab7091c 75 case 10:
okini3939 0:d8a2cab7091c 76 // yosou2
okini3939 0:d8a2cab7091c 77 break;
okini3939 0:d8a2cab7091c 78 default:
okini3939 0:d8a2cab7091c 79 // text
okini3939 0:d8a2cab7091c 80 if (data[0] == 'D' && data[1] == 'A') {
okini3939 0:d8a2cab7091c 81 denki_flg = denki_flg < 100 ? 100 : 200;
okini3939 0:d8a2cab7091c 82 }
okini3939 0:d8a2cab7091c 83 break;
okini3939 0:d8a2cab7091c 84 }
okini3939 0:d8a2cab7091c 85 if (denki_flg > 200 && data[n - 1] >= '0' && data[n - 1] <= '9') {
okini3939 0:d8a2cab7091c 86 sscanf(data, "%d/%d/%d,%d:%d,%d", &year, &month, &day, &hour, &minute, &denki_usage);
okini3939 0:d8a2cab7091c 87 }
okini3939 0:d8a2cab7091c 88 n = 0;
okini3939 0:d8a2cab7091c 89 denki_flg ++;
okini3939 0:d8a2cab7091c 90 } else {
okini3939 0:d8a2cab7091c 91 // data
okini3939 0:d8a2cab7091c 92 if (n < sizeof(data) - 1) {
okini3939 0:d8a2cab7091c 93 data[n] = buf[i];
okini3939 0:d8a2cab7091c 94 n ++;
okini3939 0:d8a2cab7091c 95 }
okini3939 0:d8a2cab7091c 96 }
okini3939 0:d8a2cab7091c 97
okini3939 0:d8a2cab7091c 98 }
okini3939 0:d8a2cab7091c 99
okini3939 0:d8a2cab7091c 100 }
okini3939 0:d8a2cab7091c 101 }
okini3939 0:d8a2cab7091c 102
okini3939 0:d8a2cab7091c 103 float get_temp () {
okini3939 0:d8a2cab7091c 104 float ad, v, r, t;
okini3939 0:d8a2cab7091c 105
okini3939 0:d8a2cab7091c 106 v = adtemp * VREF;
okini3939 0:d8a2cab7091c 107 r = v / ((VREF - v) / RU);
okini3939 0:d8a2cab7091c 108 t = (1.0 / ((1.0 / (T0 + 273.15)) + (log(r / R0) / B))) - 273.15;
okini3939 0:d8a2cab7091c 109 if (t < -50) t = 0;
okini3939 0:d8a2cab7091c 110 return t;
okini3939 0:d8a2cab7091c 111 }
okini3939 0:d8a2cab7091c 112
okini3939 0:d8a2cab7091c 113 void Sleep () {
okini3939 0:d8a2cab7091c 114 __WFI();
okini3939 0:d8a2cab7091c 115 }
okini3939 0:d8a2cab7091c 116
okini3939 0:d8a2cab7091c 117 int main() {
okini3939 0:d8a2cab7091c 118 int flg = 1, r;
okini3939 0:d8a2cab7091c 119 float denki_percentage = 0;
okini3939 0:d8a2cab7091c 120 Host host;
okini3939 0:d8a2cab7091c 121 int count = 0;
okini3939 0:d8a2cab7091c 122
okini3939 0:d8a2cab7091c 123 initled();
okini3939 0:d8a2cab7091c 124 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:d8a2cab7091c 125 pc.baud(115200);
okini3939 0:d8a2cab7091c 126 #endif
okini3939 0:d8a2cab7091c 127 gs_reset = 0;
okini3939 0:d8a2cab7091c 128 gs_wakeup = 1;
okini3939 0:d8a2cab7091c 129 wait_ms(100);
okini3939 0:d8a2cab7091c 130 gs_reset = 1;
okini3939 0:d8a2cab7091c 131 wait_ms(500);
okini3939 0:d8a2cab7091c 132 led1 = 1;
okini3939 0:d8a2cab7091c 133
okini3939 0:d8a2cab7091c 134 if (gs.connect(GSSEC_WPA2_PSK, SSID, PASS, 1)) {
okini3939 0:d8a2cab7091c 135 return -1;
okini3939 0:d8a2cab7091c 136 }
okini3939 0:d8a2cab7091c 137
okini3939 0:d8a2cab7091c 138 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:d8a2cab7091c 139 pc.printf("Denki-yohou: %s\r\n", HTTP_HOST);
okini3939 0:d8a2cab7091c 140 #endif
okini3939 0:d8a2cab7091c 141 host.setName(HTTP_HOST);
okini3939 0:d8a2cab7091c 142
okini3939 0:d8a2cab7091c 143 startled();
okini3939 0:d8a2cab7091c 144 while(1) {
okini3939 0:d8a2cab7091c 145 gs.poll();
okini3939 0:d8a2cab7091c 146
okini3939 0:d8a2cab7091c 147 if (flg || gs.getStatus() == GSSTAT_WAKEUP) {
okini3939 0:d8a2cab7091c 148 led1 = 1;
okini3939 0:d8a2cab7091c 149 if (gs.getStatus() == GSSTAT_WAKEUP) {
okini3939 0:d8a2cab7091c 150 gs.wakeup();
okini3939 0:d8a2cab7091c 151 }
okini3939 0:d8a2cab7091c 152
okini3939 0:d8a2cab7091c 153 r = gs.httpGet(host, HTTP_URI, 0, &callback_http);
okini3939 0:d8a2cab7091c 154 if (r >= 0) {
okini3939 0:d8a2cab7091c 155 denki_percentage = (float)denki_usage / (float)denki_capacity * 100.0;
okini3939 0:d8a2cab7091c 156 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:d8a2cab7091c 157 pc.printf("%04d-%02d-%02d %02d:%02d :", year, month, day, hour, minute);
okini3939 0:d8a2cab7091c 158 pc.printf(" %d MW / %d MW", denki_usage * 10, denki_capacity * 10);
okini3939 0:d8a2cab7091c 159 pc.printf(" (%0.1f %%)\r\n", denki_percentage);
okini3939 0:d8a2cab7091c 160 led2 = denki_percentage >= 70 ? (denki_percentage >= 77.5 ? 1 : 0.5) : 0;
okini3939 0:d8a2cab7091c 161 led3 = denki_percentage >= 85 ? (denki_percentage >= 90 ? 1 : 0.5) : 0;
okini3939 0:d8a2cab7091c 162 led4 = denki_percentage >= 95 ? (denki_percentage >= 97 ? 1 : 0.5) : 0;
okini3939 0:d8a2cab7091c 163 #elif defined(TARGET_LPC11U24)
okini3939 0:d8a2cab7091c 164 led2 = denki_percentage >= 70 ? 1 : 0;
okini3939 0:d8a2cab7091c 165 led3 = denki_percentage >= 85 ? 1 : 0;
okini3939 0:d8a2cab7091c 166 led4 = denki_percentage >= 95 ? 1 : 0;
okini3939 0:d8a2cab7091c 167 #endif
okini3939 0:d8a2cab7091c 168 } else {
okini3939 0:d8a2cab7091c 169 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
okini3939 0:d8a2cab7091c 170 pc.printf("http error\r\n");
okini3939 0:d8a2cab7091c 171 #endif
okini3939 0:d8a2cab7091c 172 }
okini3939 0:d8a2cab7091c 173 flg = 0;
okini3939 0:d8a2cab7091c 174
okini3939 0:d8a2cab7091c 175 gs.standby(180000);
okini3939 0:d8a2cab7091c 176 }
okini3939 0:d8a2cab7091c 177
okini3939 0:d8a2cab7091c 178 count ++;
okini3939 0:d8a2cab7091c 179 if (count > 4000) count = 0; // 10sec
okini3939 0:d8a2cab7091c 180
okini3939 0:d8a2cab7091c 181 if (count == 0) { // 0sec
okini3939 0:d8a2cab7091c 182 writeled(denki_percentage * 100, 2, 0x0e);
okini3939 0:d8a2cab7091c 183 } else
okini3939 0:d8a2cab7091c 184 if (count == 2000) { // 5sec
okini3939 0:d8a2cab7091c 185 writeled(get_temp() * 10, 3, 0x07);
okini3939 0:d8a2cab7091c 186 }
okini3939 0:d8a2cab7091c 187
okini3939 0:d8a2cab7091c 188 if (count % 400 == 0) { // 0sec
okini3939 0:d8a2cab7091c 189 led1 = 1;
okini3939 0:d8a2cab7091c 190 } else
okini3939 0:d8a2cab7091c 191 if (count % 400 == 40) { // 0.1sec
okini3939 0:d8a2cab7091c 192 led1 = 0;
okini3939 0:d8a2cab7091c 193 }
okini3939 0:d8a2cab7091c 194
okini3939 0:d8a2cab7091c 195 Sleep();
okini3939 0:d8a2cab7091c 196 }
okini3939 0:d8a2cab7091c 197 }