본문 바로가기

피지컬컴퓨팅/아두이노

미세먼지 측정하기-아두이노, 미세먼지센서, LCD, 온습도센서

반응형

아침에 일어나면 일기예보를 제일 먼저 보게 되는 요즘입니다. 아두이노와 센서를 이용해 미세먼지에 따른 공기의 질을 측정해보고 교실 창문을 여닫는 환기라도 잘 시켜보려는 의도에서 제작하게 되었습니다.

 

준비물

- 아두이노 우노

- 미세먼지 측정센서(GP21Y1010AU0F) : 시중에 팔고 있는 미세먼지 센서는 브레드보드에 연결하기 조금 불편하기 때문에 쉽게 연결할 수 있도록 GP2용 어댑터를 사용하였다.

GP2용 어댑터(참고 : https://www.devicemart.co.kr/goods/view?no=12498154)

 

- 3색 RGB LED : 미세먼지의 농도에 따른 공기질의 상태를 색깔로 표현하기 위해 필요하다.

- 온습도센서 :  DHT11  또는 DHT22 ( 센서에 따라 아두이노 코딩이 조금 달라지지만 많이 바뀌진 않음)

DHT22(참고 : https://www.devicemart.co.kr/goods/view?no=12498154)

 

- 종이박스 : 교실 앞에 두고 반친구들이 모두 볼 수 있도록 외관에 조금 신경씀

 

회로도

미세먼지센서-온습도센서-LCD I2C 연결

소스코드

#include "DHT.h" //DHT 라이브러리 호출
DHT dht(10, DHT22); //DHT 설정(10,DHT22)

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

#define no_dust 0.60 //최초 전원 인가 후 깨끗한 환경에서의 지속적으로 측정되는 전압값 넣어주세요 

int dustout=A0; // 센서의 5번핀 먼지를 측정 아두이노 A0번에 연결
int v_led=A1; // 센서의 3번핀을 아두이노 A1번에 연결  센서 내부 적외선 led를 on/off 제어

int s_ledr=13; // 공기 상태에 나쁨 RED
int s_ledg=12; // 공기 상태에 보통 Green
int s_ledb=11; // 공기 상태에 좋음 Blue
float vo_value=0; // 센서로 읽은 값 변수 선언
float sensor_voltage=0; // 센서로 읽은 값을 전압으로 측정한 값
float dust_density=0; // 실제 미세먼지 밀도

 void setup()
{
 Serial.begin(9600); // 통신속도 9600bps로 시리얼 통신 시작
 dht.begin();
 pinMode(v_led,OUTPUT); // 적외선 led 출력으로 설정
 pinMode(s_ledr,OUTPUT); // LED Red 출력 설정
 pinMode(s_ledg,OUTPUT); // LED green 출력 설정
 pinMode(s_ledb,OUTPUT); // LED blue 출력 설정
// lcd.begin(16, 2);   
 lcd.init();
 lcd.backlight(); // LCD초기 설정 
 lcd.setCursor(0,0);
 lcd.clear();
 digitalWrite(v_led,LOW); // 적외선 LED ON
 digitalWrite(s_ledr,LOW);
 digitalWrite(s_ledb,LOW);
 digitalWrite(s_ledg,LOW);
}
void loop()
{
 /*
    데이터 시트에 나와있듯이 샘플링을 위해서 적외선 LED는 0.32ms 동안 펄스를 유지해야하며,
    0.28ms이후에 데이터를 읽을 수 있습니다.
 */
 digitalWrite(v_led,LOW); 
 delayMicroseconds(280); // 280us동안 딜레이
 vo_value=analogRead(dustout); // 데이터를 읽음
 delayMicroseconds(40); // 320us - 280us
 digitalWrite(v_led,HIGH); // 적외선 LED OFF
 delayMicroseconds(9680); // 10us(주기) -320us(펄스폭) 한 값
 lcd.clear();
 sensor_voltage=get_voltage(vo_value); // get_voltage 함수 실행
 dust_density=get_dust_density(sensor_voltage); // get_dust_density 함수 실행
   int dust_density1 = dust_density;
   
   Serial.print(dust_density1);
   Serial.println(" [ug/m^3]");
   lcd.setCursor(0, 1);
   lcd.print("Dust:"); 
   lcd.setCursor(5, 1);
   lcd.print(dust_density1);
   lcd.setCursor(8, 1);
   lcd.print("[ug/m^3]");
   Serial.print("value = ");
   Serial.println(vo_value);
   Serial.print("Voltage = ");
   Serial.print(sensor_voltage);
   Serial.println(" [V]");
   Serial.print("Dust Density = ");
   Serial.print(dust_density);
   Serial.println(" [ug/m^3]");
   float h = dht.readHumidity(); //습도값을 h에 저장
   float t = dht.readTemperature(); //온도값을 t에 저장
   float f = dht.readTemperature(true);// 화씨 온도를 측정합니다.
   float hif = dht.computeHeatIndex(f, h);
   float hic = dht.computeHeatIndex(t, h, false);
   int hic1=hic;
   int h1=h;
   
   Serial.print("Temperature: ");
   Serial.print(hic); //온도값 출력
   Serial.println("C");
   lcd.setCursor(0, 0);
   lcd.print("temp:");
   lcd.setCursor(5, 0);
   lcd.print(hic1);
   lcd.setCursor(7, 0);
   lcd.print("C ");
   
   Serial.print("Humidity: "); //문자열 출력
   Serial.print(h); //습도값 출력
   Serial.println("%");
   lcd.setCursor(9, 0);
   lcd.print("Hum:");
   lcd.setCursor(13, 0);
   lcd.print(h1);
   lcd.setCursor(15, 0);
   lcd.print("%");
   
   if(dust_density <= 50){
    digitalWrite(s_ledr,LOW);
    digitalWrite(s_ledb,HIGH);
    digitalWrite(s_ledg,LOW);
    Serial.println("LED B");
   }
   else if(dust_density <= 100){
    digitalWrite(s_ledr,LOW);
    digitalWrite(s_ledb,LOW);
    digitalWrite(s_ledg,HIGH) ;
    Serial.println("LED G");
   }
   else {
    digitalWrite(s_ledr,HIGH);
    digitalWrite(s_ledb,LOW);
    digitalWrite(s_ledg,LOW);
    Serial.println("LED R");
   }
   delay(2000);
}


float get_voltage(float value)
{
 float V= value * 5.0 / 1024; // 아날로그값을 전압값으로 바꿈
 return V;
}

float get_dust_density(float voltage)
{
 float dust=(voltage-no_dust) / 0.005; // 데이터 시트에 있는 미세먼지 농도(ug) 공식 기준
 return dust;
}

조립 및 동작

 

 

 

반응형