프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

미세 먼지, 도데체 먼지? 미세먼지측정기 만들기

2018-03-30 14:50:13

 

봄, 가을의 불청객! 바로 미세먼지!

요즘 미세먼지가 연일 화제가 되고 있습니다. 

 

<출처 : JTBC>

 

<출처 : 연합뉴스>

 

그렇다면 우리의 건강을 위협하는 미세먼지의 존재는 무엇일까요?

 


미세먼지란?

아주 작은 입자를 가진 먼지로서 먼지의 직경에 따라 미세먼지(지름이 10㎛이하), 초미세먼지(지름이 2.5㎛ 이하)로 구분된다. 

 

미세먼지가 인체에 미치는 유해성

미세먼지는 입자가 작기 때문에 폐에 축적되기도 하지만, 페포를 통과해 혈액 속으로 들어가기 때문에 여러가지 복합적 질병을 유발할 수 있다. 

 


<출처 : 건강한 꿀팁>

 

위와 같이 미세먼지는 인체에 굉장히 유해한 물질임에도 불구하고, 많은 분들께서 

그 위험도를 피부로 느끼지 못하고 있습니다. 

 

이유는 '눈에 잘 보이지 않고, 직관적으로 현재의 상태를 확인할 수 없기' 때문이죠. 

현재 내가 있는 공간에 미세먼지의 양을 눈으로 확인할 수 있다면, 조금 더 미세먼지에 대한 건강 관리가 가능할 것입니다. 

 

자 그럼 직접 미세먼지측정기를 만들어 보도록 할까요?

 

 

 

 

개요

 

 

 

MDF 외관과 아크릴로 구성되어 있는 아기자기한, 코코아팹의 감성이 담겨있는 미세먼지 측정기의 모습입니다. 

그렇다면 미세먼지 측정기는 어떤 기능을 가지고 있을까요? :) 

(궁금 궁금)

 

 

미세먼지 측정기의 기능

- 미세먼지센서 : 초미세먼지(지름이 2.5㎛ 이하) 센서로서 미세먼지의 농도를 측정합니다. 

- 온·습도 센서 : 온도와 습도를 측정합니다. 

- RGB LED : 미세먼지농도량 또는 불쾌지수 단계 등 여러정보를 LED의 색으로 표현합니다. 

- LCD : 센서에서 측정된 정확한 수치 정보를 표시합니다. 

 

 

 

 

 

 

 

부품 목록

 

미세먼지측정기에 사용되는 부품의 목록은 아래와 같습니다. 

 

NO 부품명 수량 상세 설명
1 오렌지보드 1 아두이노 UNO
2 미세먼지센서 1 Sharp / GP2Y1010AU0F
3 RGB LED 모듈 1 KY-016
4 온·습도 센서 모듈 1 DHT-11
5 LCD 1 I2C Interface / 16*2
6 브레드보드 1 Mini
7 점퍼케이블 20 F/F, F/M

 

부품명 오렌지보드 미세먼지센서 RGB LED 모듈 온·습도 센서 모듈 LCD
부품 사진

 

 

구매 및 기타문의

유현국팀장 
Tel : 02-3470-2837 
mail : yoohk@nepes.co.kr

 

 

 

 

 

 

관련 튜토리얼

 

미세먼지측정기에 사용되는 주요 부품들에 대한 사용 방법을 익혀봅시다. 

 

- 미세먼지센서 사용하기

- 온·습도 센서 사용하기

- RGB LED 모듈 사용하기

- I2C LCD 사용하기

 

 

 

 

 

 

라이브러리 다운 받기

 

미세먼지측정기는 별도의 라이브러리 설치를 필요로 합니다. 

※ 라이브러리를 제대로 설치하지 않으면, 펌웨어(코드)가 정상적으로 업로드되지 않습니다. 꼭 설치해주세요!

 

- PMsensor / 미세먼지센서 라이브러리 : https://github.com/ekkai/PMsensor

* 코코아팹에서 자체 개발한 미세먼지센서 라이브러리입니다. 

 

- LiquidCrystal_I2C / LCD 라이브러리 : https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

- Simple DHT / 온·습도 센서 라이브러리 : https://github.com/winlinvip/SimpleDHT

 

<참고> 라이브러리 설치 방법 알아보기

 

 

 

 

 

 

하드웨어 메이킹

브레드보드 레이아웃

 

 

 

<이것만 확인해봅시다>

- 미세먼지센서의 회로 연결에서 실수 발생률이 가장 높습니다. 선 연결을 잘 확인하세요!

- 온·습도 센서의 경우 전원을 잘못 연결하면 소자가 잘 녹아버립니다. +, - 전원이 잘 연결되었는지 확인하세요!

 

<온습도 센서 종류에 따른 연결 방법>

키트의 온습도 센서 모듈의 종류를 잘 확인한 후 핀 연결 방법을 잘 확인해주세요!

 

 

 

 

소프트웨어 코딩

오렌지보드에 업로드되는 소스 코드입니다. 

 

#include <LiquidCrystal_I2C.h>
#include <SimpleDHT.h>
#include "emotion.h"
#include <PMsensor.h>

#define sensitivity  0.1 //먼지 센서의 민감도 수치

const int sensorPin = A0;  // 미세먼지 센서 핀
const int sensorLED = 3;   //미세먼지 센서 LED
int pinDHT11 = 6;

PMsensor PM;
LiquidCrystal_I2C lcd(0x3F, 16, 2);

SimpleDHT11 dht11;

////////////////////////측정값에 따른 이모티콘, LED 세팅///////////////////////////
void setEmoticon(float data) {
  if (data > 100) {                                 //Worst. 80 < data, Red LED
    lcd.createChar(4, topAngry1);
    lcd.createChar(5, topAngry2);
    lcd.createChar(6, bottomAngry1);
    lcd.createChar(7, bottomAngry2);
    digitalWrite(9, HIGH);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
  }
  else if (data > 50) {                           //Normal. 30 < data < 80, Yellow LED
    lcd.createChar(4, topSoSo1);
    lcd.createChar(5, topSoSo2);
    lcd.createChar(6, bottomSoSo1);
    lcd.createChar(7, bottomSoSo2);
    digitalWrite(9, HIGH);
    digitalWrite(10, HIGH);
    digitalWrite(11, LOW);
  }
  else {                                                     //Good. data < 30, Green LED
    lcd.createChar(4, topSmile1);
    lcd.createChar(5, topSmile2);
    lcd.createChar(6, bottomSmile1);
    lcd.createChar(7, bottomSmile2);
    digitalWrite(9, LOW);
    digitalWrite(10, HIGH);
    digitalWrite(11, LOW);
  }
}

void setup() {
  lcd.init();
  lcd.backlight();

  lcd.createChar((byte)0, temp);
  lcd.createChar(1, humi);
  lcd.createChar(2, dust);
  lcd.createChar(3, C);

  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);

  Serial.begin(9600);

  /////(infrared LED pin, sensor pin)  /////
  PM.init(sensorLED, sensorPin);
}

void loop() {
  byte temp = 0;
  byte humi = 0;

  dht11.read(pinDHT11, &temp, &humi, NULL);

  float data = 0;
  int err = PMsensorErrSuccess;
  if ((err = PM.read(&data, true, sensitivity)) != PMsensorErrSuccess) {
    Serial.print("data Error = ");
    Serial.println(err);
    delay(1500);
    return;
  }

  Serial.println(data);
  delay(1500);
  setEmoticon(data);
  //----------------------------------------------------LCD 출력----------------------------------------------------//
  lcd.setCursor(0, 0);
  lcd.write(2);
  lcd.print(" ");
  lcd.print(data);

  if (data > 100) {
    lcd.print("ug");
  }
  else if (data > 10) {
    lcd.print(" ug");
  }
  else {
    lcd.print(" ug  ");
  }
  


  lcd.setCursor(0, 1);
  lcd.write((byte)0);
  lcd.print(" ");
  lcd.print((int)temp);
  lcd.write(3);

  lcd.print(" ");
  lcd.write(1);
  lcd.print(" ");
  lcd.print((int)humi);
  lcd.print("%");

  lcd.setCursor(13, 0);
  lcd.write(4);
  lcd.write(5);

  lcd.setCursor(13, 1);
  lcd.write(6);
  lcd.write(7);
}

 

 

 

* 어떻게 업로드를 시켜할지 잘 모르시겠다구요? 

아직 아두이노 IDE와 업로드 방법에 대해 모르시는 분들은 아래 링크에 '아두이노 소개' 부분을 읽고 따라해보세요!

 

아두이노 기초 알아보기

 

 

 

 

 

 

미세먼지측정기 제작하기

하드웨어(HW)와 소프트웨어(SW)가 완성되었으니 이제 외관을 제작할 차례입니다. 

미세먼지측정기의 외관 제작에 대해 알아볼까요?

 

※ 조립 가이드에서 사용되는 볼트와 너트의 명칭입니다. 사진을 통해 모양을 잘 숙지해주세요.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

완성 사진

미세먼지측정기의 완성 모습입니다. 

어느곳에나 잘 어울리는 감성 뿜뿜!! 미세먼지측정기!! :)

 

 

 

 

 

 

작동 영상

미세먼지 측정기의 작동 영상입니다. 

먼지의 양에 따라 미세먼지의 농도가 다르게 측정되는 것을 확인할 수 있습니다. 

 

이외에도 Co2 센서, 가스 센서 등 다양한 센서들을 확장 연결한다면, 다양한 환경 데이터를 한 번에 측정해 볼 수 있겠죠?

 

 

#생생병맛리뷰 #평화로운코코아팹

 

 

 

 

 

 

지원(Support)

Q1. LCD가 잘 나오지 않습니다. 무슨 문제일까요? 

A1. LCD에는 I2C 주소가 존재합니다. 0x27 또는 0x3F로 주소를 바꿔서 테스트를 해보시고, LCD 뒷면에 가변 저항을 통해 선명도를 조절해보세요.

 

 

Q2. 인터넷에서 검색되는 초미세먼지의 농도와 미세먼지측정기 기트에서 측정되는 농도가 달라요. 

A2. 인터넷에서 검색되는 미세먼지는 기상청 또는 환경부에서 측정된 시간별 평균 수치입니다. 기상청에서 사용되는 미세 먼지 측정 장비는 고가의 장비입니다. 미세먼지측정기에 사용되는 미세먼지센서는 DIY용 센서로서 전문 장비와 단순 데이터를 비교하는 것은 무리가 있으며, 주변 환경에 따라 미세먼지농도의 변화량을 확인하기에 적절한 성능을 가지고 있습니다. 

 

 

 

Klant

코코아팹, kocoafab, 오렌지보드, orangeboard, 미세먼지측정기, PM, dust, DIY, Maker
profile

서담덕 2018-05-31 17:24:12

저 미세먼지 측정기 키트 구매한 중학생인데요, 근데 회로기판 다 맞는데 컴파일에러가 자꾸나는데 왜 이런건가요?
C:\Users\lenovo\AppData\Local\Temp\arduino_modified_sketch_262960\sketch_may31c.ino:1:31: fatal error: LiquidCrystal_I2C.h: No such file or directory

#include

^

compilation terminated.

exit status 1
보드 Arduino/Genuino Uno 컴파일 에러.

자꾸 이렇게 뜨네요..

profile

서담덕 2018-05-31 17:28:00

그리고 계속 LCD에 빨간색 불이 켜집니다.

profile

kocoafabeditor 2018-05-31 17:52:54

안녕하세요. 코코아팹입니다.

위에 발생한 에러는 LiquidCrystal_I2C 라이브러리가 설치되지 않아서 발생하는 에러입니다.

맨 위 메뉴바에 있는 [스케치 -> 라이브러리 포함하기 -> 라이브러리 관리] 로 들어가셔서 LiquidCrystal_I2C 로 검색하시면 결과가 쭉 나오는데요.

스크롤을 맨 밑으로 내린 후 밑에서 3번째 보시면 LiquidCrystal_I2C by Frank de Brabander 라고 있습니다.

이것을 선택 하신 후에 설치를 눌러주신 후 다시 업로드 해보시면 될 것 같습니다.

감사합니다.

profile

서담덕 2018-05-31 19:35:47

운영자님! 감사합니다. 그런데요,
말씀하신대로 라이브러리에 포함하였는데 계속 이렇게 뜨네요..ㅠㅠC:\Users\lenovo\AppData\Local\Temp\arduino_modified_sketch_748762\sketch_may31e.ino:1:31: fatal error: LiquidCrystal_I2C.h: No such file or directory

#include

^

compilation terminated.

exit status 1
보드 Arduino/Genuino Uno 컴파일 에러.

profile

서담덕 2018-05-31 19:57:54

소스코드


#include
#include
#include "emotion.h"
#include

#define sensitivity 0.1 //먼지 센서의 민감도 수치

const int sensorPin = A0; // 미세먼지 센서 핀
const int sensorLED = 3; //미세먼지 센서 LED
int pinDHT11 = 6;

PMsensor PM;
LiquidCrystal_I2C lcd(0x3F, 16, 2);

SimpleDHT11 dht11;

////////////////////////측정값에 따른 이모티콘, LED 세팅///////////////////////////
void setEmoticon(float data) {
if (data > 100) { //Worst. 80 < data, Red LED
lcd.createChar(4, topAngry1);
lcd.createChar(5, topAngry2);
lcd.createChar(6, bottomAngry1);
lcd.createChar(7, bottomAngry2);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
else if (data > 50) { //Normal. 30 < data < 80, Yellow LED
lcd.createChar(4, topSoSo1);
lcd.createChar(5, topSoSo2);
lcd.createChar(6, bottomSoSo1);
lcd.createChar(7, bottomSoSo2);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
}
else { //Good. data < 30, Green LED
lcd.createChar(4, topSmile1);
lcd.createChar(5, topSmile2);
lcd.createChar(6, bottomSmile1);
lcd.createChar(7, bottomSmile2);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
}
}

void setup() {
lcd.init();
lcd.backlight();

lcd.createChar((byte)0, temp);
lcd.createChar(1, humi);
lcd.createChar(2, dust);
lcd.createChar(3, C);

pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);

Serial.begin(9600);

/////(infrared LED pin, sensor pin) /////
PM.init(sensorLED, sensorPin);
}

void loop() {
byte temp = 0;
byte humi = 0;

dht11.read(pinDHT11, &temp, &humi, NULL);

float data = 0;
int err = PMsensorErrSuccess;
if ((err = PM.read(&data, true, sensitivity)) != PMsensorErrSuccess) {
Serial.print("data Error = ");
Serial.println(err);
delay(1500);
return;
}

Serial.println(data);
delay(1500);
setEmoticon(data);
//----------------------------------------------------LCD 출력----------------------------------------------------//
lcd.setCursor(0, 0);
lcd.write(2);
lcd.print(" ");
lcd.print(data);

if (data > 100) {
lcd.print("ug");
}
else if (data > 10) {
lcd.print(" ug");
}
else {
lcd.print(" ug ");
}



lcd.setCursor(0, 1);
lcd.write((byte)0);
lcd.print(" ");
lcd.print((int)temp);
lcd.write(3);

lcd.print(" ");
lcd.write(1);
lcd.print(" ");
lcd.print((int)humi);
lcd.print("%");

lcd.setCursor(13, 0);
lcd.write(4);
lcd.write(5);

lcd.setCursor(13, 1);
lcd.write(6);
lcd.write(7);
}

profile

서담덕 2018-05-31 20:10:31

보드 Arduino/Genuino Uno 컴파일 에러.
COM1 에 있는 보드를 사용할 수 없음


이라고 뜹니다.

profile

서담덕 2018-05-31 20:30:32

그래서 com10로 바꾸었는데도 보드에 문제가 있다고 하고 알 수없는 보드로 계속 뜨는데 어떻게 하나요?

profile

서담덕 2018-05-31 20:31:56

C:\Program Files\Arduino\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files\Arduino\hardware -tools C:\Program Files\Arduino\tools-builder -tools C:\Program Files\Arduino\hardware\tools\avr -built-in-libraries C:\Program Files\Arduino\libraries -libraries C:\Users\lenovo\U+ C11C U+ B2F4 U+ B355\Documents\Arduino\libraries -fqbn=arduino:avr:uno -ide-version=10805 -build-path C:\Users\lenovo\AppData\Local\Temp\arduino_build_93356 -warnings=all -build-cache C:\Users\lenovo\AppData\Local\Temp\arduino_cache_258772 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=C:\Program Files\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA.path=C:\Program Files\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Program Files\Arduino\hardware\tools\avr -verbose C:\Users\lenovo\U+ C11C U+ B2F4 U+ B355\Documents\Arduino\sketch_may31a\sketch_may31a.ino
C:\Program Files\Arduino\arduino-builder -compile -logger=machine -hardware C:\Program Files\Arduino\hardware -tools C:\Program Files\Arduino\tools-builder -tools C:\Program Files\Arduino\hardware\tools\avr -built-in-libraries C:\Program Files\Arduino\libraries -libraries C:\Users\lenovo\U+ C11C U+ B2F4 U+ B355\Documents\Arduino\libraries -fqbn=arduino:avr:uno -ide-version=10805 -build-path C:\Users\lenovo\AppData\Local\Temp\arduino_build_93356 -warnings=all -build-cache C:\Users\lenovo\AppData\Local\Temp\arduino_cache_258772 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=C:\Program Files\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA.path=C:\Program Files\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Program Files\Arduino\hardware\tools\avr -verbose C:\Users\lenovo\U+ C11C U+ B2F4 U+ B355\Documents\Arduino\sketch_may31a\sketch_may31a.ino
Using board 'uno' from platform in folder: C:\Program Files\Arduino\hardware\arduino\avr
Using core 'arduino' from platform in folder: C:\Program Files\Arduino\hardware\arduino\avr
Detecting libraries used...
"C:\Program Files\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10805 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files\Arduino\hardware\arduino\avr\variants\standard" "C:\Users\lenovo\AppData\Local\Temp\arduino_build_93356\sketch\sketch_may31a.ino.cpp" -o "nul"
"C:\Program Files\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10805 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files\Arduino\hardware\arduino\avr\variants\standard" "-IC:\Users\lenovo\U+ C11C U+ B2F4 U+ B355\Documents\Arduino\libraries\LiquidCrystal_I2C" "C:\Users\lenovo\AppData\Local\Temp\arduino_build_93356\sketch\sketch_may31a.ino.cpp" -o "nul"
"C:\Program Files\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10805 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files\Arduino\hardware\arduino\avr\variants\standard" "-IC:\Users\lenovo\U+ C11C U+ B2F4 U+ B355\Documents\Arduino\libraries\LiquidCrystal_I2C" "C:\Users\lenovo\AppData\Local\Temp\arduino_build_93356\sketch\sketch_may31a.ino.cpp" -o "C:\Users\lenovo\AppData\Local\Temp\arduino_build_93356\preproc\ctags_target_for_gcc_minus_e.cpp"
C:\Users\lenovo\U+ C11C U+ B2F4 U+ B355\Documents\Arduino\sketch_may31a\sketch_may31a.ino:1:31: fatal error: LiquidCrystal_I2C.h: No such file or directory

#include

^

compilation terminated.

라이브러리 LiquidCrystal_I2C를 버전 1.1.2 폴더: C:\Users\lenovo\U+ C11C U+ B2F4 U+ B355\Documents\Arduino\libraries\LiquidCrystal_I2C 에서 사용
exit status 1
보드 Arduino/Genuino Uno 컴파일 에러.

profile

kocoafabeditor 2018-06-01 17:38:30

라이브러리가 설치되지 않은 에러 같습니다.

profile

아두노 2018-06-02 08:35:58

혹시 급하게 상자만 따로 안파시나요??

profile

김재명 2018-06-11 20:45:35

더디어 미세먼지측정기 완성 ㅎ ㅎ ㅎ

profile

노규민 2018-06-13 12:09:29

lcd에 글씨 출력이 안되고 불만들어오면 연결이 잘못된건가요?