xml로 파싱하는 부분말고 json으로 파싱하는 부분은 없나요?
코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2015-01-19 15:39:56
NO | 부품명 | 수량 | 상세설명 |
1 | 아두이노 | 1 | 오렌지 보드 |
2 | WiFi 실드 | 1 | WiFi모듈 |
부품명 | 오렌지 보드 | 아두이노 WIFI 실드 |
파트 |
#include "SPI.h" #include "WiFi.h" char ssid[] = "와이파이 SSID"; //와이파이 SSID char pass[] = "와이파이 password"; //와이파이 password String location = "Gangnam"; //날씨정보를 보고싶은 지역 //인스턴스 변수 초기화 WiFiServer server(80); WiFiClient client; const unsigned long requestInterval = 60000; // 요구 시간 딜레이(1 min) IPAddress hostIp; uint8_t ret; unsigned long lastAttemptTime = 0; // 마지막으로 서버에서 데이터를 전송받은 시간 String currentLine = ""; // 서버에서 전송된 데이터 String저장 String tempString = ""; // 온도 저장 변수 String humString = ""; // 습도 저장 변수 String timeString = ""; // 시간 정보 변수 String pressureString = ""; // 압력 정보 변수 boolean readingTemp = false; //온도 데이터가 있는지 여부 판단 boolean readingHum = false; //습도 데이터가 있는지 여부 판단 boolean readingTime = false; //시간 데이터가 있는지 여부 판단 boolean readingPressure = false; //압력 데이터가 있는지 여부 판단 int temp = 0; void setup() { //각 변수에 정해진 공간 할당 currentLine.reserve(100); tempString.reserve(10); humString.reserve(10); timeString.reserve(20); Serial.begin(115200); delay(10); //WiFi연결 시도 Serial.println("Connecting to WiFi...."); WiFi.begin(ssid, pass); //WiFi가 패스워드를 사용한다면 매개변수에 password도 작성 server.begin(); Serial.println("Connect success!"); Serial.println("Waiting for DHCP address"); //DHCP주소를 기다린다 while(WiFi.localIP() == INADDR_NONE) { Serial.print("."); delay(300); } Serial.println("\n"); printWifiData(); connectToServer(); } void loop() { if (client.connected()) { while (client.available()) { //전송된 데이터가 있을 경우 데이터를 읽어들인다. char inChar = client.read(); // 읽어온 데이터를 inChar에 저장한다. currentLine += inChar; //inChar에 저장된 Char변수는 currentLine이라는 String변수에 쌓이게 된다.
//라인피드(줄바꿈)문자열이 전송되면 데이터를 보내지 않는다. if (inChar == '\n') { //Serial.print("clientReadLine = "); //Serial.println(currentLine); currentLine = ""; }
//온도 데이터가 전송되었는지 확인 if ( currentLine.endsWith("<temperature value=")) { //현재 스트링이 "<temperature value="로 끝났다면 온도데이터를 받을 준비를 한다. readingTemp = true; tempString = ""; } //<temperature value=뒤에 오는 문자열을 tempString에 저장한다. if (readingTemp) { if (inChar != 'm') { //전송될 문자가 'm'이 올때까지 온도값으로 인식 tempString += inChar; } else { //전송된 문자가 'm'이라면 온도데이터를 그만 저장하고 온도값 출력 readingTemp = false; Serial.print("- Temperature: "); Serial.print(getInt(tempString)-273); Serial.println((char)176); //degree symbol } } if ( currentLine.endsWith("<humidity value=")) { //현재 스트링이 "<humidity value ="로 끝났다면 습도 데이터를 받을 준비를 한다. readingHum = true; humString = ""; } if (readingHum) { if (inChar != 'u') {//전송될 문자열이 'u'가 아니라면 계속 습도값을 받게 된다. humString += inChar; } else { //다음에 전송된 문자열이 'u'라면 습도값을 그만 받고 값을 출력한다. readingHum = false; Serial.print("- Humidity: "); Serial.print(getInt(humString)); Serial.println((char)37); } } if ( currentLine.endsWith("<lastupdate value=")) { // 현재 스트링이 "<lastupdata value="로 끝났다면 마지막 업데이트 시간 데이터를 받을 준비를 한다. readingTime = true; timeString = ""; } if (readingTime) { if (inChar != '/') { //다음 전송될 문자가 '/'가 아니라면 계속적으로 시간데이터를 받는다 timeString += inChar; } else { readingTime = false; Serial.print("- Last update: "); Serial.println(timeString.substring(2,timeString.length()-1)); } } if ( currentLine.endsWith("<pressure value=")) {
// 현재 스트링이 "<pressure value="로 끝났다면 기압 데이터를 받을 준비를 한다. readingPressure = true; pressureString = ""; } if (readingPressure) { if (inChar != 'u') { //다음 전송될 문자가 'u'가 아니라면 계속 기압데이터를 받는다. pressureString += inChar; } else { //다음 전송된 문자가 'u'라면 기압데이터를 출력한다. readingPressure = false; Serial.print("- Pressure: "); Serial.print(getInt(pressureString)); Serial.println("hPa"); } } if ( currentLine.endsWith("</current>")) { //현재 스트링이 </current>로 끝났다면 연결을 끊고 다시 서버와 연결을 준비한다. delay(10000); //10초뒤에 서버와 연결을 끊고 재연결을 시도한다. client.stop(); connectToServer(); //Serial.println("Disconnected from Server.\n"); } } } else if (millis() - lastAttemptTime > requestInterval) { //연결을 실패했다면 requestInterval(60초)이후에 다시 연결을 시도한다. connectToServer(); } }
//서버와 연결 void connectToServer() { Serial.println("connecting to server..."); String content = ""; if (client.connect(hostIp, 80)) { Serial.println("Connected! Making HTTP request to api.openweathermap.org for "+location+"..."); //Serial.println("GET /data/2.5/weather?q="+location+"&mode=xml"); client.println("GET /data/2.5/weather?q="+location+"&mode=xml"); //위에 지정된 주소와 연결한다. client.print("HOST: api.openweathermap.org\n"); client.println("User-Agent: launchpad-wifi"); client.println("Connection: close"); client.println(); Serial.println("Weather information for "+location); } //마지막으로 연결에 성공한 시간을 기록 lastAttemptTime = millis(); } void printHex(int num, int precision) { char tmp[16]; char format[128]; sprintf(format, "%%.%dX", precision); sprintf(tmp, format, num); Serial.print(tmp); } void printWifiData() { // Wifi쉴드의 IP주소를 출력 Serial.println(); Serial.println("IP Address Information:"); IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); //MAC address출력 byte mac[6]; WiFi.macAddress(mac); Serial.print("MAC address: "); printHex(mac[5], 2); Serial.print(":"); printHex(mac[4], 2); Serial.print(":"); printHex(mac[3], 2); Serial.print(":"); printHex(mac[2], 2); Serial.print(":"); printHex(mac[1], 2); Serial.print(":"); printHex(mac[0], 2); Serial.println(); //서브넷 마스크 출력 IPAddress subnet = WiFi.subnetMask(); Serial.print("NetMask: "); Serial.println(subnet); //게이트웨이 주소 출력 IPAddress gateway = WiFi.gatewayIP(); Serial.print("Gateway: "); Serial.println(gateway); Serial.print("SSID: "); Serial.println(WiFi.SSID()); ret = WiFi.hostByName("api.openweathermap.org", hostIp); Serial.print("ret: "); Serial.println(ret); Serial.print("Host IP: "); Serial.println(hostIp); Serial.println(""); } int getInt(String input){ //String데이터를 intger형으로 변환하는 함수 int i = 2; while(input[i] != '"'){ i++; } input = input.substring(2,i); char carray[20]; //Serial.println(input); input.toCharArray(carray, sizeof(carray)); //Serial.println(carray); temp = atoi(carray); //Serial.println(temp); return temp; }
char ssid[] = "와이파이 SSID"; //와이파이 SSID char pass[] = "와이파이 password"; //와이파이 password String location = "Gangnam"; //날씨정보를 보고싶은 지역 //인스턴스 변수 초기화 WiFiServer server(80); WiFiClient client; const unsigned long requestInterval = 60000; // 요구 시간 딜레이(1 min) IPAddress hostIp; uint8_t ret; unsigned long lastAttemptTime = 0; // 마지막으로 서버에서 데이터를 전송받은 시간 String currentLine = ""; // 서버에서 전송된 데이터 String저장 String tempString = ""; // 온도 저장 변수 String humString = ""; // 습도 저장 변수 String timeString = ""; // 시간 정보 변수 String pressureString = ""; // 기압 정보 변수 boolean readingTemp = false; //온도 데이터가 있는지 여부 판단 boolean readingHum = false; //습도 데이터가 있는지 여부 판단 boolean readingTime = false; //시간 데이터가 있는지 여부 판단 boolean readingPressure = false; //기압 데이터가 있는지 여부 판단 int temp = 0;
void setup() { //각 변수에 정해진 공간 할당 currentLine.reserve(100); tempString.reserve(10); humString.reserve(10); timeString.reserve(20); Serial.begin(115200); delay(10); //WiFi연결 시도 Serial.println("Connecting to WiFi...."); WiFi.begin(ssid, pass); //WiFi가 패스워드를 사용한다면 매개변수에 password도 작성 server.begin(); Serial.println("Connect success!"); Serial.println("Waiting for DHCP address"); //DHCP주소를 기다린다 while(WiFi.localIP() == INADDR_NONE) { Serial.print("."); delay(300); } Serial.println("\n"); printWifiData(); connectToServer(); }
void connectToServer() { Serial.println("connecting to server..."); String content = ""; if (client.connect(hostIp, 80)) { Serial.println("Connected! Making HTTP request to api.openweathermap.org for "+location+"..."); //Serial.println("GET /data/2.5/weather?q="+location+"&mode=xml"); client.println("GET /data/2.5/weather?q="+location+"&mode=xml"); //위에 지정된 주소와 연결한다. client.print("HOST: api.openweathermap.org\n"); client.println("User-Agent: launchpad-wifi"); client.println("Connection: close"); client.println(); Serial.println("Weather information for "+location); } //마지막으로 연결에 성공한 시간을 기록 lastAttemptTime = millis(); }
char inChar = client.read(); // 읽어온 데이터를 inChar에 저장한다. currentLine += inChar; //inChar에 저장된 Char변수는 currentLine이라는 String변수에 쌓이게 된다.
//라인피드(줄바꿈)문자열이 전송되면 데이터를 보내지 않는다. if (inChar == '\n') { //Serial.print("clientReadLine = "); //Serial.println(currentLine); currentLine = ""; }
if ( currentLine.endsWith("<temperature value=")) { //현재 스트링이 "<temperature value="로 끝났다면 온도데이터를 받을 준비를 한다. readingTemp = true; tempString = ""; } //<temperature value=뒤에 오는 문자열을 tempString에 저장한다. if (readingTemp) { if (inChar != 'm') { //전송될 문자가 'm'이 올때까지 온도값으로 인식 tempString += inChar; } else { //전송된 문자가 'm'이라면 온도데이터를 그만 저장하고 온도값 출력 readingTemp = false; Serial.print("- Temperature: "); Serial.print(getInt(tempString)-273); Serial.println((char)176); //degree symbol } }
if ( currentLine.endsWith("<humidity value=")) { //현재 스트링이 "<humidity value ="로 끝났다면 습도 데이터를 받을 준비를 한다. readingHum = true; humString = ""; } if (readingHum) { if (inChar != 'u') {//전송될 문자열이 'u'가 아니라면 계속 습도값을 받게 된다. humString += inChar; } else { //다음에 전송된 문자열이 'u'라면 습도값을 그만 받고 값을 출력한다. readingHum = false; Serial.print("- Humidity: "); Serial.print(getInt(humString)); Serial.println((char)37); } }
if ( currentLine.endsWith("</current>")) { //현재 스트링이 </current>로 끝났다면 연결을 끊고 다시 서버와 연결을 준비한다. delay(10000); //10초뒤에 서버와 연결을 끊고 재연결을 시도한다. client.stop(); connectToServer(); //Serial.println("Disconnected from Server.\n"); }
수박쨈
server와 연결했으나 socket관련 에러 혹은 client.read()함수가 return하는 값을 확인해보고,
invalid key 에러가 나올 경우
http://www.openweathermap.org/appid 사이트 참조하시면 됩니다.
코딩을 해보았는데 시리얼 모니터화면에서
Waiting for DHCP address
.....................................................
이런식으로 계속 반복입니다.. 뭐가 문제 일까요??
안녕하세요 ㅠㅠ
connecting to server...
Connected! Making HTTP request to api.openweathermap.org for Gangnam...
Weather information for Gangnam
connecting to server...
Connected! Making HTTP request to api.openweathermap.org for Gangnam...
Weather information for Gangnam
-------------------------------------------------
만 반복 출력되고
날씨온도습도등은 출력되지않는데 어떻게해야하나요 ㅠㅠ
최백서 2015-04-17 14:16:34
와이파이쉴드를 이용하여 날씨정보를 받아오고 파씽 하는거 까지는 하였습니다.
그런데 파씽하고 해당 버튼을 누르면 location 정보를 바꾸어서 다른 도시로 바꿀려고 하는데 와이파이 쉴드에 버튼을 추가하면 와이파이가 안됩니다.