반응형
아침에 일어나면 일기예보를 제일 먼저 보게 되는 요즘입니다. 아두이노와 센서를 이용해 미세먼지에 따른 공기의 질을 측정해보고 교실 창문을 여닫는 환기라도 잘 시켜보려는 의도에서 제작하게 되었습니다.
준비물
- 아두이노 우노
- 미세먼지 측정센서(GP21Y1010AU0F) : 시중에 팔고 있는 미세먼지 센서는 브레드보드에 연결하기 조금 불편하기 때문에 쉽게 연결할 수 있도록 GP2용 어댑터를 사용하였다.
- 3색 RGB LED : 미세먼지의 농도에 따른 공기질의 상태를 색깔로 표현하기 위해 필요하다.
- 온습도센서 : DHT11 또는 DHT22 ( 센서에 따라 아두이노 코딩이 조금 달라지지만 많이 바뀌진 않음)
- 종이박스 : 교실 앞에 두고 반친구들이 모두 볼 수 있도록 외관에 조금 신경씀
회로도
소스코드
#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;
}
조립 및 동작
반응형
'피지컬컴퓨팅 > 아두이노' 카테고리의 다른 글
PIR 모션센서와 LED 활용하기 (0) | 2024.03.05 |
---|---|
LED 제어하기 (1) | 2024.03.05 |
아두이노를 활용한 인공지능 AI 의수만들기(노트북과 핸드이노 사용) (0) | 2023.04.25 |
아두이노 우노 + 2.4 TFT LCD 디스플레이 쉴드 터치 패널 ILI9341 (0) | 2023.04.17 |
아두이노 선풍기(L9110) 팬모터로 만들기(버튼, 초음파센서) (0) | 2023.04.07 |