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:
Wed Oct 17 13:52:01 2012 +0000
Revision:
3:4bf32f60a770
Parent:
2:8646918ffff2
fix

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 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 }