미세먼지 정보를 가까운 측정소에가 값을 가져와서 RGB LED로 보이게 만드는 아두이노 프로젝트
영상으로도 간단히 설명하지만 부분 부분의 설명은 위에 링크에서도 볼 수 있음.
공공데이터포털에서 api를 사용하기 위해 신청하고
미세먼지 데이터를 받아옴 url에 저장
아두이노에 RGB LED를 2개달고 세팅해줌
XML로 받아온 미세먼지 내용의 태그 파싱을 어떻게 할까하다가
indexOf함수와 subString함수로 처리함
<태그>배가고프다</태그>
indexOf함수는 찾은 문자의 위치값을 반환 (예 indexOf ("<태그>") 이라면 반환값 327)
subString함수는 (시작위치, 끝위치) 사이의 문자를 돌려줌
(예 subString (327, 362) 이라면 반환값 '<태그>배가고프다')
(예 subString (327+4, 362)이라면 반환값 '배가고프다')
아두이노에서 문자를 숫자로 만들어주는 함수 .toInt()
delay()함수의 최대는 49일인가 까지 가능하다고...
1000밀리초가 1초임 (정확히 1초는 아님)
80000밀리초는 1.333분
180000밀리초는 3분
1800000밀리초는 30분
#include <ESP8266WiFi.h> // ESP 8266 와이파이 라이브러리
#include <ESP8266HTTPClient.h> // HTTP 클라이언트
String url = "http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty?serviceKey=공공데이터에서 받은API키를 넣어줍니다&numOfRows=1&pageNo=1&stationName=%EC%84%9D%EB%B0%94%EC%9C%84&dataTerm=DAILY&ver=1.3";
void setup()
{
// 설치된 RGB LED 세팅
pinMode(16, OUTPUT); //4_blue, 5_green, 16_red
pinMode(4, OUTPUT); //4_blue, 5_green, 16_red
pinMode(5, OUTPUT); //4_blue, 5_green, 16_red
pinMode(14, OUTPUT); //14_green, 12_blue, 13_red
pinMode(13, OUTPUT); //14_green, 12_blue, 13_red
pinMode(12, OUTPUT); //14_green, 12_blue, 13_red
// 시리얼 세팅
Serial.begin(115200);
Serial.println();
// 와이파이 접속
WiFi.begin("공유기이름", "공유기비밀번호"); // 공유기 이름과 비밀번호
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) // 와이파이 접속하는 동안 "." 출력
{
delay(500);
Serial.print(".");
}
Serial.println();
}
void loop() {
if (WiFi.status() == WL_CONNECTED) // 와이파이가 접속되어 있는 경우
{
WiFiClient client; // 와이파이 클라이언트 객체
HTTPClient http; // HTTP 클라이언트 객체
if (http.begin(client, url)) { // HTTP
// 서버에 연결하고 HTTP 헤더 전송
int httpCode = http.GET();
// httpCode 가 음수라면 에러
if (httpCode > 0) { // 에러가 없는 경우
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = http.getString(); // 받은 XML 데이터를 String에 저장
////////////////////////////////////////////////////////////파싱
int start_point = payload.indexOf("<pm10Value>");
int end_point = payload.indexOf("</pm10Value>");
String pm10=payload.substring(start_point+11,end_point); //더하기11은 <pm10Value>글자수
Serial.println("PM 10 : " + pm10);
/////////////////////////////////////////////////////////////
int start_point2 = payload.indexOf("<pm25Value>");
int end_point2 = payload.indexOf("</pm25Value>");
String pm25=payload.substring(start_point2+11,end_point2); //더하기11은 <pm10Value>글자수
Serial.println("PM2.5 : " + pm25);
///////////////////////////////////////////////////////////////
int pm_10 = pm10.toInt(); //문자를 숫자화
int pm_25 = pm25.toInt(); //문자를 숫자화
//PM10 LED 불켜기
if (pm_10>0 & pm_10<=30){
digitalWrite(12, HIGH); //파랑색 = PM10 0~ 30
}
else if (pm_10>30 & pm_10<=80){
digitalWrite(14, HIGH); //녹색 = PM10 30~ 80
}
else if (pm_10 > 80){
digitalWrite(13, HIGH); //빨강색 = PM10 80위에
}
//PM 2.5 LED 불켜기
if (pm_25>0 & pm_25<=30 ){
digitalWrite(4, HIGH); //파랑색 = PM2.5 0~ 30
}
else if (pm_25>30 & pm_25<=80 ){
digitalWrite(5, HIGH); //녹색 = PM2.5 30~ 80
}
else if (pm_25>80){
digitalWrite(16, HIGH); //빨강색 = PM2.5 80위에
}
///////////////////////////////////////////////////////////////////
}
} else {
Serial.printf("[HTTP] GET... 실패, 에러코드: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
} else {
Serial.printf("[HTTP] 접속 불가\n");
}
delay(1800000);
}
}
'아두이노' 카테고리의 다른 글
블로그 폐쇄알림.... https://www.youtube.com/@impoto (0) | 2023.01.06 |
---|---|
NodeMCU 8266 공공데이터포털 대기오염정보 API 파싱 (아두이노) (2) | 2020.03.23 |
NodeMCU 8266 공공데이터포털 대기오염정보 API 가져오기 (아두이노) (0) | 2020.03.23 |
NodeMCU 8266 RGB LED 깜빡이기 (0) | 2020.03.22 |
HC-06 과 Servo 모터 2개를 이용한 방 등 끄기 _ 켜기 (0) | 2019.09.27 |