BASIC4MCU | 질문게시판 | 아두이노 코딩 관련 질문 드립니다.
페이지 정보
작성자 혼자 작성일2019-06-13 20:40 조회4,573회 댓글1건본문
안녕하세요.
제가 창문이 조건에 따라 자동으로 제어되는 프로젝트를 하고 있는데,
저번에 이미 창문이 열린 상태에서 또다시 열림 조건이 충족 된 경우 안 열리게 하는 방법을 여쭤봤었는데
if(!flag){ flag=1; fwd(); delay(1000); stop();}이런식으로 flag를 이용하는 방법을 가르쳐주셨습니다.
덕분에 그 부분은 잘 해결 되었습니다 감사합니다.
제가 추가 하고 싶은것은 자동 모드로 설정해뒀을 때 창문이 열릴 때 알림음이 나오고, 닫힐때 알림음이 나오는것인데
똑같이 이미 열린 상태에서 또 열림조건이 충족된 경우에는 알림음이 안나오게 하고싶어요.
flag를 활용하면 될것이라고 생각했는데 문제가 수동으로도 열고 닫기가 가능한 창문이라
초기값을 열림상태로 설정해 둔 경우 수동으로 창문을 닫아놓고 자동모드로 뒀을때 열림 조건이되면
알람음은 이미 열림상태이기 때문에 울리지가 않아요. 어떻게 하면 좋을까요?
그리고 알림음이 창문이 동작하고(모터가 동작하고) 나왔으면 좋겠어서
(알림음 나오는 부분) delay(10000) (모터 동작부분) 이런식으로 사이에 딜레이를 넣었는데도
모터가 먼저 동작하고 알림음이 나오거나 거의 동시에 같이 동작됩니다.
delay말고 다른 방법이 있을까요? 아니면 이렇게 하면 되는건데 제가 잘못한걸까요?
혹시 몰라 전체 코딩도 첨부합니다.
#include <SoftwareSerial.h>
#include <MHZ19PWM.h>
MHZ19PWM mhz(2, MHZ_DELAYED_MODE);
char BTValue;
int mode=0,flag=0;
int IN1=10,IN2=12;
int rainSensor = A0;
int sensorVal;
int sensortrigger = 400;
int dust = 5;
int voice=0;
unsigned long duration;
unsigned long starttime;
unsigned long lowpulseoccupancy = 0;
unsigned long sampletime_ms=5000;
float ratio = 0;
float concentration = 0;
float posPerCF = 0;
float ugm3 = 0;
int trigPin = 3;
int echoPin = 4;
int PLAYE = A1;SoftwareSerial BTSerial(1, 0); // 블루투스 모듈(HC-06) 연결(TX 연결 핀번호 , RX 연결 핀 번호)
void setup() {
Serial.begin(9600);
BTSerial.begin(9600);
pinMode(dust,INPUT);
starttime = millis();
mhz.useLimit(5000);
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(rainSensor, INPUT);
pinMode(PLAYE, OUTPUT);
}
void stop(){ digitalWrite(IN1,0); digitalWrite(IN2,0); }void fwd() { digitalWrite(IN1,1); digitalWrite(IN2,0); }
void bwd() { digitalWrite(IN1,0); digitalWrite(IN2,1); }
void loop() {
long chomduration, distance; //초음파
digitalWrite(trigPin, HIGH); //초음파
delayMicroseconds(10); //초음파
digitalWrite(trigPin, LOW); //초음파
chomduration = pulseIn(echoPin, HIGH); //초음파
distance = ((float)(340 * chomduration) / 1000) / 2; //초음파
Serial.print(distance);
Serial.println("mm");
duration = pulseIn(dust, LOW); //먼지
lowpulseoccupancy = lowpulseoccupancy+duration; //먼지
ratio = lowpulseoccupancy/(sampletime_ms*10.0);
concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62;
posPerCF = concentration * 100;
ugm3 = posPerCF / 13000;
lowpulseoccupancy = 0;
starttime = millis();
int co2 = mhz.getCO2();
int sensorVal = analogRead(rainSensor);
BTSerial.println(sensorVal);
BTSerial.print("k");
BTSerial.println(co2);
BTSerial.print("k");
BTSerial.println(ugm3);
BTSerial.print("k");Serial.println(sensorVal);
Serial.print("k");
Serial.println(co2);Serial.print("k");
Serial.println(ugm3);
Serial.print("k");
Serial.print("mode=");
Serial.print(" ");
Serial.println(mode);
Serial.println(distance);
Serial.print("mm");BTValue = BTSerial.read();
if (BTValue == 'a') {mode=1;}
if (BTValue == 'o') {mode=2;if(!flag){ flag=1; fwd(); delay(distance*11); stop();}}
if (BTValue == 'c') {mode=3;if(flag){ flag=0; bwd(); delay(distance*11); stop(); }}
if (mode==1)
{if(sensorVal < sensortrigger){
Serial.println("빗물감지 CLOSE");if(!voice){ voice=1;digitalWrite(PLAYE,HIGH);
Serial.println("PLAYE...");
digitalWrite(PLAYE,LOW); delay(10000)}if(flag){ flag=0; delay(5000); bwd(); delay(distance*11); stop(); }
}
else if(sensorVal > sensortrigger){
if(co2>1000&&ugm3>80){
Serial.println("CO2, ugm3 기준치 초과 OPEN");
if(voice){ voice=0; digitalWrite(PLAYE,HIGH);
Serial.println("PLAYE...");
digitalWrite(PLAYE,LOW);delay(10000)}
}
if(!flag){ flag=1; delay(5000); fwd(); delay(distance*11); stop(); }else if(co2>1000&&ugm3<=80){
Serial.println("co2기준치 초과 OPEN");
if(voice){ voice=0;digitalWrite(PLAYE,HIGH);
Serial.println("PLAYE...");
digitalWrite(PLAYE,LOW);delay(10000)}
if(!flag){ flag=1; delay(5000); fwd(); delay(distance*11); stop(); }
}else if(co2<=1000&&ugm3>80){
Serial.println("ugm3기준치 초과 CLOSE");
if(!voice){ voice=1;digitalWrite(PLAYE,HIGH);
Serial.println("PLAYE...");
digitalWrite(PLAYE,LOW);delay(10000)}
if(flag){ flag=0; delay(5000); bwd(); delay(distance*11); stop(); }
}else if(co2<=1000&&ugm3<=80){
Serial.println("co2, ugm3 기준치 미만OPEN");
if(voice){ voice=0;digitalWrite(PLAYE,HIGH);
Serial.println("PLAYE...");
digitalWrite(PLAYE,LOW);delay(10000)}if(!flag){ flag=1; delay(5000); fwd(); delay(distance*11); stop(); }
}}
}
delay(100);
}
댓글 1
조회수 4,573master님의 댓글
master 작성일
초기값을 열림상태로 설정해 둔 경우 수동으로 창문을 닫아놓고 자동모드로 뒀을때 열림 조건이되면
알람음은 이미 열림상태이기 때문에 울리지가 않아요. 어떻게 하면 좋을까요?
//
이 부분은 답이 없습니다.
창문이 현재 열려있는지 닫혀있는지 센서를 달아서 체크하기 전에는 알 수 없는 노릇이죠
센서를 설치하기 까다로우니
시작전에 창문 위치를 어떻게 놓고서 시작한다고 임의로 정하세요
그에 맞게 변수 초기값을 정하면 됩니다.