아두이노 온도/습도/먼지 농도를 측정하여 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
- 감도: 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핀연결은 없어도 동작
- 라이브러리
- 추가 부품
- 참조
- 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();
}
}
설치 모습