프로젝트

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

미세먼지 걱정 그만!! 우리 집 환경 정보를 한번에!! 홈 웨더 스테이션

2017-07-11 10:02:30

안녕하십니까? Klant입니다. 

요즘은 하늘에 구멍이 뚫린 듯 비가 많이 옵니다. 

이 비가 지나면 폭염이 찾아오겠죠? 

 

봄부터 시작되어 수그러들지 않는 이슈가 바로 '미세먼지'입니다. 

예전에야 황사 철에만 조심하면 된다고 했지만 요새 우리는 늘 미세먼지에 노출되어 있는 것 같습니다. 

 

이런 상황에서 가정집에서는 환기시키기도 굉장히 신경쓰이고 걱정되는 요즘입니다. 

미세먼지를 확인하지 않고 환기를 한다는 것은 작정하고 미세먼지를 마시는 일이 되버리고 말테니까요.

 

그래서 집안의 미세먼지의 농도와 온도, 습도 같은 간단한 환경정도를 한 눈에 확인해볼 수 있는 프로젝트를 만들어

보았습니다!

 

 

 

 

 

 

부품 목록

 

미세먼지측정기를 제작하기 위해 필요한 부품은 아래와 같습니다. 

거의 대부분의 부품이 아두이노 기초에서 다루는 부품들입니다. 

 

NO 부품명 수량 상세설명
1 오렌지보드 1  
2 브레드보드  1 mini size
3 미세먼지센서 1 GP2Y1010AU0F
4 캐패시터 1 20uF
5 저항 1 160옴
6 온습도 센서 DHT11
7 LCD 1 16x2 character LCD
8 도트매트릭스 1 8 x 8

 

부품명 오렌지보드 미세먼지센서 온습도 센서 LCD 도트매트릭스
부품 사진

 

미세먼지센서의 경우 sharp에서 제조된 센서로서 7000원에서 10000원 사이의 가격에 구해보실 수 있습니다. 

 

 

 

 

 

관련 튜토리얼

 

프로젝트에 사용되는 부품 개별의 사용법입니다. 

프로젝트를 만들기 위해서는 각 부품의 사용법을 먼저 인지하는 것이 좋겠죠? 

 

- 미세먼지센서 사용하기

- 온습도 센서 사용하기

- LCD 사용하기

- 도트 매트릭스 사용하기

 

 

 

 

 

제작 과정

 

 
 
 
 
 

 

3D 프린터를 활용해 출력한 구조물과 단자대, 볼트를 이용해 미세먼지 측정기의 내부 구조를 조립하였습니다.

 

 

 

 

 

위 사진의 녀석이 바로 미세 먼지 센서입니다. 

저렴한 가격임에도 불구하고 나름 괜찮은 성능을 발휘하는 녀석입니다. 

 

 

 

 

 

토트매트릭스와 LCD 그리고 온습도 센서까지 오렌지보드에 연결해줍니다.

선이 너무 많은 것 아니냐구요?

저 선들 중 반 이상은 LCD에 사용되는 선이라는 것은 함정 :)

그 외 부품들은 복잡하게 연결될 것이 많이 없습니다.

 

 

 

 

 
 

소스 코드까지 업로드해 마지막으로 동작에 이상이 없는지 확인해봅니다!

단 번에 성공!! 어라 왜 한 번에 되지?

 

 

 

 

 

 

 

But.... 오렌지보드의 USB 케이블이 걸려버렸다....

다시 출력하기는 시간과 재료가 너무 아깝습니다. 

그래서 생각해낸 방법은

.

.

.

.

.

.

.

.

.

.

 

 

빼 to the 빠 질!!

 

 

 

 





 

열심히 갈고 또 간 끝에 마침내 미세 먼지 측정기를 완성하였습니다. 

집안의 대기 온도와 습도 그리고 오염도까지 참 똑똑한 친구가 완성되었죠?

게다가 표정으로 알려주기까지 하니 지나가다가 이 녀석이 표정이 이상하다 싶으면

집안의 공기가 안좋다라는 이야기입니다.

 

 

 

 

 

 

소프트웨어 Coding

 

아두이노 소스 코드는 아래 링크를 통해 다운로드 받으실 수 있습니다. 

* 소스 코드 사용 시 폴더에 있는 GFX 라이브러리와 Backpack 라이브러리를 추가해주셔야 합니다.

 

 

 

#include <LiquidCrystal.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include "Adafruit_LEDBackpack.h"
#include <DHT11.h>
 
//----------------------------------------------------------------------------------------------------------------------
int measurePin = 0
int ledPower = 2;   
int pin = 6;
float sensitivity = 0.1;
float pre_dustDensity = 0;
 
//----------------------------------------------------------------------------------------------------------------------
Adafruit_BicolorMatrix matrix = Adafruit_BicolorMatrix();
LiquidCrystal lcd(3410111213);
DHT11 dht11(pin);
 
//----------------------------------------------------------------------------------------------------------------------
static const uint8_t PROGMEM
veryGood_bmp[] =
{ B00000000,
  B01000010,
  B10100101,
  B00000000,
  B00000000,
  B01111110,
  B00111100,
  B00000000
},
good_bmp[] =
{ B00000000,
  B00000000,
  B00100100,
  B00100100,
  B00000000,
  B01111110,
  B00111100,
  B00000000
},
normal_bmp[] =
{ B00000000,
  B00000000,
  B00100100,
  B00100100,
  B00000000,
  B01111110,
  B00000000,
  B00000000
},
bad_bmp[] =
{ B00000000,
  B00000000,
  B00000000,
  B01100110,
  B00000000,
  B00111100,
  B01000010,
  B00000000
},
veryBad_bmp[] =
{ B00000000,
  B00000000,
  B01000010,
  B00100100,
  B00000000,
  B00111100,
  B01000010,
  B00000000
};
 
//----------------------------------------------------------------------------------------------------------------------
float get_dustDensity() {
  int samplingTime = 280;
  int deltaTime = 40;
  int sleepTime = 9680;
  float voMeasured = 0;
  float calcVoltage = 0;
  float dustDensity = 0;
 
  digitalWrite(ledPower, LOW); 
  delayMicroseconds(samplingTime);
 
  voMeasured = analogRead(measurePin); 
 
  delayMicroseconds(deltaTime);
  digitalWrite(ledPower, HIGH); 
  delayMicroseconds(sleepTime);
  calcVoltage = voMeasured * (5.0 / 1024.0);
  dustDensity = (0.17 * calcVoltage - 0.1* 1000;
 
  return dustDensity;
}
 
void dustCheckLed(float data) {
  if (data > 201) {
    //매우 나쁨
    matrix.clear();
    matrix.drawBitmap(00, veryBad_bmp, 88, LED_RED);
    matrix.writeDisplay();
  }
  else if (data > 120) {
    //나쁨
    matrix.clear();
    matrix.drawBitmap(00, bad_bmp, 88, LED_RED);
    matrix.writeDisplay();
  }
  else if (data > 80) {
    //약간 나쁨
    matrix.clear();
    matrix.drawBitmap(00, normal_bmp, 88, LED_YELLOW);
    matrix.writeDisplay();
  }
  else if (data > 30) {
    matrix.clear();
    matrix.drawBitmap(00, good_bmp, 88, LED_GREEN);
    matrix.writeDisplay();
  }
  else {
    matrix.clear();
    matrix.drawBitmap(00, veryGood_bmp, 88, LED_GREEN);
    matrix.writeDisplay();
  }
}
//----------------------------------------------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  pinMode(ledPower, OUTPUT);
  pre_dustDensity = get_dustDensity();
  lcd.begin(162);
  matrix.begin(0x70);  // pass in the address
}
 
//----------------------------------------------------------------------------------------------------------------------
void loop() {
 
  float temp, humi;
  float now_dustDensity = get_dustDensity();
  float filtered_dustDensity = (now_dustDensity * sensitivity) + (pre_dustDensity * (1 - sensitivity));
  float  abs_filtered_dustDensity = abs(filtered_dustDensity);
 
  dht11.read(humi, temp);
  delay(DHT11_RETRY_DELAY);
  lcd.clear();
 
  dustCheckLed(abs_filtered_dustDensity);
 
  Serial.print(abs_filtered_dustDensity);
  Serial.println("mg");
  lcd.setCursor(00);
  lcd.print("Dust:");
  lcd.print(abs_filtered_dustDensity);
  lcd.print("mg");
 
  lcd.setCursor(01);
  lcd.print("T:");
  lcd.print(temp);
 
  lcd.print(" H:");
  lcd.print(humi);
}
cs

 

 

 

 

 

3D 모델링 파일

외관 3D 모델링 파일 다운로드 링크 : 

https://drive.google.com/file/d/1Q0VSHUORelpGyGTVuKIUUdTtN1sQgCn7/view?usp=sharing

 

 

동작 영상

동작 영상을 마지막으로 이번 프로젝트의 포스팅을 마치겠습니다. 

외부의 미세 먼지로 측정값이 변화하는 모습을 보여드리면 좋겠습니다. 

제 맘대로 되는 것이 아니기 때문에 오염 물질을 만들어서 테스트해보았습니다. 

 

그럼 다음에도 재미난 프로젝트로 찾아뵙겠습니다~ :)

 

Klant

코코아팹,kocoafab,오렌지보드,orange board,아두이노,arduino,미세먼지센서,미세먼지측정기