본문 바로가기

컴퓨터 프로그래밍/NodeMCU

아두이노 nodemcu 을 이용해서 기상청에서 날씨정보을 가져오기

아두이노 nodemcu 을 이용해서 기상청에서 날씨을 가져오는 프로그램 소스 공유합니다.


아래의 프로그램을 간단히 설명하면, 

1. 와이파이로 인터넷에 접속한다.

2. 기상청에 접속해서 우리 동네 날짜를 xml로 가져온다.

3. 가져온 xml을 파싱해서 현재 온도, 날씨, 습도를 String에 저장하고 출력한다.


해외 날씨 api을 이용해 날씨 정보를 가져오는 공개된 아두이노 프로그램은 있으나,

국내 기상청 api을 이용해 날씨를 가져오는 프로그램은 찾지 못해서  만들어서 올려봅니다.

소스는 간단하나 oled, lcd, led 등을 이용해 현재 날씨 정보을 다양하고 재미있는 방법으로 표현해 보세요.


필요한 준비물은

5불짜리 nodemcu 하나와 usb 케이블

아래 주소는 구매처

http://ko.aliexpress.com/item/V2-4M-4FLASH-NodeMcu-Lua-WIFI-Networking-development-board-Based-ESP8266/32448662166.html?detailNewVersion=3


소스의 xml 는 아래와 같습니다. 맨뒤에 zone은 동을 숫자로 나타내고 있습니다.

http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=1162058500


xml 주소를 가져오는 방법은 아래의 url로 접속하셔서,

시구동을 선택하고 rss을 누르면, 해당 지역의 url 주소를 아실 수 있습니다.

http://www.kma.go.kr/weather/lifenindustry/sevice_rss.jsp?sido=1100000000&gugun=1129000000&dong=1129052500&x=25&y=8



--------------------------- 소스 시작--------------------------


#include <ESP8266WiFi.h>


// 와이파이 ssid을 입력해주세요.

const char* ssid     = "XXXXXXX";

//와이파이 비밀번호를 입력해주세요.

const char* password = "XXXXXX";


const char* host = "www.kma.go.kr";


void setup() {

  Serial.begin(115200);

  delay(10);


  // We start by connecting to a WiFi network


  Serial.println();

  Serial.println();

  Serial.print("Connecting to ");

  Serial.println(ssid);

  

  WiFi.begin(ssid, password);

  

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }


  Serial.println("");

  Serial.println("WiFi connected");  

  Serial.println("IP address: ");

  Serial.println(WiFi.localIP());

}


int value = 0;


void loop() {


  ++value;


  Serial.print("connecting to ");

  Serial.println(host);

  

  // Use WiFiClient class to create TCP connections

  WiFiClient client;

  const int httpPort = 80;

  //http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=1162058500

  

  if (!client.connect(host, httpPort)) {

    Serial.println("connection failed");

    return;

  }

  

  // We now create a URI for the request

//zone을 일종의 지역 정보입니다.


  String url = "/wid/queryDFSRSS.jsp?zone=1162058500";

  

  Serial.print("Requesting URL: ");

  Serial.println(url);

  

  // This will send the request to the server

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +

               "Host: " + host + "\r\n" + 

               "Connection: close\r\n\r\n");

  delay(10);

  

  // Read all the lines of the reply from server and print them to Serial

  String weather_str="";


  //온도

  String wt_temp="";

  //오늘의날씨

  String wt_wfKor="";

  String wt_wfEn="";

  //습도

  String wt_reh="";

  int i=0;

  

  while(client.available()){

    i++;

//라인을 기준으로 문자열을 저장한다.

    String line = client.readStringUntil('\n');


    int temp33= line.indexOf("seq=\"1\"");

    if(temp33>0)

    {

      break;

    }


//온도 xml 에서 파싱    

    int temp= line.indexOf("</temp>");

    if(temp>0)

    {


      String tmp_str="<temp>";

      String wt_temp = line.substring(line.indexOf(tmp_str)+tmp_str.length(),temp);

      Serial.println(wt_temp);  

    }


//날씨 정보 영문으로 가져오기

    int wfEn= line.indexOf("</wfEn>");

    if(wfEn>0)

    {


      String tmp_str="<wfEn>";

      String wt_twfEn = line.substring(line.indexOf(tmp_str)+tmp_str.length(),wfEn);

      Serial.println(wt_twfEn);  

    }


//날씨 정보 으로 가져오기

    int wfKor= line.indexOf("</wfKor>");

    if(wfKor>0)

    {

      String tmp_str="<wfKor>";

      String wt_wfKor = line.substring(line.indexOf(tmp_str)+tmp_str.length(),wfKor);

      Serial.println(wt_wfKor);  

    }


    int reh= line.indexOf("</reh>");

    if(reh>0)

    {

      String tmp_str="<reh>";

      String wt_reh = line.substring(line.indexOf(tmp_str)+tmp_str.length(),reh);

      Serial.println(wt_reh);  

    }

    

  }


  //int ln_num= weather_str.indexOf("\n");

    

  

  Serial.println();

  Serial.println("closing connection");

  delay(20000);

}

--------------------------- 소스 끝 --------------------------

실행결과 화면
-2.6  <---- 현재 온도
援щ쫫 留롮쓬 <--- 현재 날씨 한글이라 깨짐
Mostly Cloudy <---현재 날씨 영문 표기
68 <-- 현재 습도




관련문서:

NodeMCU V1.0 Arduino IDE 환경 구축하기

NodeMCU 소개