미세먼지 정보를 가까운 측정소에가 값을 가져와서 RGB LED로 보이게 만드는 아두이노 프로젝트

 

https://jpal.tistory.com/439

 

NodeMCU 8266 RGB LED 깜빡이기

void setup() { 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, 1..

jpal.tistory.com

https://jpal.tistory.com/440

 

NodeMCU 8266 공공데이터포털 대기오염정보 API 가져오기 (아두이노)

공공데이터포털에서 대기오염정보 조회 서비스를 신청한다. 그리고 실행을 하면 아래 그림과 같이 나온다. 최신 정보만 받아올 것이므로 numOfRows의 숫자를 1로 바꿔준다. 최신의 데이터 1개만 표시된다. 주소..

jpal.tistory.com

https://jpal.tistory.com/441

 

NodeMCU 8266 공공데이터포털 대기오염정보 API 파싱 (아두이노)

#include // ESP 8266 와이파이 라이브러리 #include // HTTP 클라이언트 String url = "http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getM..

jpal.tistory.com

영상으로도 간단히 설명하지만 부분 부분의 설명은 위에 링크에서도 볼 수 있음.

 

 

공공데이터포털에서 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);
  }
}

 

+ Recent posts