실사용을 위해 조립을 마친 제품의 모습니다. 아두이노 뿐만 아니라 환기팬도 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 |