대량 만원으로 미세먼지 측정기를 자작하고자 하는 분들을 위해 강좌 공유합니다.

아두이노는 강좌를 쉽게 찾을수 있는데, nodemcu는 없어서 올려 봅니다.


개발환경은 아두이노 개발툴이고  c언어 기반입니다.


이 강좌를 활용해서 아래와 같은 자기만의 물건을 만들어 보면 좋겠습니다.


1. 만원정도로 미센먼지을 측정해서 인터넷 서버에 데이터을 저장하는 나만의 장치를 만들어 본다.

2. 환풍기나 공기청정기를 미세먼지에 따라 자동으로 작동하게 만들어 본다.


짧은 소개 영상.



------------ 중요 부품 소개 ------


1. nodemcu  US $4.14

구매처:

http://ko.aliexpress.com/item/V2-4M-4FLASH-NodeMcu-Lua-WIFI-Networking-development-board-Based-ESP8266/32448662166.html?detailNewVersion=3



2. 미세먼지 부품GP2Y1010AU0F Dust Sensor:

Dust Sensor - 3.85$

http://ko.aliexpress.com/item/Free-Shipping-GP2Y1010AU0F-Compact-Optical-Dust-Sensor-Smoke-Particle-Sensor-With-Cable/32377316913.html


상품명: GP2Y1010AU0F 먼지 센서 모듈

기술 매개 변수:

전원 전압: dc5 ± 2 볼트

동작 전류: 20ma (피크)

감도: 0.5 볼트/(0.1 미리그램/m3)

최소 감지 수준의 입자: 0.8 메터

깨끗한 공기 전압: 0.9 볼트 일반.

작동 온도:-10 ~ 65 

보관 온도:-20 ~ 80 

크기: 46 미리메터 × 30 미리메터 × 17.6 미리메터

사이즈 무게: 15 그램

용도: 주로 먼지 제거 장비 경보 장비, 공기 정화 장비, 먼지 로봇, 화재 경보 등 산업 장비 감지 연기 입자, 꽃가루 포자 다른 입자를;

 

Shp GP2Y1010AU0F 먼지 센서 * 1

케이블 * 1

150ohm 저항 * 1

16v220uF 커패시터 * 1




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


GP2Y1010AU0F  데이터 시트

https://www.sparkfun.com/datasheets/Sensors/gp2y1010au_e.pdf



연결법은 아래의 링크로 가셔서 확인해 보세요.

http://arduinodev.woofex.net/2012/12/01/standalone-sharp-dust-sensor/


저는 아래의 사진과 같이 연결했습니다.









///////////////////// 프로그램 소스 ////////////////////////////



float dustVal=0;

float dustDensity = 0;

 

int ledPower=10;

int delayTime=280;

int delayTime2=40;

float offTime=9680;


void setup(){

  Serial.begin(9600);

  pinMode(ledPower,OUTPUT);

  pinMode(4, OUTPUT);

}

 

void loop(){


  digitalWrite(ledPower,LOW); // power on the LED

  delayMicroseconds(delayTime);


  //먼지 센서를 값을 0.0V~3.3V 을 0~1024 값으로 변경해 줌.

  dustVal=analogRead(A0); // read the dust value 

  delayMicroseconds(delayTime2);


  digitalWrite(ledPower,HIGH); // turn the LED off

  delayMicroseconds(offTime);

 

  delay(3000);



 float voltage=0;

 float v0=0;

 float dust=0;


 //입력된 볼트를 계산해 줌

 voltage=dustVal*(3.3/1024);

 // 볼트를 기준으로 미세먼지 값으로 변환해 줌, 데이터 시트을 참고 오차가 존재합니다.

 dust = (0.17*voltage)*1000;


 

// 미세먼지 수치 출력

  Serial.print("Dust density(ug/m3) = ");

  Serial.print(dust);


//아날로그로 읽어 들인 0-1024 수치

  Serial.print(", dustVal = ");

  Serial.print(dustVal);


// 볼트로 계산해서 출력

  Serial.print(", voltage = ");

  Serial.println(voltage);  

  

}


///////////////////// 프로그램 소스 ////////////////////////////



시리얼 모니터로 출력해 보면,

아래와 같습니다.

측정이 정확히는 안되니, 데이터시트 참고하셔서, 보정하셔서 사용하세요.





정밀측정은 힘들어도 간단한 생활용품을 자작하는데는 무리는 없어 보입니다.


지금까지 강좌를 봐주셔서 감사합니다.


시간 되는데로 미세먼지 값을 oled로 출력하고, 

와이파이로 서버에 저장하는 방법도 공유해서 올리겠습니다.







아두이노 nodemcu 을 이용해서 기상청에서 날씨을 가져오는 프로그램 소스 공유합니다.


아래의 프로그램을 간단히 설명하면, 

1. 와이파이로 인터넷에 접속한다.

2. 기상청에 접속해서 우리 동네 날짜를 xml로 가져온다.

3. 가져온 xml을 파싱해서 현재 온도, 날씨, 습도를 String에 저장하고 출력한다.


해외 날씨 api을 이용해 날씨 정보를 가져오는 공개된 아두이노 프로그램은 있으나,

국내 기상청 api을 이용해 날씨를 가져오는 프로그램은 찾지 못해서  만들어서 올려봅니다.

소스는 간단하나 oled, lcd, led 등을 이용해 현재 날씨 정보을 다양하고 재미있는 방법으로 표현해 보세요.


필요한 준비물은

5불짜리 nodemcu 하나와 usb 케이블

아래 주소는 구매처

http://ko.aliexpress.com/item/V2-4M-4FLASH-NodeMcu-Lua-WIFI-Networking-development-board-Based-ESP8266/32448662166.html?detailNewVersion=3


소스의 xml 는 아래와 같습니다. 맨뒤에 zone은 동을 숫자로 나타내고 있습니다.

http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=1162058500


xml 주소를 가져오는 방법은 아래의 url로 접속하셔서,

시구동을 선택하고 rss을 누르면, 해당 지역의 url 주소를 아실 수 있습니다.

http://www.kma.go.kr/weather/lifenindustry/sevice_rss.jsp?sido=1100000000&gugun=1129000000&dong=1129052500&x=25&y=8



--------------------------- 소스 시작--------------------------


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

}

--------------------------- 소스 끝 --------------------------

실행결과 화면
-2.6  <---- 현재 온도
援щ쫫 留롮쓬 <--- 현재 날씨 한글이라 깨짐
Mostly Cloudy <---현재 날씨 영문 표기
68 <-- 현재 습도




관련문서:

NodeMCU V1.0 Arduino IDE 환경 구축하기

NodeMCU 소개


  1. 대학생 2016.02.02 14:51 신고

    안녕하세요. 유용하고 좋은 정보 감사합니다. 기상청 파싱에 대해서 검색하다가 글을 보았습니다.
    저는 학교프로젝트로 아두이노로 기상청 정보를 파싱해서 받아오는 기능을 구현하고 있는데요. 그런데 제가 많이 부족해서 궁금한 점이 있어 질문 드립니다.
    nodeMCU라는 기기가 생소한데요, 부끄럽지만 소개 특징을 읽어봤습니다만 잘모르겠습니다. nodeMCU라는 기기는 아두이노의 종류중 하나인 건가요? 저는 '와이파이 사용에 특화된 아두이노'라고 이해했는데 맞는지 모르겠습니다.
    그렇다면 제가 사용하려는 아두이노 uno r3 에서도 인터넷에 연결된 상태(LAN 이용)라면 이 자료를 이용해서 적용할 수 있는것인가요?

    만약 아두이노 우노 r3와 다른점(코딩방법이나 필요한 것)이 있다면 어떤것이 있을까요?

    그리고 본문 정보에서는 현재온도, 현재날씨(한,영), 현재습도 총 4가지 정보를 받아올 수 있는데요, 혹시 다른정보(날짜,시간,최고기온,
    강수확률 등 기상청에서 제공하는 다른정보들)을 받아올 수 도 있나요? 가능하다면 다른 변수를 선언하고 요청하면 되는걸까요?

    감사합니다

    • Favicon of http://ilikesan.tistory.com BlogIcon 산좋아해 2016.02.06 11:12 신고

      nodeMCU라는 기기는 아두이노의 종류중 하나인 건가요?
      아두이노의 한 종류는 아닙니다. 아두이노 sdk을 이용할수 있습니다.
      그렇다면 제가 사용하려는 아두이노 uno r3 에서도 인터넷에 연결된 상태(LAN 이용)라면 이 자료를 이용해서 적용할 수 있는것인가요?
      esp8266 에서 사용하는 라이블러리를 사용하는 소스라 바꾸셔야 합니다.
      만약 아두이노 우노 r3와 다른점(코딩방법이나 필요한 것)이 있다면 어떤것이 있을까요?
      일단 GPIO 핀이 틀립니다. MCU 자체도 틀리고요.
      그리고 본문 정보에서는 현재온도, 현재날씨(한,영), 현재습도 총 4가지 정보를 받아올 수 있는데요, 혹시 다른정보(날짜,시간,최고기온,
      강수확률 등 기상청에서 제공하는 다른정보들)을 받아올 수 도 있나요? 가능하다면 다른 변수를 선언하고 요청하면 되는걸까요?
      기상청 rss에서 제공하는 정보는 다양합니다. 기상청 사이트를 방문해 보세요.
      http://www.kma.go.kr/weather/lifenindustry/sevice_rss.jsp

  2. 바른말 2016.02.14 17:06 신고

    능력이 엄청 부럽습니다 .
    라즈베리파이에 웹서버 설치하고 nodeMcu의 wifi로 웹서버에 접속하여 온도습도 저장하는 것 한번 해보고 싶은데 프로그램 실력이 딸려서 못하고 있는데
    능력자 신것 같은데 다음에 시간나면 한번 해보시고 방법 부탁드립니다.

    • Favicon of http://ilikesan.tistory.com BlogIcon 산좋아해 2016.02.18 11:45 신고

      취미로 공부하고 있는 아마추어입니다.
      좋게 봐 주셔서 감사합니다.^^
      응원의 메세지로 알고 좀더 신경써서 포스트 올리도록 하겠습니다.

  3. 2017.02.16 20:49

    비밀댓글입니다

  4. 젠토 2017.10.22 18:16 신고

    오래된 게시물에 늦은 질문을 하여 대단히 죄송합니다.
    궁금한 점이 있는데 이 와이파이모듈을 아두이노 우노 보드에 연결하여 날씨 정보 등을 또 다른 기능이 가능하도록 연결이 가능할까요?

Nodemcu  소개 특징

1. 소개
NodeMCU는 WiFi로 사물은 연결하기 쉬운 MCU입니다.
펌웨어가 오픈소스 이며,몇줄의 Lua script로  여러분의 IOT 프로토타입 제품을 만들수 있도록 돕는 개발키트(development kit) 이다.




nodemcu
Connect Things EASY)
An open-source firmware and development kit that helps you to prototype your IOT product within a few Lua script lines 

인용:

2. nodemcu의 특징
- 오픈소스 , 인터랙티브, , 프로그램가능한 , 낮은 비용, 간단하고 스마트 , 와이파이 가능
Open-source, Interactive, Programmable, Low cost, Simple, Smart, WI-FI enabled

2.1 아두이노와 비슷한 하드웨어 IO
하드웨어 IO(입출력)을 위한 고급 API, 환경설정과 하드웨어을 다루기 위한 일을 획기적으로 줄일수 있다. 아두이노 코드처럼, 하지만 대화형 Lua Script 언어이다.

Arduino-like hardware IO
Advanced API for hardware IO, which can dramatically reduce the redundant work for configuring and manipulating hardware. Code like arduino, but interactively in Lua script.

2.2 Nodejs 스타일의 네트워크 API
이벤트 기반 네트워크 애플리케이션, 개발자에 의해서 작성된 Node.js 스타일의 코드가 5mm*5mm 사이즈의  mcu에서 작동된다. 여러분의 사물인터넷(IOT) 애플리케이션 개발 과정을 휠씬 빠르게 해준다.

Nodejs style network API
Event-driven API for network applicaitons, which faciliates developers writing code running on a 5mm*5mm sized MCU in Nodejs style. Greatly speed up your IOT application developing process.

2.3 가장 낮은 가격의 wi-fi MCU
$2 미만의 wifi MCU(esp8266)는 쉽고 통합된 프로토타입을 위한 개발키트. 우리는 사물인터넷 어플리케이션 개발을 위한 가장 낮은 가격에 제공하고 있다.

2.4관련 링크
MCU 프로그램 예제

MCU  펌웨어 다운로드

MCU 펌웨어 Github

MCU BBS 게시판 



NodeMCU V1.0  Arduino IDE 설치


1. Serial Driver 다운 받아 설치한다.

- 운영체제에 맞는 드라이버를 다운 받아 설치한다.

- 윈도우는 경우 CP210x_VCP_Windows.zip 을 다운 받아, 압축 풀고, 

64비는 운영체제는 CP210xVCPInstaller_x64.exe을 실행

다운 로드 주소:

https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx



2. 아두이노 IDE 설치

아래의 url에서 해당 운영체제에 맞는 아두이노 설치

https://www.arduino.cc/en/pmwiki.php?n=Main/Software



3. ESP8266 tool chain 설치

- 아두이노 IDE 실행

- 파일>환경설정 창에서 Additional Board Manager URLs 항목에 아래의 json 추가 



http://arduino.esp8266.com/package_esp8266com_index.json

- 메뉴에서 도구>보드> Boards Manager 선택 후 "ESP8266"찾아서 인스톨한다.

- 용량이 커서 시작이 걸림, 영문 메뉴얼 대로 커피한잔 .



4. 맞는 보드 선택

도구> 보드> NodeMCU 1.0 (ESP-12E Module)



5. 포트 맞게 설정

도구>포트>com? 선택


6.Wifi Scanner 예제 프로그램 세팅 테스트

파일>예제> ESP8266Wifi> WiFiScan 선택해서 컴파일하고 실행하면 아래와 같은 화면 나오면 설치 성공.

- 다양한 예제를 제공하고 있습니다. 꼭 확인해 보세요.






참고 링크: 

http://blog.squix.ch/p/you-will-be-programming-esp8266-from.html

관련링크 :

Nodemcu 소개 특징

http://ilikesan.com/560


 

+ Recent posts