거의 방치한 블로그에 댓글로 뭔가 물어보신 분들이...사실 뭐 유투브도 방치이긴 한데...

2023년에는 정보를 다시 확인하고 정리해서 검색하면 다른쪽에서 보여지도록 하겠습니다.

그 때까지는 유지될테지만...기존처럼... 방치될 예정입니다.

https://www.youtube.com/@impoto 

 

임포토

 

www.youtube.com

차라리 유투브에 댓글을 다시면 그나마 여기보단 더 가끔 로그인을 하긴 하니까요..

이걸로 먹고 사는 인간이 아니라서 그렇습니다.

미세먼지 정보를 가까운 측정소에가 값을 가져와서 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);
  }
}

 

현재 이 블로그는 방치되어있습니다. 그리고 마지막 업데이트가 안되있어서...안될껍니다. 아마도 댓글에서 보시면 알겠지만.... 공공데이터쪽 api가 아마 달라졌을 꺼같은데...저도 이거 손 놓은지 오래라서...확인해야 합니다. ㅡ_ㅡ;;

23년 말에는 이 블로그를 다 폐쇄하고 다시 정리 해서 새로운 곳에서 해당 정보가 검색되도록 할 예정입니다. (그리고 24년에.......)

그나마 https://www.youtube.com/@impoto 유투브는 가끔은 로그인을 하니까 이쪽 커뮤니티나 댓글로 연락을 주시면...조금은 더 빠르게...(라고 하고 방치한 댓글이..쿨럭..... 하여간... 최근엔 또 공부하고 있으니까....지키지 못할 약속을 또...)

 

#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()
{
  // 시리얼 세팅
  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("PM10 : " + pm10);
          ////////////////////////////////////////////////////////////////////////
        }
      } else {
        Serial.printf("[HTTP] GET... 실패, 에러코드: %s\n", http.errorToString(httpCode).c_str());
      }
      http.end();
    } else {
      Serial.printf("[HTTP] 접속 불가\n");
    }
    delay(600000);
  }
}

//////////////이부분이 추가되었습니다./////////////

PM10 : 40

 그래서 시리얼 부분에 보이는 모습은 PM수치만 나옵니다.

 

이전 문서와 같이보세요

https://jpal.tistory.com/440

 

공공데이터포털에서 대기오염정보 조회 서비스를 신청한다.

그리고 실행을 하면 아래 그림과 같이 나온다.


최신 정보만 받아올 것이므로 numOfRows의 숫자를 1로 바꿔준다.

최신 1시간 정보만 가져오므로 파싱해야할 데이터가 줄기 때문에 좋다.

 


최신의 데이터 1개만 표시된다.

주소부분을 복사해서 소스 코드에 넣는다.


아두이노 소스는 https://github.com/LOVOTLAB/youtube/blob/master/ESP8266/airQuality_1getXMLfromAirKorea/airQuality_1getXMLfromAirKorea.ino 에서 가져왔다.

원래소스는 부분으로 나눠놓았지만

String url =""부분에 복사한 주소를 넣고 처리함.

#include <ESP8266WiFi.h> // ESP 8266 와이파이 라이브러리
#include <ESP8266HTTPClient.h> // HTTP 클라이언트


String url = "http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty?serviceKey=당신의 키값을 넣으세요&numOfRows=1&pageNo=1&stationName=%EC%84%9D%EB%B0%94%EC%9C%84&dataTerm=DAILY&ver=1.3";

void setup()
{
  // 시리얼 세팅
  Serial.begin(115200);
  Serial.println();

  // 와이파이 접속
  WiFi.begin("공유기이름넣으세요", "비밀번호수정하세요"); // 공유기 이름과 비밀번호

  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) // 와이파이 접속하는 동안 "." 출력
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP()); // 접속된 와이파이 주소 출력
}

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에 저장
          Serial.println(payload);
        }
      } else {
        Serial.printf("[HTTP] GET... 실패, 에러코드: %s\n", http.errorToString(httpCode).c_str());
      }
      http.end();
    } else {
      Serial.printf("[HTTP] 접속 불가\n");
    }
    delay(600000);
  }
}

 

그래서 얻은 결과는 다음과 같다.

 

<?xml version="1.0" encoding="UTF-8"?>




<response>
	<header>
		<resultCode>00</resultCode>
		<resultMsg>NORMAL SERVICE.</resultMsg>
	</header>
	<body>
		<items>
			
				<item>
					<dataTime>2020-03-23 01:00</dataTime>
					
                        <mangName>도로변대기</mangName>
                    
					<so2Value>0.007</so2Value>
					<coValue>0.5</coValue>
					<o3Value>0.039</o3Value>
					<no2Value>0.018</no2Value>
					<pm10Value>40</pm10Value>
					
                        <pm10Value24>35</pm10Value24>
                    
					
                        <pm25Value>21</pm25Value>
                    
                    
                        <pm25Value24>17</pm25Value24>
                    
					<khaiValue>58</khaiValue>
					<khaiGrade>2</khaiGrade>
					<so2Grade>1</so2Grade>
					<coGrade>1</coGrade>
					<o3Grade>2</o3Grade>
					<no2Grade>1</no2Grade>
					<pm10Grade>2</pm10Grade>
					
                        <pm25Grade>2</pm25Grade>
                    
                    
                        <pm10Grade1h>2</pm10Grade1h>
                        <pm25Grade1h>2</pm25Grade1h>
                    
				</item>
			
		</items>
			<numOfRows>1</numOfRows>
			<pageNo>1</pageNo>
			<totalCount>23</totalCount>
	</body>
</response>

나중에 PM10과 PM2.5부분의 파싱을 해보자

https://jpal.tistory.com/441

 

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, 13_red
  pinMode(13, OUTPUT); //14_green, 12_blue, 13_red
  pinMode(12, OUTPUT); //14_green, 12_blue, 13_red
}


void loop() {
  digitalWrite(13, LOW);
  digitalWrite(4, LOW);
  delay(1000);                   
  digitalWrite(13, HIGH);
  digitalWrite(4, HIGH);
  delay(1000);                    
}

 

#include<Servo.h>
#include <SoftwareSerial.h>
 
int blueTx=8;   //Tx (보내는핀 설정)at
int blueRx=9;   //Rx (받는핀 설정)
SoftwareSerial mySerial(blueTx, blueRx);  //시리얼 통신을 위한 객체선언

Servo myservo1;
Servo myservo2;

//////////////////////////////////////////////////////////// 
void setup()
{
  myservo1.attach(4);
  myservo2.attach(6);
  Serial.begin(9600);   //시리얼모니터
  mySerial.begin(9600); //블루투스 시리얼
}
void loop()
{
  char cc;
  if (mySerial.available()) {
    cc = (char)mySerial.read();  
    Serial.write(mySerial.read());  //블루투스측 내용을 시리얼모니터에 출력
  }  
  
  if (cc == '1'){
    myservo2.write(0);
    myservo1.write(15);  
  }
  
  if (cc == '2'){
    myservo1.write(0);
    myservo2.write(15);
  }
  
}  

아두이노 나노를 사용하였음.

4번핀 - 서보모터1 제어선

6번핀 - 서보모터2 제어서

8번핀 - 블루투스 HC-06의 TX에 연결

9번핀 - 블루투스 HC-06의 RX에 연결

전원은 6V건전지

 

휴대폰 블루투스 제어어플 (찾아보면 많음)사용

On은 1을 전송

OFF는 2를 전송

 

만약 휴대폰이 보낸 1을 블루투스HC-06받으면

서보모터2는 각도를 0으로 만들고

서보모터1은 각도를 15로 만듬

 

 

https://youtu.be/2WPUyw7JATU

 

실사용 후기

휴대폰 블루투스를 끄면 HC-06이 블루투스를 찾다가 꺼짐

전원을 켰다 꺼도 작동안함(아마 소스코드부터 다시 올려야 하나봄)

목표 :  카페에 있는 진동벨을 아두이노의 블루투스를 사용하여 구현해보자




1단계 : 아두이노 + 모터연결 [카페진동벨만들기 1/3]


2단계 : 아두이노+블루투스+모터연결 [카페진동벨만들기 2/3]


3단계: 아두이노+블루투스+모터연결+휴대폰 [카페진동벨만들기 3/3]


----------------------------------------------------------------------------------------------


휴대폰으로 블루투스에 접속하여

ON버튼을 누르면 a 라는 데이터를

OFF버튼을 누르면 b 라는 데이터를

보내는 프로그램을 만들어보겠습니다.


앱인벤터2를 이용하여 만들었습니다.

전체 코드블럭입니다.

bluetooth_bell_cafe.aia


-------------------------------------------------------------------------------------------


작성과정을 보여주는 영상입니다.


순서대로 하셨다면 맨위에 있는 영상대로 작동할껍니다.



목표 :  카페에 있는 진동벨을 아두이노의 블루투스를 사용하여 구현해보자




1단계 : 아두이노 + 모터연결 [카페진동벨만들기 1/3]


2단계 : 아두이노+블루투스+모터연결 [카페진동벨만들기 2/3]


3단계: 아두이노+블루투스+모터연결+휴대폰 [카페진동벨만들기 3/3]


---------------------------------------------------------------------------



아두이노에 블루투스모듈(HC-06)을 그림과 같이 연결한다


VCC 

 5V

GND

 GND

TXD

 3번핀 (RXD)

RXD

 2번핀 (TXD)


TXD - Transmit Data

RXD - Receive Data


블루투스 모듈에서 보내진 정보를 (TXD)

아두이노에서 받는다고 (RXD)

생각하면 될꺼 같다


(일반적인 예제는 Serial통신이기 때문이어서인시

클래스 이름을 Serial로 하였으나

여기에서는 다른 이름을 사용해도 된다는 것을

보여주기 위해서 aaa로 하였다)


#include <SoftwareSerial.h> //~~~.h 라이브러리추가
SoftwareSerial aaa(2,3); //aaa클래스라는 클래스는
                              //2번핀 - TXD
                             //3번핀 - RXD 라고 알려줌
  
void setup() {
  pinMode(13, OUTPUT);   //13번 핀이 5V 출력임
  aaa.begin(9600);           //aaa가 9600bps의 속도로 통신을 시작함
}

void loop() {
 
  switch(aaa.read()){            //통신으로 얻은 데이터를 불러온다
    case 'a':                      //그 값이 a인경우
      digitalWrite(13,HIGH); //13번핀에 5V전원공급
      break;                     //이후 switch안의 텍스트 무시
    case 'b':                    //그 값이 b인경우
      digitalWrite(13,LOW);
      break;
  }
}


aaa.begin(9600);을 설정되면

통신을 할수 있는 상태가 되는 것이다.


switch문을 넣은 것은 case에 따라

다른 명령을 실행하기 위함이다.


블루투스를 통해 얻은 데이타가

a라는 문자인경우

모터를 가동(13번핀에 5V 전원공급)


b라는 문자인경우

모터 중단 (13번핀에 0v 전원공급)

목표 :  카페에 있는 진동벨을 아두이노의 블루투스를 사용하여 구현해보자




1단계 : 아두이노 + 모터연결 [카페진동벨만들기 1/3]


2단계 : 아두이노+블루투스+모터연결 [카페진동벨만들기 2/3]


3단계:  휴대폰으로 진동벨을 만들자 (휴대폰 2대 / 앱인벤터) [카페진동벨만들기 3/3]


-----------------------------------------------------------------------------------

void setup() {
  pinMode(13, OUTPUT); //13번 핀이 5V 출력임
}

void loop() {
  digitalWrite(13, HIGH);   // 13번 핀에 5V 전원을 공급
  delay(1000);              // 1초대기
  digitalWrite(13, LOW);    // 13번 핀에 0V 전원을 공급
  delay(1000);              // 1초대기
}


아두이노 스케치의 기본예제인 Blink 예제 작동시


13번 핀과 자체 내장된 LED가 연결되어 있어 전원이 들어오고 있음을 확인 할 수 있다.


----------------------------------------------------------------------------------------------------


13번 핀에 모터를 연결하고 위에서 사용한 Blink코드를 실행시켜본다.



+ Recent posts