DIY - 2018/가스경보기

프로토타입 완성

알렉스윤 2018. 12. 26. 12:47

오늘의 출전 선수들이다.

왼쪽부터 피에조 부저, 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