BASIC4MCU | 질문게시판 | 적외선 센서 질문입니다...
페이지 정보
작성자 태태 작성일2020-11-06 22:18 조회9,600회 댓글3건본문
bool flag_1=0;
bool flag_2=0;
unsigned long t1,t1_start,t1_end;
unsigned long t2,t2_start,t2_end;
#define inputPin1 A0
#define inputPin2 A1
int REDpin = 9; //도로빨간불
int YELLOWpin = 8; //도로 황불
int GREENpin = 7; //도로 초록불
int Rpin = 5; //보행자 빨간불
int Bpin = 6; //보행자 파란불
int DRpin = 4; // 운전자 경고등
int FGpin = 10; // 바닥신호등 초록
int FYpin = 11; // 바닥신호등 황불
int FRpin = 12; // 바닥신호등 빨강
void setup()
{
pinMode(REDpin, OUTPUT);
pinMode(YELLOWpin, OUTPUT);
pinMode(GREENpin, OUTPUT);
pinMode(FRpin, OUTPUT);
pinMode(FGpin, OUTPUT);
pinMode(FYpin, OUTPUT);
pinMode(DRpin, OUTPUT);
pinMode(Rpin, OUTPUT);
pinMode(Bpin, OUTPUT);
}
void loop()
{
int inputPin1 = analogRead(inputPin1);
int inputPin2 = analogRead(inputPin2);
digitalWrite(GREENpin, HIGH); //도로 초록불,보행자 빨간불 on
digitalWrite(Rpin, HIGH);
delay(5000);
digitalWrite(GREENpin, LOW); //도로 초록불off, 도로 황불 on
digitalWrite(YELLOWpin, HIGH);
delay(1000);
digitalWrite(YELLOWpin, LOW); //도로 황불off, 도로 빨간불 on
digitalWrite(REDpin, HIGH);
digitalWrite(Bpin, HIGH); //보행자 파란불 on, 보행자 빨간불off 운전자경고등 on
digitalWrite(Rpin, LOW);
digitalWrite(DRpin, HIGH);
if(inputPin1==HIGH)
{if(flag_1==0){ flag_1=1; t1_start=millis();}
}
else{if(flag_1){flag_1=0; t1_end=millis(); t1=t1_end-t1_start;}
}
if(inputPin2==HIGH)
{if(flag_2==0){ flag_2=1; t2_start=millis();}
}
else{if(flag_2){flag_2=0; t2_end=millis(); t2=t2_end-t2_start;}
}
if(t1+t2 >= 1000)
{
digitalWrite(FGpin, HIGH);
}
else if(t1+t2 >=500)
{
digitalWrite(FYpin, HIGH);
}
else
{
digitalWrite(FRpin, HIGH);
}
delay(20000);
digitalWrite(REDpin, LOW); //도로 빨간불 off, 보행자 파란불 off 운전자경고등 off
digitalWrite(Bpin, LOW);
digitalWrite(DRpin, LOW);
}
저번에 답변받고 제가 손을 더 봤습니다. 감사합니다. ㅎㅎ
1. 보행자 파란불일때만 바닥신호등이 작동했으면 하는데요 다음신호로 가도 계속 켜집니다. ㅠㅠ
보행자 파란불일때만 가둘 수 있을까요?
2. 바닥신호등도 빨간불만 계속 들어옵니다.
혹시 저 코드가 잘못된 걸까요?
댓글 3
조회수 9,600master님의 댓글
master 작성일
delay(20000); // <----------- 보행자 파란불 딜레이
digitalWrite(REDpin, LOW); //도로 빨간불 off, 보행자 파란불 off 운전자경고등 off
딜레이 동안에 바닥불을 켜면 됩니다.
1. 셋업함수에서 바닥불을 적색 켜둡니다.
2. 루프문의 상기 딜레이는 아래처럼 변경하세요
digitalWrite(FRpin,LOW); // <----------- 보행자 파란불 딜레이 중 바닥신호등 적색 OFF
digitalWrite(FYpin,HIGH); delay( 1000); digitalWrite(FYpin,LOW); // <----------- 보행자 파란불 딜레이 중 바닥신호등 황불 1초
digitalWrite(FGpin,HIGH); delay(19000); digitalWrite(FGpin,LOW); // <----------- 보행자 파란불 딜레이 중 바닥신호등 초록 19초
digitalWrite(FRpin,HIGH); // <----------- 보행자 파란불 딜레이 중 바닥신호등 적색 ON
digitalWrite(REDpin, LOW); //도로 빨간불 off, 보행자 파란불 off 운전자경고등 off
태태님의 댓글
태태
제가 질문을 잘못드렸네요.
바닥 신호등은 적외선센서에서 받은 값에 따라서 나오게 하고 싶습니다. 보행자나 도로 신호등과는 무관합니다.
센서1과 센서2의 감지시간의 합에 따라서 나오게 하고싶습니다. if 문의 문제가 있을까요?
그리고 if문을 가두는 게 말씀하신 것처럼 되있는게 아닌가요?
master님의 댓글
master
if(inputPin1==HIGH){
if(flag_1==0){ flag_1=1; t1_start=millis();}
}
else{
if(flag_1){flag_1=0; t1_end=millis(); t1=t1_end-t1_start;}
}
//
if(inputPin2==HIGH){
if(flag_2==0){ flag_2=1; t2_start=millis();}
}
else{
if(flag_2){flag_2=0; t2_end=millis(); t2=t2_end-t2_start;}
}
//
if(t1+t2 >= 1000){ digitalWrite(FGpin, HIGH); }
else if(t1+t2 >=500){ digitalWrite(FYpin, HIGH); }
else{ digitalWrite(FRpin, HIGH); }
이 코드는 1회만 실행하고
그 아래에 있는 20초 딜레이가 실행 되버리면 딜레이 동안에는 아무런 체크를 하지 않습니다.
20초 동안에 계속해서 센서를 체크하려면 for문으로 처리하는 방법도 있습니다.
for(int i=0;i<200;i++){
센서체크
delay(100);
}
0.1초 딜레이로 200번 루프를 돌리면 20초가 되며
0.1초마다 센서를 체크해서 처리하게 되겠죠
for(int i=0;i<200;i++){
if(inputPin1==HIGH){
if(flag_1==0){ flag_1=1; t1_start=millis();}
}
else{
if(flag_1){flag_1=0; t1_end=millis(); t1=t1_end-t1_start;}
}
//
if(inputPin2==HIGH){
if(flag_2==0){ flag_2=1; t2_start=millis();}
}
else{
if(flag_2){flag_2=0; t2_end=millis(); t2=t2_end-t2_start;}
}
//
if(t1+t2 >= 1000){ digitalWrite(FGpin, HIGH); }
else if(t1+t2 >=500){ digitalWrite(FYpin, HIGH); }
else{ digitalWrite(FRpin, HIGH); }
delay(100);
}