본문 바로가기
아두이노/담배 냄새 배출기

#3 제작 - 조립

by songbum 2024. 8. 17.

실사용을 위해 조립을 마친 제품의 모습니다.  아두이노 뿐만 아니라 환기팬도 5V 휴대폰 충전기를 사용하고 있다.  일단 사용해보고, 만약 배기량이 부족하다 싶으면 그 때가서 220V 를 사용하는 일반 환풍기로 교체할 생각이다.  환기팬 작동은 릴레이를 사용하고 있기 때문에 교체하는데 별 문제는 없을 거라 생각된다.

 

아두이노 기판과 릴레이 등을 보호하기 위한 케이스는 지난 번 제품에서 사용하고 남은 다이소제 수납박스를 사용했다.

 

 

위와 같이 제품 조립을 완료하고 프로그램도 몇 가지 수정을 했다.

 

  • 리모컨으로 on/off 가 가능하며, 리모컨에 의한 on/off 가 공기질센서에 의한 on/off 보다 우선순위가 높다.
  • 리모컨의 OK 버튼을 누르면 환기팬이 작동하고, 이 상태에서 다시 OK 버튼을 누르면 멈춘다.
  • 공기질센서에 의해 on 된 것을 멈추고자 OK 버튼을 누르면 일단 off 되지만 곧바로 공기질센서에 의해 다시 on 되는 문제가 있다.  이런 경우에는 숫자 1, 2, 3 중 하나를 누르면 각각 60초, 120초, 180초 동안 off 상태가 유지된다.
  • 리모컨의 OK 버튼으로 on 시킨 경우, 최대 1시간만 작동하고 off 된다.

아래와 같이 코딩하여 아두이노 IDE 를 통해 업로드했다.  

#include <IRremote.hpp>

int sensor1Pin = 2;
int sensor2Pin = 3;
int buzzerPin = 4;
int valvePin = 5;
int RECV_PIN = 6;
IRrecv irrecv(RECV_PIN);

int is_by_remote;
int is_fan;

void setup() {
  pinMode(sensor1Pin, INPUT_PULLUP);
  pinMode(sensor2Pin, INPUT_PULLUP);
  pinMode(buzzerPin, OUTPUT);
  digitalWrite(valvePin, HIGH);
  pinMode(valvePin, OUTPUT);
  IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK);

  Serial.begin(9600);
  while(!Serial && millis()<5000) {
  }

  is_by_remote = 0;
  is_fan = 0;
}

void loop() {
  // 리모컨 사용중이면 우선 처리
  if (IrReceiver.decode()) {
    Serial.print("Pushed remote controller key : ");
    Serial.println(IrReceiver.decodedIRData.decodedRawData);
    if (IrReceiver.decodedIRData.decodedRawData != 0) {
      int long_stop = 0;
      // "ok" 버튼
      if (IrReceiver.decodedIRData.decodedRawData == 3810328320) {
        if (is_fan == 0) {
          Serial.println("START by remote");
          is_fan = 1;
          is_by_remote = 3600 * 2;  // 수동으로 on 해도 1시간 후에는 종료
          digitalWrite(valvePin, LOW);
          digitalWrite(buzzerPin, HIGH);
          delay(300);
          digitalWrite(buzzerPin, LOW);
        }
        else {
          Serial.println("STOP by remote");
          is_fan = 0;
          is_by_remote = 0;
          digitalWrite(valvePin, HIGH);
          digitalWrite(buzzerPin, HIGH);
          delay(300);
          digitalWrite(buzzerPin, LOW);
        }
      }
      // press "1" button
      else if (IrReceiver.decodedIRData.decodedRawData == 3125149440) {
        if (is_fan == 1) {
          is_by_remote = 60 * 2;
          long_stop = 1;
        }
      }
      // press "2" button
      else if (IrReceiver.decodedIRData.decodedRawData == 3108437760) {
        if (is_fan == 1) {
          is_by_remote = 120 * 2;
          long_stop = 1;
        }
      }
      // press "3" button
      else if (IrReceiver.decodedIRData.decodedRawData == 3091726080) {
        if (is_fan == 1) {
          is_by_remote = 180 * 2;
          long_stop = 1;
        }
      }
      if (long_stop == 1) {
        Serial.print("STOP by remote for ");
        Serial.print(is_by_remote / 2);
        Serial.println(" seconds");
        is_fan = 0;
        digitalWrite(valvePin, HIGH);
        digitalWrite(buzzerPin, HIGH);
        delay(600);
        digitalWrite(buzzerPin, LOW);
      }
    }
    IrReceiver.resume(); // Enable receiving of the next value
  }
  // 리모컨 사용 안 하는 중
  else {
    // 리모컨에 의해 환기팬이 수동 작동중일 경우에는 공기질센서 체크 안 함
    if (is_by_remote > 0) {
      if (is_by_remote >= 1) {
        is_by_remote = is_by_remote - 1;
      }
      delay(500);
    }
    else {
      // "1" 핀과 "2" 핀 모두 선택 됨
      if ( (digitalRead(sensor1Pin) == LOW) && (digitalRead(sensor2Pin) == LOW) ) {
        Serial.print("1 : clean : ");    
        Serial.println(is_fan);
        if (is_fan == 1) {
          is_fan = 0;
          digitalWrite(valvePin, HIGH);
        }
        delay(500);
      }
      // "1" 핀은 선택 안 되고, "2" 핀만 선택 됨
      else if ( (digitalRead(sensor1Pin) == HIGH) && (digitalRead(sensor2Pin) == LOW) ) {
        Serial.print("2 : slight : ");
        Serial.println(is_fan);
        if (is_fan == 1) {
          is_fan = 0;
          digitalWrite(valvePin, HIGH);
        }
        delay(500);
      }
      // "1" 핀만 선택 되고, "2" 핀은 선택 안 됨
      else if ( (digitalRead(sensor1Pin) == LOW) && (digitalRead(sensor2Pin) == HIGH) ) {
        Serial.print("3 : middle : ");
        Serial.println(is_fan);
        if (is_fan == 0) {
          is_fan = 1;
          digitalWrite(valvePin, LOW);
        }
        digitalWrite(buzzerPin, HIGH);
        delay(100);
        digitalWrite(buzzerPin, LOW);
        delay(400);
      }
      // "1" 핀과 "2" 핀 모두 선택 안 됨
      else if ( (digitalRead(sensor1Pin) == HIGH) && (digitalRead(sensor2Pin) == HIGH) ) {
        Serial.print("4 : heavy : ");
        Serial.println(is_fan);
        if (is_fan == 0) {
          is_fan = 1;
          digitalWrite(valvePin, LOW);
        }  
        digitalWrite(buzzerPin, HIGH);
        delay(300);
        digitalWrite(buzzerPin, LOW);
        delay(200);
      }
    }
  }
}

 

 

 

 

'아두이노 > 담배 냄새 배출기' 카테고리의 다른 글

#2 제작  (0) 2024.08.08
#1 기획 및 검토 - ZP07-MP503 공기질 센서  (0) 2024.08.06