오늘의 출전 선수들이다.
왼쪽부터 피에조 부저, OLED,RGB LED 이다.
하지만 RGB 연결이 귀찮아서 빼고, DHT11 온습도 센서로 교체했다.
실 생활에서 온습도가 좀 더 유용하게 쓰일거 같다.
회로도
[소스코드]
굉장히 여러 곳에서 짜집기 했다.
// Value range
// 정상적인 값 1 미만, 0.4 ~ 0.8 수준
// 감지 범위 1단계: 1.0 ~ 1.5
// 감지 범위 2단계: 1.6 ~ 2.0
// 감지 범위 3단계: 2.1 이상
#include "DHT.h"
unsigned long startMillis; //some global variables available anywhere in the program
unsigned long currentMillis;
const unsigned long period = 1000; //the value is a number of milliseconds
int counts1min; // 평균을 내기 위한 카운트
float sum1min; // 값을 합산 후 카운트로 나누기
int buzzer = 3 ;// PWM 3,5,6,9,11 중 3번 핀 사용
boolean buzzerflag = false;
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// ############# OLED
// 예제 ssd1306 128x32_I2C 참조
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#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 != 32)
//#error("Height incorrect, please fix Adafruit_SSD1306.h!");
// #endif
void setup() {
dht.begin();
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(1000);
display.clearDisplay();
startMillis = millis(); //initial start time
counts1min = sum1min = 0;
pinMode (buzzer, OUTPUT);
}
void loop() {
float vol;
unsigned char i, j ;// define variables
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature) ) {
Serial.println("Failed to read from DHT sensor!");
return;
}
currentMillis = millis();// 현재 시간을 ms 단위로
int sensorValue = analogRead(A0); // 데이터 읽기
counts1min++;
vol=(float)sensorValue/1024*5.0; // 100분율로 변환해서 출력
sum1min = sum1min + vol;
if (buzzerflag) {
for (i = 0; i <80; i++) // Wen a frequency sound
{
digitalWrite (buzzer, HIGH) ;// send voice
delay (1) ;// Delay 1ms
digitalWrite (buzzer, LOW) ;// do not send voice
delay (1) ;// delay ms
}
for (i = 0; i <100; i++) // Wen Qie out another frequency sound
{
digitalWrite (buzzer, HIGH) ;// send voice
delay (2) ;// delay 2ms
digitalWrite (buzzer, LOW) ;// do not send voice
delay (2) ;// delay 2ms
}
}
if(currentMillis-startMillis>=period) // 시간 체크
{
buzzerflag = false;
sum1min = sum1min/counts1min; // 평균내기, 소숫점 1자리까지 표현
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("Gas: ");
display.print(sum1min,1); display.println("%");
display.print((int)temperature); display.print("C, ");
display.print((int)humidity); display.println("%");
display.display();
Serial.println(sum1min,1); // 평균내기, 소숫점 1자리까지 표현
if (sum1min > 2) {
buzzerflag = true;
}
// 온도와 습도값을 시리얼 모니터에 출력해 줍니다.
Serial.print((int)temperature); Serial.print(" *C, ");
Serial.print((int)humidity); Serial.println(" %");
startMillis = currentMillis;
counts1min = sum1min = 0;
}
}
부저 알람 delay이 대한 처리가 전혀되어 있지 않다.
Gas 감지 감도에 대한 시험 데이터가 부족하다.
외부 전원을 이용해서 여러 센서들에 전원을 공급해 주는게 좋은데.... 일단 NANO에서 다 뽑아 쓰고 있다.
납뗌 구찮다.
[동영상]
온도를 올리기 위에 DHT11 센서 근처에서 라이터를 키는 행동은 무모했다. ^^
일단 대총 케이스에 밀어 넣고 캠핑 다녀온 후에 보완하도록 하자.
'DIY - 2018 > 가스경보기' 카테고리의 다른 글
동계 캠핑 (0) | 2018.12.31 |
---|---|
가스 경보기 (0) | 2018.12.26 |