아두이노 질문있습니다.
페이지 정보
작성자 헤헿 작성일20-11-14 19:04 조회5,084회 댓글2건본문
아래 코드에서 void setup()구문안에 gate(0);를 세팅해 뒀습니다.
gate(0)는 차단바를 내리고 gate(1)는 차단바를 올리게 세팅해 뒀습니다.
그런데 loop문 내부에
if(a1!=0){
tone(music1,800);
tone(music2,800);
digitalWrite(warning1,HIGH);
digitalWrite(warning2,HIGH);
time_alart1=millis();
time_alart2=millis();
if(distance<20){
tone(music3,800);
time_screen_alart=millis();
}
gate(0);
}
if(a2!=0){
tone(music2,800);
digitalWrite(warning2,HIGH);
time_alart2=millis();
if(distance<20){
tone(music3,800);
time_screen_alart=millis();
}
gate(0);
}
이 구문을 집어넣으면 gate(0);가 실행되다 엉켜서 gate(1);이 실행되고 있습니다.
저 부분을 제외하고 실행하면 제대로 gate(0);가 초기값으로 실행됩니다.
제가 보기엔 start1, start2함수와 gate함수는 관련이 없는데 왜 저러는지 모르겠습니다.
#include <Servo.h>
//
int red1=2; // 차량 신호등 핀 설정
int red2=5; // 보행자 신호등 핀 설정
int green1=4; // 차량 신호등 핀 설정
int green2=6; // 보행자 신호등 핀 설정
int yellow=3; // 신호등 핀 설정
int music1=7; // 부저 핀 설정1
int music2=8; // 부저 핀 설정2
int music3=39; // 스크린도어 부저
int Sigpin1=32; // start1 함수 입력 핀 설정
int Sigpin2=33; // start2 함수 입력 핀 설정
int trigPin=22; // 동작감지 아웃풋 핀 설정
int echoPin=23; // 동작감지 인풋 핀 설정
int warning1=24; // 경고등 동작 핀 설정1
int warning2=25; // 경고등 동작 핀 설정2
double time_screen=0; // 스크린도어 동작감시 시간
double time_screen_alart=0; // 스크린도어 경고 시간
double time_alart1=0; // 경고 시간
double time_alart2=0; // 경고 시간
Servo myservo1; // 모터 설정1
Servo myservo2; // 모터 설정2
//
void setup(){
pinMode(Sigpin1,INPUT); //속도 측정 핀1
pinMode(Sigpin2,INPUT); //속도 측정 핀2
pinMode(red1,OUTPUT); // 차량 신호등 핀
pinMode(red2,OUTPUT); // 보행자 신호등 핀
pinMode(green1,OUTPUT); // 차량 신호등 핀
pinMode(green2,OUTPUT); // 보행자 신호등 핀
pinMode(yellow,OUTPUT); // 신호등 핀
pinMode(trigPin,OUTPUT); // 동작감지 아웃풋
pinMode(echoPin,INPUT); // 동작감지 인풋
pinMode(warning1,OUTPUT); // led 핀1
pinMode(warning2,OUTPUT); // led 핀2
myservo1.attach(12); // 모터 아날로그 핀1
myservo2.attach(13); // 모터 아놀로그 핀2
Serial.begin(9600);
gate(0); //게이트 초기상태
}
//
void loop(){
char num; // 컴퓨터로 입력 숫자, 신호등 제어
int a1, a2, b; // 속도측정 함수1, 속도측정함수 2, 신호등 함수
int com_a1,com_a2;
double distance; // 스크린도어 센서 함수 받기
a1=start1();
a2=start2();
distance=sensor();
if(Serial.available()){
num=Serial.read();
b=traffic(num);
}
// 문제되는 부분 시작
if(a1!=0){
tone(music1,800);
tone(music2,800);
digitalWrite(warning1,HIGH);
digitalWrite(warning2,HIGH);
time_alart1=millis();
time_alart2=millis();
if(distance<20){
tone(music3,800);
time_screen_alart=millis();
}
gate(0);
}
if(a2!=0){
tone(music2,800);
digitalWrite(warning2,HIGH);
time_alart2=millis();
if(distance<20){
tone(music3,800);
time_screen_alart=millis();
}
gate(0);
}
// 문제되는 부분 끝
switch(b){
case 1:
gate(1);
break;
case 2:
if(distance<20){
tone(music3,800);
time_screen_alart=millis();
}
gate(0);
break;
case 3:
if(distance<20){
tone(music3,800);
time_screen_alart=millis();
}
gate(0);
break;
case 4:
if(distance<20){
tone(music3,800);
time_screen_alart=millis();
}
gate(0);
break;
}
if(millis()-time_alart1>1000){
time_alart1=millis();
time_alart2=millis();
digitalWrite(warning1,LOW);
digitalWrite(warning2,LOW);
noTone(music1);
noTone(music2);
}
if(millis()-time_alart2>1000){
time_alart2=millis();
digitalWrite(warning2,LOW);
noTone(music2);
}
if(millis()-time_screen_alart>1000){
noTone(music3);
time_screen_alart=millis();
}
}
//
void gate(int set){ // 모터 동작 함수
if(set==0){ //low
myservo1.write(0);
myservo2.write(180);
}
if(set==1){ // high
myservo1.write(180);
myservo2.write(0);
}
}
//
int start1 (){ //속도 측정 함수
double v, vmax;
int trg; // 출력
unsigned long T; // 주기
double f; // 주파수
vmax=0;
trg=0;
while(digitalRead(Sigpin1));
while(!digitalRead(Sigpin1));
T=pulseIn(Sigpin1,HIGH)+pulseIn(Sigpin1,LOW); // 주기 측정
f=1/(double)T; // 주파수 측정
v=((f*1e6)/44.0); // 속도 측정
if(v>10) v=0; // 튀는 값 정리하기
vmax=max(v,vmax); // 속도의 Max값 측정
if(vmax>30)trg=1; else trg=0;
return trg;
}
//
int start2 (){ //속도 측정 함수
double v, vmax;
int trg; // 출력
unsigned long T; // 주기
double f; // 주파수
vmax=0;
trg=0;
while(digitalRead(Sigpin2));
while(!digitalRead(Sigpin2));
T=pulseIn(Sigpin2,HIGH)+pulseIn(Sigpin2,LOW); // 주기 측정
f=1/(double)T; // 주파수 측정
v=((f*1e6)/44.0); // 속도 측정
if(v>10) v=0; // 튀는 값 정리하기
vmax=max(v,vmax); // 속도의 Max값 측정
if(vmax>30)trg=1; else trg=0;
return trg;
}
//
int traffic(char a){ //신호등 함수
int output;
switch(a){
case '1': traffic_sig1(); traffic_sig5(); output=1; break; //차량 빨강, 보행자 파랑
case '2': traffic_sig1(); traffic_sig4(); output=2; break; //차량 빨강, 보행자 빨강
case '3': traffic_sig2(); traffic_sig4(); output=3; break; // 차량 노랑, 보행자 빨강
case '4': traffic_sig3(); traffic_sig4(); output=4; break; // 차량 파랑, 보행자 빨강
}
return output;
}
//
double sensor(){ // 동작감지 함수
long duration;
double distance;
digitalWrite(trigPin, LOW); delayMicroseconds(2);
digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW);
duration=pulseIn(echoPin, HIGH);
distance=duration*0.034/2; //Cm
if(distance>24) distance=0;
return distance;
}
// 신호등 색 결정 함수들
void traffic_sig1(){ digitalWrite(red1, HIGH); digitalWrite(yellow,LOW); digitalWrite(green1,LOW); }
void traffic_sig2(){ digitalWrite(red1, LOW); digitalWrite(yellow,HIGH); digitalWrite(green1,LOW); }
void traffic_sig3(){ digitalWrite(red1, LOW); digitalWrite(yellow,LOW); digitalWrite(green1,HIGH); }
void traffic_sig4(){ digitalWrite(red2,HIGH); digitalWrite(green2,LOW); }
void traffic_sig5(){ digitalWrite(red2,LOW); digitalWrite(green2,HIGH); }
댓글 : 2
조회수 : 5,084
master님의 댓글
master 작성일
sensor() 초음파 센서 측정 주기는 100ms 마다 해야합니다.
지금처럼 딜레이 없이 계속 측정하면 엉터리 값이 읽혀집니다.
master님의 댓글
master 작성일나머지 질문은 소스만보고 답변하기 어려운 내용입니다.