Kansai Electric Power usage meter (Denki-yohou) for GainSpan Wi-Fi http://mbed.org/users/okini3939/notebook/denki-yohou/
Dependencies: mbed GSwifi (old)
main.cpp@3:4bf32f60a770, 2012-10-17 (annotated)
- Committer:
- okini3939
- Date:
- Wed Oct 17 13:52:01 2012 +0000
- Revision:
- 3:4bf32f60a770
- Parent:
- 2:8646918ffff2
fix
Who changed what in which revision?
User | Revision | Line number | New 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 | 3:4bf32f60a770 | 5 | #define HTTP_HOST "www.kepco.co.jp" |
okini3939 | 3:4bf32f60a770 | 6 | #define HTTP_URI "/yamasou/juyo1_kansai.csv" |
okini3939 | 3:4bf32f60a770 | 7 | #define SSID "ssid" |
okini3939 | 3:4bf32f60a770 | 8 | #define PASS "password" |
okini3939 | 1:beff52210994 | 9 | #define NTP_HOST "ntp1.sakura.ad.jp" |
okini3939 | 0:d8a2cab7091c | 10 | |
okini3939 | 0:d8a2cab7091c | 11 | #define VREF 3.3 |
okini3939 | 0:d8a2cab7091c | 12 | #define B 3435 // thermistor B |
okini3939 | 0:d8a2cab7091c | 13 | #define T0 25.0 |
okini3939 | 0:d8a2cab7091c | 14 | #define R0 10000.0 // R0 ohm |
okini3939 | 0:d8a2cab7091c | 15 | #define RU 10000.0 // pullup ohm |
okini3939 | 0:d8a2cab7091c | 16 | |
okini3939 | 0:d8a2cab7091c | 17 | #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) |
okini3939 | 0:d8a2cab7091c | 18 | Serial pc(USBTX, USBRX); |
okini3939 | 0:d8a2cab7091c | 19 | GSwifi gs(p13, p14, p12, P0_22); // TX, RX, CTS, RTS |
okini3939 | 0:d8a2cab7091c | 20 | DigitalOut gs_reset(p9), gs_wakeup(p10); |
okini3939 | 0:d8a2cab7091c | 21 | DigitalOut led1(LED1); |
okini3939 | 0:d8a2cab7091c | 22 | PwmOut led2(LED2), led3(LED3), led4(LED4); |
okini3939 | 0:d8a2cab7091c | 23 | #elif defined(TARGET_LPC11U24) |
okini3939 | 0:d8a2cab7091c | 24 | GSwifi gs(p9, p10, p21, p22); // TX, RX, CTS, RTS |
okini3939 | 3:4bf32f60a770 | 25 | //DigitalOut gs_reset(P1_14), gs_wakeup(P1_3); |
okini3939 | 3:4bf32f60a770 | 26 | DigitalOut gs_reset(p15), gs_wakeup(p14); |
okini3939 | 0:d8a2cab7091c | 27 | DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); |
okini3939 | 0:d8a2cab7091c | 28 | #endif |
okini3939 | 0:d8a2cab7091c | 29 | |
okini3939 | 3:4bf32f60a770 | 30 | volatile int denki_flg = 0; |
okini3939 | 3:4bf32f60a770 | 31 | volatile int denki_capacity = 0; |
okini3939 | 3:4bf32f60a770 | 32 | volatile int denki_usage = 0; |
okini3939 | 0:d8a2cab7091c | 33 | volatile int year, month, day, hour, minute; |
okini3939 | 0:d8a2cab7091c | 34 | |
okini3939 | 0:d8a2cab7091c | 35 | AnalogIn adtemp(p20); |
okini3939 | 0:d8a2cab7091c | 36 | |
okini3939 | 1:beff52210994 | 37 | void callback_http (int cid, int len) { |
okini3939 | 0:d8a2cab7091c | 38 | static int n = 0; |
okini3939 | 3:4bf32f60a770 | 39 | // static char buf[1024], data[80]; |
okini3939 | 3:4bf32f60a770 | 40 | static char buf[200], data[100]; |
okini3939 | 0:d8a2cab7091c | 41 | int i; |
okini3939 | 0:d8a2cab7091c | 42 | int last = len; |
okini3939 | 0:d8a2cab7091c | 43 | |
okini3939 | 3:4bf32f60a770 | 44 | while (last) { |
okini3939 | 3:4bf32f60a770 | 45 | len = gs.recv(cid, buf, last < sizeof(buf) ? last : sizeof(buf)); |
okini3939 | 3:4bf32f60a770 | 46 | last = last - len; |
okini3939 | 3:4bf32f60a770 | 47 | |
okini3939 | 3:4bf32f60a770 | 48 | for (i = 0; i < len; i ++) { |
okini3939 | 3:4bf32f60a770 | 49 | if (buf[i] == '\r') continue; |
okini3939 | 0:d8a2cab7091c | 50 | |
okini3939 | 3:4bf32f60a770 | 51 | if (denki_flg <= 1) { |
okini3939 | 3:4bf32f60a770 | 52 | // header |
okini3939 | 3:4bf32f60a770 | 53 | if (strncmp(buf, "200 OK", 6) == 0) { |
okini3939 | 3:4bf32f60a770 | 54 | i += 7; |
okini3939 | 3:4bf32f60a770 | 55 | denki_flg = 2; |
okini3939 | 3:4bf32f60a770 | 56 | } |
okini3939 | 3:4bf32f60a770 | 57 | continue; |
okini3939 | 3:4bf32f60a770 | 58 | } |
okini3939 | 0:d8a2cab7091c | 59 | |
okini3939 | 0:d8a2cab7091c | 60 | // body |
okini3939 | 0:d8a2cab7091c | 61 | if (buf[i] == '\n') { |
okini3939 | 0:d8a2cab7091c | 62 | data[n] = 0; |
okini3939 | 3:4bf32f60a770 | 63 | switch (denki_flg) { |
okini3939 | 3:4bf32f60a770 | 64 | case 2: |
okini3939 | 3:4bf32f60a770 | 65 | // update |
okini3939 | 3:4bf32f60a770 | 66 | break; |
okini3939 | 3:4bf32f60a770 | 67 | case 4: |
okini3939 | 3:4bf32f60a770 | 68 | // capacity |
okini3939 | 3:4bf32f60a770 | 69 | if (data[0] >= '0' && data[0] <= '9') { |
okini3939 | 3:4bf32f60a770 | 70 | denki_capacity = atoi(data); |
okini3939 | 0:d8a2cab7091c | 71 | } |
okini3939 | 3:4bf32f60a770 | 72 | break; |
okini3939 | 3:4bf32f60a770 | 73 | case 7: |
okini3939 | 3:4bf32f60a770 | 74 | // yosou1 |
okini3939 | 3:4bf32f60a770 | 75 | break; |
okini3939 | 3:4bf32f60a770 | 76 | case 10: |
okini3939 | 3:4bf32f60a770 | 77 | // yosou2 |
okini3939 | 3:4bf32f60a770 | 78 | break; |
okini3939 | 3:4bf32f60a770 | 79 | default: |
okini3939 | 3:4bf32f60a770 | 80 | // text |
okini3939 | 3:4bf32f60a770 | 81 | if (data[0] == 'D' && data[1] == 'A') { |
okini3939 | 3:4bf32f60a770 | 82 | denki_flg = denki_flg < 100 ? 100 : 200; |
okini3939 | 3:4bf32f60a770 | 83 | } |
okini3939 | 3:4bf32f60a770 | 84 | break; |
okini3939 | 3:4bf32f60a770 | 85 | } |
okini3939 | 3:4bf32f60a770 | 86 | if (denki_flg > 200 && data[n - 1] >= '0' && data[n - 1] <= '9') { |
okini3939 | 3:4bf32f60a770 | 87 | sscanf(data, "%d/%d/%d,%d:%d,%d", &year, &month, &day, &hour, &minute, &denki_usage); |
okini3939 | 0:d8a2cab7091c | 88 | } |
okini3939 | 0:d8a2cab7091c | 89 | n = 0; |
okini3939 | 3:4bf32f60a770 | 90 | denki_flg ++; |
okini3939 | 0:d8a2cab7091c | 91 | } else { |
okini3939 | 0:d8a2cab7091c | 92 | // data |
okini3939 | 0:d8a2cab7091c | 93 | if (n < sizeof(data) - 1) { |
okini3939 | 0:d8a2cab7091c | 94 | data[n] = buf[i]; |
okini3939 | 0:d8a2cab7091c | 95 | n ++; |
okini3939 | 0:d8a2cab7091c | 96 | } |
okini3939 | 0:d8a2cab7091c | 97 | } |
okini3939 | 0:d8a2cab7091c | 98 | |
okini3939 | 3:4bf32f60a770 | 99 | } |
okini3939 | 0:d8a2cab7091c | 100 | |
okini3939 | 3:4bf32f60a770 | 101 | } |
okini3939 | 0:d8a2cab7091c | 102 | } |
okini3939 | 0:d8a2cab7091c | 103 | |
okini3939 | 0:d8a2cab7091c | 104 | float get_temp () { |
okini3939 | 1:beff52210994 | 105 | float v, r, t; |
okini3939 | 0:d8a2cab7091c | 106 | |
okini3939 | 0:d8a2cab7091c | 107 | v = adtemp * VREF; |
okini3939 | 0:d8a2cab7091c | 108 | r = v / ((VREF - v) / RU); |
okini3939 | 0:d8a2cab7091c | 109 | t = (1.0 / ((1.0 / (T0 + 273.15)) + (log(r / R0) / B))) - 273.15; |
okini3939 | 0:d8a2cab7091c | 110 | if (t < -50) t = 0; |
okini3939 | 0:d8a2cab7091c | 111 | return t; |
okini3939 | 0:d8a2cab7091c | 112 | } |
okini3939 | 0:d8a2cab7091c | 113 | |
okini3939 | 0:d8a2cab7091c | 114 | void Sleep () { |
okini3939 | 0:d8a2cab7091c | 115 | __WFI(); |
okini3939 | 0:d8a2cab7091c | 116 | } |
okini3939 | 0:d8a2cab7091c | 117 | |
okini3939 | 0:d8a2cab7091c | 118 | int main() { |
okini3939 | 3:4bf32f60a770 | 119 | int flg = 1, r; |
okini3939 | 3:4bf32f60a770 | 120 | float denki_percentage = 0; |
okini3939 | 1:beff52210994 | 121 | Host host, ntp; |
okini3939 | 0:d8a2cab7091c | 122 | int count = 0; |
okini3939 | 1:beff52210994 | 123 | time_t time; |
okini3939 | 1:beff52210994 | 124 | struct tm *t; |
okini3939 | 0:d8a2cab7091c | 125 | |
okini3939 | 0:d8a2cab7091c | 126 | initled(); |
okini3939 | 0:d8a2cab7091c | 127 | #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) |
okini3939 | 0:d8a2cab7091c | 128 | pc.baud(115200); |
okini3939 | 0:d8a2cab7091c | 129 | #endif |
okini3939 | 0:d8a2cab7091c | 130 | gs_reset = 0; |
okini3939 | 0:d8a2cab7091c | 131 | gs_wakeup = 1; |
okini3939 | 0:d8a2cab7091c | 132 | wait_ms(100); |
okini3939 | 0:d8a2cab7091c | 133 | gs_reset = 1; |
okini3939 | 0:d8a2cab7091c | 134 | wait_ms(500); |
okini3939 | 0:d8a2cab7091c | 135 | led1 = 1; |
okini3939 | 0:d8a2cab7091c | 136 | |
okini3939 | 3:4bf32f60a770 | 137 | if (gs.connect(GSSEC_WPA2_PSK, SSID, PASS, 1)) { |
okini3939 | 3:4bf32f60a770 | 138 | return -1; |
okini3939 | 0:d8a2cab7091c | 139 | } |
okini3939 | 0:d8a2cab7091c | 140 | |
okini3939 | 1:beff52210994 | 141 | ntp.setName(NTP_HOST); |
okini3939 | 1:beff52210994 | 142 | gs.ntpdate(ntp, 0); |
okini3939 | 3:4bf32f60a770 | 143 | wait(15); |
okini3939 | 1:beff52210994 | 144 | gs.ntpdate(ntp, 3 * 60 * 60); |
okini3939 | 1:beff52210994 | 145 | |
okini3939 | 0:d8a2cab7091c | 146 | #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) |
okini3939 | 0:d8a2cab7091c | 147 | pc.printf("Denki-yohou: %s\r\n", HTTP_HOST); |
okini3939 | 0:d8a2cab7091c | 148 | #endif |
okini3939 | 3:4bf32f60a770 | 149 | host.setName(HTTP_HOST); |
okini3939 | 0:d8a2cab7091c | 150 | |
okini3939 | 3:4bf32f60a770 | 151 | startled(); |
okini3939 | 0:d8a2cab7091c | 152 | while(1) { |
okini3939 | 0:d8a2cab7091c | 153 | gs.poll(); |
okini3939 | 0:d8a2cab7091c | 154 | |
okini3939 | 3:4bf32f60a770 | 155 | if (flg || gs.getStatus() == GSSTAT_WAKEUP) { |
okini3939 | 3:4bf32f60a770 | 156 | led1 = 1; |
okini3939 | 3:4bf32f60a770 | 157 | if (gs.getStatus() == GSSTAT_WAKEUP) { |
okini3939 | 3:4bf32f60a770 | 158 | gs.wakeup(); |
okini3939 | 0:d8a2cab7091c | 159 | } |
okini3939 | 1:beff52210994 | 160 | |
okini3939 | 3:4bf32f60a770 | 161 | r = gs.httpGet(host, HTTP_URI, 0, &callback_http); |
okini3939 | 3:4bf32f60a770 | 162 | if (r >= 0) { |
okini3939 | 3:4bf32f60a770 | 163 | denki_percentage = (float)denki_usage / (float)denki_capacity * 100.0; |
okini3939 | 3:4bf32f60a770 | 164 | #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) |
okini3939 | 3:4bf32f60a770 | 165 | pc.printf("%04d-%02d-%02d %02d:%02d :", year, month, day, hour, minute); |
okini3939 | 3:4bf32f60a770 | 166 | pc.printf(" %d MW / %d MW", denki_usage * 10, denki_capacity * 10); |
okini3939 | 3:4bf32f60a770 | 167 | pc.printf(" (%0.1f %%)\r\n", denki_percentage); |
okini3939 | 3:4bf32f60a770 | 168 | led2 = denki_percentage >= 70 ? (denki_percentage >= 77.5 ? 1 : 0.5) : 0; |
okini3939 | 3:4bf32f60a770 | 169 | led3 = denki_percentage >= 85 ? (denki_percentage >= 90 ? 1 : 0.5) : 0; |
okini3939 | 3:4bf32f60a770 | 170 | led4 = denki_percentage >= 95 ? (denki_percentage >= 97 ? 1 : 0.5) : 0; |
okini3939 | 3:4bf32f60a770 | 171 | #elif defined(TARGET_LPC11U24) |
okini3939 | 3:4bf32f60a770 | 172 | led2 = denki_percentage >= 70 ? 1 : 0; |
okini3939 | 3:4bf32f60a770 | 173 | led3 = denki_percentage >= 85 ? 1 : 0; |
okini3939 | 3:4bf32f60a770 | 174 | led4 = denki_percentage >= 95 ? 1 : 0; |
okini3939 | 3:4bf32f60a770 | 175 | #endif |
okini3939 | 3:4bf32f60a770 | 176 | } else { |
okini3939 | 3:4bf32f60a770 | 177 | #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) |
okini3939 | 3:4bf32f60a770 | 178 | pc.printf("http error\r\n"); |
okini3939 | 3:4bf32f60a770 | 179 | #endif |
okini3939 | 3:4bf32f60a770 | 180 | } |
okini3939 | 3:4bf32f60a770 | 181 | flg = 0; |
okini3939 | 2:8646918ffff2 | 182 | |
okini3939 | 3:4bf32f60a770 | 183 | wait(5); |
okini3939 | 3:4bf32f60a770 | 184 | time = gs.getTime() + (9 * 3600); |
okini3939 | 2:8646918ffff2 | 185 | |
okini3939 | 3:4bf32f60a770 | 186 | gs.standby(180000); |
okini3939 | 0:d8a2cab7091c | 187 | } |
okini3939 | 0:d8a2cab7091c | 188 | |
okini3939 | 0:d8a2cab7091c | 189 | if (count == 0) { // 0sec |
okini3939 | 1:beff52210994 | 190 | // time |
okini3939 | 1:beff52210994 | 191 | t = localtime(&time); |
okini3939 | 1:beff52210994 | 192 | writeled(t->tm_hour * 100 + t->tm_min, 2, 0x0f, 0x0f); |
okini3939 | 0:d8a2cab7091c | 193 | } else |
okini3939 | 3:4bf32f60a770 | 194 | if (count > 0 && count < 4000) { |
okini3939 | 1:beff52210994 | 195 | // time blink |
okini3939 | 1:beff52210994 | 196 | if (count % 400 == 0) { // 0sec |
okini3939 | 1:beff52210994 | 197 | writeled(t->tm_hour * 100 + t->tm_min, 2, 0x0f, 0x0f); |
okini3939 | 1:beff52210994 | 198 | } else |
okini3939 | 1:beff52210994 | 199 | if (count % 400 == 200) { // 0.1sec |
okini3939 | 1:beff52210994 | 200 | writeled(t->tm_hour * 100 + t->tm_min, 0, 0x0f, 0x0f); |
okini3939 | 1:beff52210994 | 201 | } |
okini3939 | 3:4bf32f60a770 | 202 | } else |
okini3939 | 3:4bf32f60a770 | 203 | if (count == 4000) { // 10sec |
okini3939 | 3:4bf32f60a770 | 204 | // denki yohou |
okini3939 | 3:4bf32f60a770 | 205 | writeled(denki_percentage * 100, 2, 0x0e, 0); |
okini3939 | 1:beff52210994 | 206 | } else |
okini3939 | 1:beff52210994 | 207 | if (count == 6000) { // 15sec |
okini3939 | 1:beff52210994 | 208 | // temp. |
okini3939 | 3:4bf32f60a770 | 209 | writeled(get_temp() * 10, 3, 0x07, 0); |
okini3939 | 0:d8a2cab7091c | 210 | } |
okini3939 | 0:d8a2cab7091c | 211 | |
okini3939 | 3:4bf32f60a770 | 212 | if (count % 400 == 0) { // 0sec |
okini3939 | 0:d8a2cab7091c | 213 | led1 = 1; |
okini3939 | 0:d8a2cab7091c | 214 | } else |
okini3939 | 3:4bf32f60a770 | 215 | if (count % 400 == 40) { // 0.1sec |
okini3939 | 0:d8a2cab7091c | 216 | led1 = 0; |
okini3939 | 1:beff52210994 | 217 | |
okini3939 | 1:beff52210994 | 218 | time ++; |
okini3939 | 0:d8a2cab7091c | 219 | } |
okini3939 | 0:d8a2cab7091c | 220 | |
okini3939 | 1:beff52210994 | 221 | count ++; |
okini3939 | 1:beff52210994 | 222 | if (count >= 8000) count = 0; // 20sec |
okini3939 | 1:beff52210994 | 223 | |
okini3939 | 0:d8a2cab7091c | 224 | Sleep(); |
okini3939 | 0:d8a2cab7091c | 225 | } |
okini3939 | 0:d8a2cab7091c | 226 | } |