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
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 }
Generated on Wed Jul 13 2022 01:34:33 by 1.7.2