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

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);                    
}

 

유투브 크롬과 파이어폭스로 볼 때의 차이

 

Youtube LIVE

 

왼쪽 크롬 | 오른쪽 파이어폭스 (부가기능X)

Connection Speed가

크롬으로는 7000kbs가 나오는데

파이어폭스는 80kbs가 나왔음

 

구글 쪽에서 엣지나 파이어폭스로 볼 때 제한을 건다는 기사가 이정도 차이가 나는 줄은 몰랐음.

그래서 파이어폭스 부가기능에 Youtube Classic 을 추가해서 다시 접속해봄

 

왼쪽 크롬 | 오른쪽 파이어폭스 (부가기능 O)

이제서야 비슷해지지만 그래도 크롬쪽이 2000kbs가 높음

 


Youtube 일반영상

 

Connection Speed가 파이어폭스가 2000kbs정도 높음

(라이브와 결과가 반대여서 다른 자료 2개를 비교해봄)

 

왼쪽 크롬 | 오른쪽 파이어폭스 (부가기능 X)

#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이 블루투스를 찾다가 꺼짐

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

파이썬 + 유투브 API로 채널 구독자수 확인 (자체소스 아님 정리용)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
import urllib.request
import json
 

idn=input("Enter username: ")
#name=input("Enter username: ")

key = "개인이 발급 받은 구글API키"
 
data = urllib.request.urlopen("https://www.googleapis.com/youtube/v3/channels?part=statistics&id="+idn+"&key="+key).read()
#data = urllib.request.urlopen("https://www.googleapis.com/youtube/v3/channels?part=statistics&forUsername="+name+"&key="+key).read()
 
subs = json.loads(data)["items"][0]["statistics"]["subscriberCount"]
 
print(idn + ' 님의 구독자 수는 '+ '{:,d}'.format(int(subs))+' 입니다.')
#print(name + ' 님의 구독자 수는 '+ '{:,d}'.format(int(subs))+' 입니다.')
cs


name은 채널의 id를 알 경우


idn은 ㅁㅁㅁㅁ를 알 경우


https://www.youtube.com/channel/ㅁㅁㅁㅁㅁㅁㅁㅁ



결과값

fwXEPBOw 님의 구독자 수는 16,948 입니다.


1
2
3
4
5
6
7
8
9
10
import xlrd
 
book = xlrd.open_workbook('sample.xlsx')
sheet = book.sheet_by_name('Sheet1')
 
 
print(sheet.cell_value(1,0))
 
print(int(sheet.cell_value(2,2)))
 

cs


3행 엑셀파일 불러오기

4행 sheet1 불러오기


7행 텍스트 셀값 불러오기

9행 수 셀값 불러오기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import xlrd
 
book = xlrd.open_workbook('sample.xlsx')
sheet = book.sheet_by_name('Sheet1')
 
mail = []
for i in range(1,sheet.nrows):
    a_col = sheet.cell_value(i,0)
    mail.append(a_col)
 
name = []
for i in range(1,sheet.nrows):
    b_col = sheet.cell_value(i,1)
    name.append(b_col)
 
turn = []
for i in range(1,sheet.nrows):
    c_col = int(sheet.cell_value(i,2))
    turn.append(c_col)
 
print(mail) 
print(name) 
print(turn)
 
cs


6행 mail 리스트만들기

7~9행 A열값 한 줄씩 불러와 mail 리스트에 추가하기


11행 name 리스트만들기

12~14행 B열값 한 줄씩 불러와 name 리스트에 추가하기


16행 turn 리스트만들기

17~19행 B열값 한 줄씩 불러와 turn 리스트에 추가하기 (숫자부분이라 정수형으로 만들어줌 int)

naver_mail.zip


파이썬으로 엑셀파일을 읽어 메일주소, 사람이름등을 바꿔가며 보내주는 프로그램입니다.


즉 메일머지 기능입니다. <<cell_b>>, <<cell_c>>,<<cell_d>>가 변화되는 부분입니다.






SMTP로 발송하면 네이버 발송메일함에 안들어가나 봅니다.


마지막에는 자기의 메일 주소를 넣어서 제대로 갔는 지 확인합시다


한 번 테스트 해보시면 바로 이해하실 껍니다.




너무 많이 보내면 네이버에서 스팸으로 취급해서 차단할 수도 있다고 합니다.


찾아봤는데 1시간에 X통 1일 x통이라고 하는데 정확히 모르겠습니다.


제가 예전에 확인 했을 때는 1번에 50통이 들어가던데...



한 번에 몇 백통씩 쏘는 게 아니면 괜찮은건지....


아마 하루에 얼마까지라는 리밋도 있긴 할 껀데...



소모임 발송용으로 사용하는데는 문제 없을꺼 같습니다.





+ Recent posts