아두이노 nodemcu 을 이용해서 기상청에서 날씨을 가져오는 프로그램 소스 공유합니다.
아래의 프로그램을 간단히 설명하면,
1. 와이파이로 인터넷에 접속한다.
2. 기상청에 접속해서 우리 동네 날짜를 xml로 가져온다.
3. 가져온 xml을 파싱해서 현재 온도, 날씨, 습도를 String에 저장하고 출력한다.
해외 날씨 api을 이용해 날씨 정보를 가져오는 공개된 아두이노 프로그램은 있으나,
국내 기상청 api을 이용해 날씨를 가져오는 프로그램은 찾지 못해서 만들어서 올려봅니다.
소스는 간단하나 oled, lcd, led 등을 이용해 현재 날씨 정보을 다양하고 재미있는 방법으로 표현해 보세요.
필요한 준비물은
5불짜리 nodemcu 하나와 usb 케이블
아래 주소는 구매처
소스의 xml 는 아래와 같습니다. 맨뒤에 zone은 동을 숫자로 나타내고 있습니다.
http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=1162058500
xml 주소를 가져오는 방법은 아래의 url로 접속하셔서,
시구동을 선택하고 rss을 누르면, 해당 지역의 url 주소를 아실 수 있습니다.
--------------------------- 소스 시작--------------------------
#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);
}
'컴퓨터 프로그래밍 > NodeMCU' 카테고리의 다른 글
만원으로 미세먼지 측정기 자작하기. (0) | 2016.04.04 |
---|---|
아두이노 nodemcu 을 이용해서 기상청에서 날씨정보을 가져오기 (6) | 2015.12.04 |
Nodemcu 소개 특징 (0) | 2015.11.03 |
NodeMCU V1.0 Arduino IDE 환경 구축하기 (0) | 2015.11.03 |
-
대학생 2016.02.02 14:51 신고
안녕하세요. 유용하고 좋은 정보 감사합니다. 기상청 파싱에 대해서 검색하다가 글을 보았습니다.
저는 학교프로젝트로 아두이노로 기상청 정보를 파싱해서 받아오는 기능을 구현하고 있는데요. 그런데 제가 많이 부족해서 궁금한 점이 있어 질문 드립니다.
nodeMCU라는 기기가 생소한데요, 부끄럽지만 소개 특징을 읽어봤습니다만 잘모르겠습니다. nodeMCU라는 기기는 아두이노의 종류중 하나인 건가요? 저는 '와이파이 사용에 특화된 아두이노'라고 이해했는데 맞는지 모르겠습니다.
그렇다면 제가 사용하려는 아두이노 uno r3 에서도 인터넷에 연결된 상태(LAN 이용)라면 이 자료를 이용해서 적용할 수 있는것인가요?
만약 아두이노 우노 r3와 다른점(코딩방법이나 필요한 것)이 있다면 어떤것이 있을까요?
그리고 본문 정보에서는 현재온도, 현재날씨(한,영), 현재습도 총 4가지 정보를 받아올 수 있는데요, 혹시 다른정보(날짜,시간,최고기온,
강수확률 등 기상청에서 제공하는 다른정보들)을 받아올 수 도 있나요? 가능하다면 다른 변수를 선언하고 요청하면 되는걸까요?
감사합니다-
nodeMCU라는 기기는 아두이노의 종류중 하나인 건가요?
아두이노의 한 종류는 아닙니다. 아두이노 sdk을 이용할수 있습니다.
그렇다면 제가 사용하려는 아두이노 uno r3 에서도 인터넷에 연결된 상태(LAN 이용)라면 이 자료를 이용해서 적용할 수 있는것인가요?
esp8266 에서 사용하는 라이블러리를 사용하는 소스라 바꾸셔야 합니다.
만약 아두이노 우노 r3와 다른점(코딩방법이나 필요한 것)이 있다면 어떤것이 있을까요?
일단 GPIO 핀이 틀립니다. MCU 자체도 틀리고요.
그리고 본문 정보에서는 현재온도, 현재날씨(한,영), 현재습도 총 4가지 정보를 받아올 수 있는데요, 혹시 다른정보(날짜,시간,최고기온,
강수확률 등 기상청에서 제공하는 다른정보들)을 받아올 수 도 있나요? 가능하다면 다른 변수를 선언하고 요청하면 되는걸까요?
기상청 rss에서 제공하는 정보는 다양합니다. 기상청 사이트를 방문해 보세요.
http://www.kma.go.kr/weather/lifenindustry/sevice_rss.jsp
-
-
바른말 2016.02.14 17:06 신고
능력이 엄청 부럽습니다 .
라즈베리파이에 웹서버 설치하고 nodeMcu의 wifi로 웹서버에 접속하여 온도습도 저장하는 것 한번 해보고 싶은데 프로그램 실력이 딸려서 못하고 있는데
능력자 신것 같은데 다음에 시간나면 한번 해보시고 방법 부탁드립니다.