Nefryで開発するIoTツールです
| Revision | ecdb0462b3d170fd786d4d7cbf1662c2c62d1ae5 (tree) |
|---|---|
| Time | 2017-06-06 16:43:02 |
| Author | Tomohiro Ito <tomohiro@yzdn...> |
| Commiter | Tomohiro Ito |
ESP8266 wifi connect
| @@ -0,0 +1,298 @@ | ||
| 1 | + | |
| 2 | +#include <ESP8266WiFi.h> | |
| 3 | +#include <NTPClient.h> | |
| 4 | +#include <WiFiUdp.h> | |
| 5 | +#include <TimeLib.h> | |
| 6 | +#include <ESP8266HTTPClient.h> | |
| 7 | +#include <string.h> | |
| 8 | +#include <SoftwareSerial.h> | |
| 9 | +WiFiClient client; | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | +//NTP test program for Nefry | |
| 14 | +//Nefryの時計をntpで同期するためのサンプルコードです.開発中です. | |
| 15 | +//Nefryのwifi関数を使ってWifiが切れたら再接続するように書き換えた | |
| 16 | + | |
| 17 | +extern "C" { | |
| 18 | + #include "user_interface.h" | |
| 19 | +} | |
| 20 | + | |
| 21 | +#define DEVICEID ESP.getChipId() | |
| 22 | +#define MAXROW 128 | |
| 23 | +#define NodeTypeID 6 //ESP8266 | |
| 24 | +#define NumOfUploadDatas 5 | |
| 25 | + | |
| 26 | +struct ADData | |
| 27 | +{ | |
| 28 | + long nBootedClock; | |
| 29 | + long nEphochTime; | |
| 30 | + int ADValue; | |
| 31 | +}; | |
| 32 | + | |
| 33 | +const String szCommandReadBaseURL = "https://a.yamagata-u.ac.jp/amenity/network/M2M/KinomaControlRequest.aspx"; | |
| 34 | +const String szDataUploadBaseURL = "http://a.yamagata-u.ac.jp/amenity/network/M2M/ArduinoDataReceiver.aspx"; | |
| 35 | +const String szDataUploadBaseURI = "/amenity/network/M2M/ArduinoDataReceiver.aspx"; | |
| 36 | +const String FingurePrintSha1 ="A5 23 3B D5 FA 6C E9 C2 8F 30 17 8F EF F9 EA C8 C5 18 49 3F"; | |
| 37 | +const char* host = "a.yamagata-u.ac.jp"; | |
| 38 | +const int httpPort = 80; | |
| 39 | +const int httpsPort = 443; | |
| 40 | +const double Attenuator=-13.90;//17.8k | |
| 41 | + | |
| 42 | +char toSSID[] = "YUNET_EDU"; | |
| 43 | +char ssidPASSWD[] = "wlan@yamagata"; | |
| 44 | +bool BlueLED=false; | |
| 45 | +int nCounterWifiReconnect=0; | |
| 46 | +int nCounter1s = 0; | |
| 47 | +int nCounter30s = 0; | |
| 48 | +int nCounter15s = 0; | |
| 49 | +int nCounter5s = 0; | |
| 50 | +int ADvalue = 0; | |
| 51 | +bool bCommandReadingHttp = false; | |
| 52 | +bool bNoNTPupdated = true; | |
| 53 | +ADData AD1[MAXROW]; | |
| 54 | +int nADcount=0; | |
| 55 | +int nUploaded =0; | |
| 56 | +long nBootedClock=0; | |
| 57 | + | |
| 58 | +WiFiUDP ntpUDP; | |
| 59 | +// You can specify the time server pool and the offset (in seconds, can be | |
| 60 | +// changed later with setTimeOffset() ). Additionaly you can specify the | |
| 61 | +// update interval (in milliseconds, can be changed using setUpdateInterval() ). | |
| 62 | +NTPClient timeClient(ntpUDP, "ntp.nict.jp", 0, 3600000); | |
| 63 | + | |
| 64 | +void ADRowAdd(){ | |
| 65 | + if (nADcount > MAXROW-1) { | |
| 66 | + int row; | |
| 67 | + for(row =1; row <MAXROW; row++){ | |
| 68 | + AD1[row-1] = AD1[row]; | |
| 69 | + } | |
| 70 | + nADcount=MAXROW-1; | |
| 71 | + } | |
| 72 | + AD1[nADcount].nBootedClock = nBootedClock; | |
| 73 | + AD1[nADcount].nEphochTime=(long)timeClient.getEpochTime(); | |
| 74 | + AD1[nADcount].ADValue = ADvalue; | |
| 75 | + nADcount++; | |
| 76 | +} | |
| 77 | + | |
| 78 | +String urlencode(String str) | |
| 79 | +{ | |
| 80 | + String encodedString=""; | |
| 81 | + char c; | |
| 82 | + char code0; | |
| 83 | + char code1; | |
| 84 | + char code2; | |
| 85 | + for (int i =0; i < str.length(); i++){ | |
| 86 | + c=str.charAt(i); | |
| 87 | + if (c == ' '){ | |
| 88 | + encodedString+= '+'; | |
| 89 | + } else if (isalnum(c)){ | |
| 90 | + encodedString+=c; | |
| 91 | + } else{ | |
| 92 | + code1=(c & 0xf)+'0'; | |
| 93 | + if ((c & 0xf) >9){ | |
| 94 | + code1=(c & 0xf) - 10 + 'A'; | |
| 95 | + } | |
| 96 | + c=(c>>4)&0xf; | |
| 97 | + code0=c+'0'; | |
| 98 | + if (c > 9){ | |
| 99 | + code0=c - 10 + 'A'; | |
| 100 | + } | |
| 101 | + code2='\0'; | |
| 102 | + encodedString+='%'; | |
| 103 | + encodedString+=code0; | |
| 104 | + encodedString+=code1; | |
| 105 | + //encodedString+=code2; | |
| 106 | + } | |
| 107 | + yield(); | |
| 108 | + } | |
| 109 | + return encodedString; | |
| 110 | + | |
| 111 | +} | |
| 112 | + | |
| 113 | +String GenXML(void){ | |
| 114 | + String xml=""; | |
| 115 | + if (nADcount > NumOfUploadDatas){ | |
| 116 | + nUploaded = NumOfUploadDatas; | |
| 117 | + }else{ | |
| 118 | + nUploaded=nADcount; | |
| 119 | + } | |
| 120 | + xml="<?xml version=\"1.0\" ?>\n"; | |
| 121 | + xml+="<ADDatas>\n"; | |
| 122 | + int i; | |
| 123 | + for (i=nADcount-1;i>=nADcount-nUploaded;i--){ | |
| 124 | + xml+="<ADData>\n"; | |
| 125 | + xml+="<BootedTime>" + (String)AD1[i].nBootedClock + "</BootedTime>\n"; | |
| 126 | + if (AD1[i].nEphochTime<1262239200 && (long)timeClient.getEpochTime() > 1262239200){ | |
| 127 | + AD1[i].nEphochTime = AD1[i].nBootedClock + (long)timeClient.getEpochTime() - nBootedClock; | |
| 128 | + } | |
| 129 | + xml+="<ElapsedTime>" + (String)AD1[i].nEphochTime + "</ElapsedTime>\n"; | |
| 130 | + xml+="<ADvalue>" + (String)AD1[i].ADValue +"</ADvalue>\n"; | |
| 131 | + xml+="<Attenuator>" + (String)Attenuator + "</Attenuator>\n"; | |
| 132 | + xml+="</ADData>\n"; | |
| 133 | + } | |
| 134 | + xml+="</ADDatas>\n"; | |
| 135 | + return (xml); | |
| 136 | +} | |
| 137 | + | |
| 138 | +void timer1_ISR (void) { | |
| 139 | + if (WiFi.status() != WL_CONNECTED) { | |
| 140 | + // コネクション確立済み以外のステータスなので | |
| 141 | + // 無線LAN接続NG 赤色LED点灯 | |
| 142 | + //Nefry.setLed(255, 0, 0); | |
| 143 | + nCounterWifiReconnect++; | |
| 144 | + //WiFi.begin(); | |
| 145 | + if (nCounterWifiReconnect>30){ | |
| 146 | + nCounterWifiReconnect=0; | |
| 147 | + // Nefry.setWifiTimeoutClear(); | |
| 148 | + // Nefry.println("Wifi TimeoutClear"); | |
| 149 | + } | |
| 150 | + } else { | |
| 151 | + //コネクションOKなので、青色LED点灯 | |
| 152 | + nCounterWifiReconnect=0; | |
| 153 | + //Nefry.setLed(0, 0, 64); | |
| 154 | + | |
| 155 | + } | |
| 156 | + | |
| 157 | + ADvalue = analogRead(A0); | |
| 158 | + | |
| 159 | + | |
| 160 | + //char buf[128]; | |
| 161 | + //Nefry.println(ADvalue); | |
| 162 | + //2014-10-10T13:50:40+09:00 (TIMEZONE JST) | |
| 163 | + //2014-10-10T04:50:40Z (UTC) | |
| 164 | + // sprintf(buf,"%04d-%02d-%02dT%02d:%02d:%02dZ",year(), month(), day(),hour(),minute(),second()); | |
| 165 | +// Nefry.println(buf); | |
| 166 | + nCounter1s++; | |
| 167 | + nBootedClock++; | |
| 168 | + nCounter30s++; | |
| 169 | + nCounter15s++; | |
| 170 | + nCounter5s++; | |
| 171 | +} | |
| 172 | + | |
| 173 | +void stop_timer1() { | |
| 174 | + timer1_disable(); | |
| 175 | + timer1_detachInterrupt(); | |
| 176 | +} | |
| 177 | + | |
| 178 | +void start_timer1(unsigned int nIntervalTime_us) { | |
| 179 | + timer1_isr_init(); | |
| 180 | + timer1_attachInterrupt(timer1_ISR); | |
| 181 | + timer1_enable(TIM_DIV16, TIM_EDGE, TIM_LOOP); | |
| 182 | + timer1_write(clockCyclesPerMicrosecond() / 16 * nIntervalTime_us); | |
| 183 | +} | |
| 184 | +void setup() { | |
| 185 | + Serial.begin(115200); | |
| 186 | + Serial.println(""); | |
| 187 | + Serial.println("PG start"); | |
| 188 | + | |
| 189 | + WiFi.mode(WIFI_STA); | |
| 190 | + WiFi.begin(toSSID, ssidPASSWD); | |
| 191 | + | |
| 192 | + while (WiFi.status() != WL_CONNECTED) { | |
| 193 | + delay(500); | |
| 194 | + Serial.print("."); | |
| 195 | + } | |
| 196 | + Serial.println(""); | |
| 197 | + Serial.println("WiFi connected"); | |
| 198 | + | |
| 199 | + //WiFiの状態を表示 | |
| 200 | + Serial.print("IP address: "); | |
| 201 | + Serial.println(WiFi.localIP()); | |
| 202 | + Serial.print("Device ID:"); | |
| 203 | + Serial.println(DEVICEID); | |
| 204 | + timeClient.begin(); | |
| 205 | + start_timer1(1000000); //1000000 us間隔でタイマーを起動 | |
| 206 | +} | |
| 207 | + | |
| 208 | +void loop() { | |
| 209 | + | |
| 210 | + if (bNoNTPupdated==true){ | |
| 211 | + if (WiFi.status() == WL_CONNECTED) { | |
| 212 | + //Nefry.setLed(128, 0, 128); | |
| 213 | + timeClient.update(); | |
| 214 | + bNoNTPupdated=false; | |
| 215 | + setTime(timeClient.getEpochTime()); | |
| 216 | + Serial.println(timeClient.getFormattedTime()); | |
| 217 | + //Nefry.setLed(0, 0, 64); | |
| 218 | + } | |
| 219 | + } | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + if (nCounter1s >0) { | |
| 225 | + if (nBootedClock <= 30) { | |
| 226 | + ADRowAdd(); | |
| 227 | + } | |
| 228 | + if (WiFi.status() == WL_CONNECTED && bCommandReadingHttp == false) { | |
| 229 | + bCommandReadingHttp = true; | |
| 230 | + //Nefry.setLed(0, 128, 0); | |
| 231 | + //https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266HTTPClient/examples/BasicHttpClient | |
| 232 | + /* | |
| 233 | + //HTTPClinetが同時に動作するとエラーになるので,取り急ぎ,コマンド取得はコメントアウト | |
| 234 | + HTTPClient http; | |
| 235 | + String szCommandReadURL = szCommandReadBaseURL + "?DeviceID=" + DEVICEID; | |
| 236 | + //以下3行は,デバッグ用に追加 | |
| 237 | + szCommandReadURL = szCommandReadURL + "&AD1=" + AD1[nADcount-1].ADValue; | |
| 238 | + szCommandReadURL = szCommandReadURL + "&EphochTime=" + AD1[nADcount-1].nEphochTime; | |
| 239 | + szCommandReadURL = szCommandReadURL + "&BootedClock=" + AD1[nADcount-1].nBootedClock; | |
| 240 | + szCommandReadURL = szCommandReadURL + "&ADCount=" + nADcount; | |
| 241 | + http.begin(szCommandReadURL,FingurePrintSha1); | |
| 242 | + int httpCode = http.GET(); | |
| 243 | + if(httpCode == HTTP_CODE_OK) { | |
| 244 | + String payload = http.getString(); | |
| 245 | + } | |
| 246 | + http.end(); | |
| 247 | + */ | |
| 248 | + nCounter1s =0; | |
| 249 | + bCommandReadingHttp = false; | |
| 250 | + //Nefry.setLed(0, 0, 64); | |
| 251 | + } | |
| 252 | + } | |
| 253 | + | |
| 254 | +//HTTPSだと正常にPOSTできなかったので,httpに変更,さらに,payloadが大きいとエラーになるので,payloadが小さくなるように修正 | |
| 255 | +if (nCounter5s > 4){ | |
| 256 | + if (WiFi.status() == WL_CONNECTED && nADcount >0 && (long)timeClient.getEpochTime() > 1262239200) { | |
| 257 | + // Nefry.setLed(128, 0, 128); | |
| 258 | + nCounter5s=0; | |
| 259 | + HTTPClient http2; | |
| 260 | + String dum; | |
| 261 | + dum="XML="+urlencode(GenXML()); | |
| 262 | + String szDataUploadURL = szDataUploadBaseURL + "?DeviceID=" + DEVICEID +"&NodeTypeID=" + NodeTypeID; | |
| 263 | + http2.begin(szDataUploadURL,FingurePrintSha1); | |
| 264 | + http2.begin(szDataUploadURL); | |
| 265 | + http2.addHeader("Content-Type", "application/x-www-form-urlencoded"); | |
| 266 | + http2.addHeader("Content-Length", (String)dum.length()); | |
| 267 | + int httpCode2=http2.POST(dum); | |
| 268 | + //Nefry.println(httpCode2); | |
| 269 | + if(httpCode2 == HTTP_CODE_OK) { | |
| 270 | + nADcount=nADcount-nUploaded; | |
| 271 | + } | |
| 272 | + http2.end(); | |
| 273 | +// Nefry.setLed(0, 0, 64); | |
| 274 | + } | |
| 275 | +} | |
| 276 | + | |
| 277 | +if (nCounter15s>14) { | |
| 278 | + nCounter15s=0; | |
| 279 | + if (nBootedClock > 30) { | |
| 280 | + ADRowAdd(); | |
| 281 | + } | |
| 282 | + | |
| 283 | +} | |
| 284 | + | |
| 285 | + if (nCounter30s > 29) { | |
| 286 | + nCounter30s =0; | |
| 287 | + if (WiFi.status() == WL_CONNECTED ){ | |
| 288 | + timeClient.update(); | |
| 289 | + setTime(timeClient.getEpochTime()); | |
| 290 | + char buf[128]; | |
| 291 | + sprintf(buf,"%04d-%02d-%02dT%02d:%02d:%02dZ",year(), month(), day(),hour(),minute(),second()); | |
| 292 | + Serial.println(buf); | |
| 293 | + Serial.println(timeClient.getFormattedTime()); | |
| 294 | + } | |
| 295 | + } | |
| 296 | +} | |
| 297 | + | |
| 298 | + |