코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2017-07-11 10:02:30
안녕하십니까? Klant입니다.
요즘은 하늘에 구멍이 뚫린 듯 비가 많이 옵니다.
이 비가 지나면 폭염이 찾아오겠죠?
봄부터 시작되어 수그러들지 않는 이슈가 바로 '미세먼지'입니다.
예전에야 황사 철에만 조심하면 된다고 했지만 요새 우리는 늘 미세먼지에 노출되어 있는 것 같습니다.
이런 상황에서 가정집에서는 환기시키기도 굉장히 신경쓰이고 걱정되는 요즘입니다.
미세먼지를 확인하지 않고 환기를 한다는 것은 작정하고 미세먼지를 마시는 일이 되버리고 말테니까요.
그래서 집안의 미세먼지의 농도와 온도, 습도 같은 간단한 환경정도를 한 눈에 확인해볼 수 있는 프로젝트를 만들어
보았습니다!
미세먼지측정기를 제작하기 위해 필요한 부품은 아래와 같습니다.
거의 대부분의 부품이 아두이노 기초에서 다루는 부품들입니다.
NO | 부품명 | 수량 | 상세설명 |
1 | 오렌지보드 | 1 | |
2 | 브레드보드 | 1 | mini size |
3 | 미세먼지센서 | 1 | GP2Y1010AU0F |
4 | 캐패시터 | 1 | 20uF |
5 | 저항 | 1 | 160옴 |
6 | 온습도 센서 | 1 | DHT11 |
7 | LCD | 1 | 16x2 character LCD |
8 | 도트매트릭스 | 1 | 8 x 8 |
부품명 | 오렌지보드 | 미세먼지센서 | 온습도 센서 | LCD | 도트매트릭스 |
부품 사진 |
미세먼지센서의 경우 sharp에서 제조된 센서로서 7000원에서 10000원 사이의 가격에 구해보실 수 있습니다.
프로젝트에 사용되는 부품 개별의 사용법입니다.
프로젝트를 만들기 위해서는 각 부품의 사용법을 먼저 인지하는 것이 좋겠죠?
- LCD 사용하기
3D 프린터를 활용해 출력한 구조물과 단자대, 볼트를 이용해 미세먼지 측정기의 내부 구조를 조립하였습니다.
위 사진의 녀석이 바로 미세 먼지 센서입니다.
저렴한 가격임에도 불구하고 나름 괜찮은 성능을 발휘하는 녀석입니다.
토트매트릭스와 LCD 그리고 온습도 센서까지 오렌지보드에 연결해줍니다.
선이 너무 많은 것 아니냐구요?
저 선들 중 반 이상은 LCD에 사용되는 선이라는 것은 함정 :)
그 외 부품들은 복잡하게 연결될 것이 많이 없습니다.
소스 코드까지 업로드해 마지막으로 동작에 이상이 없는지 확인해봅니다!
단 번에 성공!! 어라 왜 한 번에 되지?
But.... 오렌지보드의 USB 케이블이 걸려버렸다....
다시 출력하기는 시간과 재료가 너무 아깝습니다.
그래서 생각해낸 방법은
.
.
.
.
.
.
.
.
.
.
빼 to the 빠 질!!
열심히 갈고 또 간 끝에 마침내 미세 먼지 측정기를 완성하였습니다.
집안의 대기 온도와 습도 그리고 오염도까지 참 똑똑한 친구가 완성되었죠?
게다가 표정으로 알려주기까지 하니 지나가다가 이 녀석이 표정이 이상하다 싶으면
집안의 공기가 안좋다라는 이야기입니다.
아두이노 소스 코드는 아래 링크를 통해 다운로드 받으실 수 있습니다.
* 소스 코드 사용 시 폴더에 있는 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(3, 4, 10, 11, 12, 13);
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(0, 0, veryBad_bmp, 8, 8, LED_RED);
matrix.writeDisplay();
}
else if (data > 120) {
//나쁨
matrix.clear();
matrix.drawBitmap(0, 0, bad_bmp, 8, 8, LED_RED);
matrix.writeDisplay();
}
else if (data > 80) {
//약간 나쁨
matrix.clear();
matrix.drawBitmap(0, 0, normal_bmp, 8, 8, LED_YELLOW);
matrix.writeDisplay();
}
else if (data > 30) {
matrix.clear();
matrix.drawBitmap(0, 0, good_bmp, 8, 8, LED_GREEN);
matrix.writeDisplay();
}
else {
matrix.clear();
matrix.drawBitmap(0, 0, veryGood_bmp, 8, 8, LED_GREEN);
matrix.writeDisplay();
}
}
//----------------------------------------------------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
pinMode(ledPower, OUTPUT);
pre_dustDensity = get_dustDensity();
lcd.begin(16, 2);
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(0, 0);
lcd.print("Dust:");
lcd.print(abs_filtered_dustDensity);
lcd.print("mg");
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(temp);
lcd.print(" H:");
lcd.print(humi);
}
|
cs |
외관 3D 모델링 파일 다운로드 링크 :
https://drive.google.com/file/d/1Q0VSHUORelpGyGTVuKIUUdTtN1sQgCn7/view?usp=sharing
동작 영상을 마지막으로 이번 프로젝트의 포스팅을 마치겠습니다.
외부의 미세 먼지로 측정값이 변화하는 모습을 보여드리면 좋겠습니다.
제 맘대로 되는 것이 아니기 때문에 오염 물질을 만들어서 테스트해보았습니다.
그럼 다음에도 재미난 프로젝트로 찾아뵙겠습니다~ :)
Klant