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@0:d8a2cab7091c, 2012-07-10 (annotated)
- Committer:
- okini3939
- Date:
- Tue Jul 10 05:28:10 2012 +0000
- Revision:
- 0:d8a2cab7091c
- Child:
- 1:beff52210994
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 | 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 | } |