본문 바로가기

Programming/아두이노

아두이노 온도 습도 미세먼지 측정 oled 표시

아두이노 온도/습도/먼지 농도를 측정하여 OLED표시

하드웨어

  • 온습도 센서: DHT-22
  • 온도 측정범위 : -40 ~ 80도
  • 온도 오차: 0.5도
  • 습도 측정범위: 0 - 100%
  • 습도 오차: 2%
  • 측정 간격: 2초
  • 추가: 10 k옴 저항
  • 라이브러리: https://github.com/adafruit/DHT-sensor-library
  • 참조
    • http://deneb21.tistory.com/324
  • 먼지 센서: 샤프 GP2Y1010AU
  • 작동 전압: 5 - 7V
  • 작동 전류: max 20mA (avg 11mA)
  • 측정 범위: 0 ~ 0.5 mg/m3
    • Output Voltage vs. Dust Density
  • 감도: 0.5V (100ug/m3)
  • 검출 PM 2.5 미만의 초미세먼지
  • 데이터 시트: https://www.sparkfun.com/datasheets/Sensors/gp2y1010au_e.pdf
  • 참조
    • https://www.pinterest.co.kr/pin/348888302372284420/visual-search/?x=23&y=23&w=530&h=501
    • https://m.blog.naver.com/twophase/221139319142
    • http://blog.naver.com/roboholic84/220000104376
    • http://blog.naver.com/PostView.nhn?blogId=dokkosam&logNo=221038484240&redirect=Dlog&widgetTypeCall=true
  • OLED - Adafruit SSD1306 호환
  • 참조: http://www.lalasola.com/79
  • 해상도: 128 x 64, 0.96 인치
  • SPI통신
  • 동작전압 3 ~ 5V — 실제 VCC핀연결은 없어도 동작
  • 라이브러리
  • 추가 부품
    • 150 옴 저항
    • 220 ug 커패시티
  • 참조
    • http://bbangpan.tistory.com/51
    • http://deneb21.tistory.com/328
  • 메인 보드: 아두이노 우노

DHT-22 핀배열

먼지 센서 핀배열

먼지센서 배선

전체 배선도

  • 온습도 센서의 전원은 3V에 연결
  • 먼지센서는 5V 전원에 연결
  • 좌측 하단부의 OLED는 전원연결 안함

와이어링

스케치 코드

  • 측정된 값들은 매1초 마다 디스플레이 표시
  • 먼지 농도는 이동평균값으로 표시
  • 참조:
    • https://www.dfrobot.com/wiki/index.php/Sharp_GP2Y1010AU
    • https://m.blog.naver.com/twophase/221139319142
    • http://blog.daum.net/ejleep1/384
    • https://blog.naver.com/roboholic84/220000104376
// temp & humidity
#include <DHT.h>
#define DHTPIN 2        // SDA 핀의 설정
#define DHTTYPE DHT22   // DHT22 (AM2302) 센서종류 설정
DHT dht(DHTPIN, DHTTYPE); //핀과 타입을 설정

// optical dust sendor - GP2Y1010AU0F
int measurePin = 0; //Connect dust sensor to Arduino A0 pin
int ledPower = 4;   //Connect 3 led driver pins of dust sensor to Arduino D4

int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;

float voMeasured = 0;
float calcVoltage = 0;
float avgVoltage = 0.8;
float dustDensity = 0;

unsigned long monitorInterval = 20; // ms
unsigned long prevMonitorTime;


// OLED
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// If using software SPI (the default case):
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2

#define LOGO16_GLCD_HEIGHT 16 
#define LOGO16_GLCD_WIDTH  16 

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

unsigned long prevDisplayTime;
unsigned long displayInterval = 1000; 

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  dht.begin(); // temp & humidity start
  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC);
  display.display();
  delay(2000);

  // dust sendor
  pinMode(ledPower,OUTPUT);
  prevMonitorTime = millis();

  // Clear the buffer.
  display.clearDisplay();
  display.setTextSize(2);//글자 사이즈 설정
  display.setTextColor(WHITE);//글자 색상 설정
  display.setCursor(0,0);//글자가 표시될 위치 설정
  display.println("Hello Woody");//출력할 문자 설정
  display.display();//화면에 출력
  delay(2000);
  display.clearDisplay();
  display.display();//화면에 출력

}

void loop() {

  // 센서의 온도와 습도를 읽어온다.
  float h = dht.readHumidity();     // 습도 읽기
  float t = dht.readTemperature();  // 온도 읽기

  if (isnan(t) || isnan(h)) {
    //값 읽기 실패시 시리얼 모니터 출력
    Serial.println("Failed to read from DHT");
  } 
  else {
    //온도, 습도 표시 시리얼 모니터 출력
//    Serial.print("Humidity: "); 
//    Serial.print(h);
//    Serial.print(" %\t");
//    Serial.print("Temperature: "); 
//    Serial.print(t);
//    Serial.println("C");
  }

  // dust sensor
  if(millis() - prevMonitorTime > monitorInterval){
    prevMonitorTime = millis();

    digitalWrite(ledPower,LOW); // power on the LED
    delayMicroseconds(samplingTime); //280

    voMeasured = analogRead(measurePin); // read the dust value

    delayMicroseconds(deltaTime); // 40
    digitalWrite(ledPower,HIGH);  // turn the LED off
    delayMicroseconds(sleepTime); // 9680

    // 0 - 5V mapped to 0 - 1023 integer values
    // recover voltage
    calcVoltage = voMeasured * (5.0 / 1024.0);

    // linear eqaution taken from http://www.howmuchsnow.com/arduino/airquality/
    // Chris Nafis (c) 2012

    // weighted moving averageweighted moving average
    // moving avg = avg * weight + prev moving avg (1 - weight)
    avgVoltage = calcVoltage * 0.005 + avgVoltage * 0.995; //

    dustDensity = 0.17 * avgVoltage - 0.1;

//    Serial.print("calcVoltage: ");
//    Serial.print(calcVoltage, 4);
//    Serial.print(", avgVoltage: ");
//    Serial.print(avgVoltage, 4);
//    Serial.print(", dustDensity: ");
//    Serial.println(dustDensity, 4); // unit: mg/m3

  }

  if(millis() - prevDisplayTime > displayInterval){
    // show temperature, humidity and dust density
    prevDisplayTime = millis();
    // OLED display
    display.clearDisplay();
    display.setCursor(0,0);
    display.print("H: "); 
    display.println(h);
    display.print("T: "); 
    display.println(t);
    display.print("D: "); 
    display.println(dustDensity,4);  
    display.display();
  }

}

설치 모습

운용