아두이노 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 소개


저작자 표시
신고
  1. 대학생 2016.02.02 14:51 신고

    안녕하세요. 유용하고 좋은 정보 감사합니다. 기상청 파싱에 대해서 검색하다가 글을 보았습니다.
    저는 학교프로젝트로 아두이노로 기상청 정보를 파싱해서 받아오는 기능을 구현하고 있는데요. 그런데 제가 많이 부족해서 궁금한 점이 있어 질문 드립니다.
    nodeMCU라는 기기가 생소한데요, 부끄럽지만 소개 특징을 읽어봤습니다만 잘모르겠습니다. nodeMCU라는 기기는 아두이노의 종류중 하나인 건가요? 저는 '와이파이 사용에 특화된 아두이노'라고 이해했는데 맞는지 모르겠습니다.
    그렇다면 제가 사용하려는 아두이노 uno r3 에서도 인터넷에 연결된 상태(LAN 이용)라면 이 자료를 이용해서 적용할 수 있는것인가요?

    만약 아두이노 우노 r3와 다른점(코딩방법이나 필요한 것)이 있다면 어떤것이 있을까요?

    그리고 본문 정보에서는 현재온도, 현재날씨(한,영), 현재습도 총 4가지 정보를 받아올 수 있는데요, 혹시 다른정보(날짜,시간,최고기온,
    강수확률 등 기상청에서 제공하는 다른정보들)을 받아올 수 도 있나요? 가능하다면 다른 변수를 선언하고 요청하면 되는걸까요?

    감사합니다

    • Favicon of http://ilikesan.tistory.com BlogIcon 산좋아해 2016.02.06 11:12 신고

      nodeMCU라는 기기는 아두이노의 종류중 하나인 건가요?
      아두이노의 한 종류는 아닙니다. 아두이노 sdk을 이용할수 있습니다.
      그렇다면 제가 사용하려는 아두이노 uno r3 에서도 인터넷에 연결된 상태(LAN 이용)라면 이 자료를 이용해서 적용할 수 있는것인가요?
      esp8266 에서 사용하는 라이블러리를 사용하는 소스라 바꾸셔야 합니다.
      만약 아두이노 우노 r3와 다른점(코딩방법이나 필요한 것)이 있다면 어떤것이 있을까요?
      일단 GPIO 핀이 틀립니다. MCU 자체도 틀리고요.
      그리고 본문 정보에서는 현재온도, 현재날씨(한,영), 현재습도 총 4가지 정보를 받아올 수 있는데요, 혹시 다른정보(날짜,시간,최고기온,
      강수확률 등 기상청에서 제공하는 다른정보들)을 받아올 수 도 있나요? 가능하다면 다른 변수를 선언하고 요청하면 되는걸까요?
      기상청 rss에서 제공하는 정보는 다양합니다. 기상청 사이트를 방문해 보세요.
      http://www.kma.go.kr/weather/lifenindustry/sevice_rss.jsp

  2. 바른말 2016.02.14 17:06 신고

    능력이 엄청 부럽습니다 .
    라즈베리파이에 웹서버 설치하고 nodeMcu의 wifi로 웹서버에 접속하여 온도습도 저장하는 것 한번 해보고 싶은데 프로그램 실력이 딸려서 못하고 있는데
    능력자 신것 같은데 다음에 시간나면 한번 해보시고 방법 부탁드립니다.

    • Favicon of http://ilikesan.tistory.com BlogIcon 산좋아해 2016.02.18 11:45 신고

      취미로 공부하고 있는 아마추어입니다.
      좋게 봐 주셔서 감사합니다.^^
      응원의 메세지로 알고 좀더 신경써서 포스트 올리도록 하겠습니다.

  3. 2017.02.16 20:49

    비밀댓글입니다

  4. 젠토 2017.10.22 18:16 신고

    오래된 게시물에 늦은 질문을 하여 대단히 죄송합니다.
    궁금한 점이 있는데 이 와이파이모듈을 아두이노 우노 보드에 연결하여 날씨 정보 등을 또 다른 기능이 가능하도록 연결이 가능할까요?

+ Recent posts