BASIC4MCU | 질문게시판 | 아두이노 토글스위치 질문 있습니다.
페이지 정보
작성자 GAWB 작성일2020-12-03 17:21 조회35,533회 댓글10건본문
초음파 센서를 통해 거리가 250cm 안으로 가까워지면 불빛이 나고
100cm 안으로는 LED 가 더 쎄게 켜지고 부저에서 소리가 나는 것을 구현했습니다.
여기서 버튼 누르면 부저가 켜지고 버튼 누르면 부저가 꺼지는 형식으로 만들고 싶습니다.
회로도 사진도 첨부하겠습니다.
아래는 코드입니다.
/// defines pins numbers
const int TRIG = 9;
const int ECHO = 10;
const int LED = 6;
const int SPEAKER = 12;
const int START_BUTTON = 5;
// defines variables
long duration;
int distance;
int note;
int flag1=0;//상황변화에 관한 값 저장
int flag2=0;
int state=0;// state변수 선언
void setup() {
pinMode(TRIG, OUTPUT); //트리거 핀 출력으로 설정
pinMode(ECHO, INPUT); //에코 핀 입력으로 설정
pinMode(LED, OUTPUT); //LED 핀 출력으로 설정
pinMode(SPEAKER, OUTPUT); //LED 핀 출력으로 설정
pinMode(START_BUTTON, INPUT);
Serial.begin(9600); //Starts the serial communication
}
void loop() {
flag1 = digitalRead(START_BUTTON);//버튼의 상태의 flag에 저장한다.
//--------------------------------------------------------------------------
digitalWrite(TRIG, LOW); //트리거 핀 초기화, 2us 정도 작동준비할 시간 줌
delayMicroseconds(2);
digitalWrite(TRIG, HIGH); //트리거 핀에 10us 동안 High 신호를 주어야 초음파센서가 초음파를 쏨
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn(ECHO, HIGH); //에코 핀에 몇초만에 초음파가 돌아왔는지를 읽음;
// Calculating the distance
distance= duration/58; //시간을 Cm로 환산하는 식
note = (100 - distance + 200)*10;
Serial.print("Distance: ");
Serial.print(distance);
Serial.print("cm");
Serial.println();
//--------------------------------------------------------------------------
if((flag1 = HIGH) && (flag2 == LOW)) { //flag1이 켜져있고 flag2가 꺼져있다면
state = 1 - state;
delay(10);
}
flag2 = flag1;
if(state == 1) {//1이면 키고
if(distance>250)
analogWrite(LED,0); //거리 2.5M 이상일 시 LED 소등
else if(distance>100)
analogWrite(LED,128); //거리 2.5M 이하 1M 이상일 시 LED 반틈 밝기로 점등
else {
if(digitalRead(START_BUTTON) == LOW){
analogWrite(LED,255); //거리 1M 이하일 시 LED 완전한 밝기로 점등
tone(SPEAKER,note,1000);
}
}
}
else{//아니면 끄고
analogWrite(LED,LOW);
digitalWrite(SPEAKER, LOW);
}
//--------------------------------------------------------------------------
}
//
//delay(10);
//
//}
//else {
// digitalWrite(LED,LOW);
//}
//
댓글 10
조회수 35,533master님의 댓글
master 작성일
초음파와 부저가 관련이 있다면 조건식을 다시 만드셔야 합니다.
질문 내용으로는 뭘 하려는지 모르겠습니다.
GAWB님의 댓글
GAWB
토글기능을 가진 스위치로 구현하고싶습니다. 초음파 부분은 코딩에 문제가 없는거 같은데 스위치 부분의 코딩이 문제있는거 같습니다. 조건식이 이상하다고 하셨는데 어느 부분을 어떻게 고쳐야하냐요?
master님의 댓글
master 작성일
초음파 센서를 통해 거리가 250cm 안으로 가까워지면 불빛이 나고
100cm 안으로는 LED 가 더 쎄게 켜지고 부저에서 소리가 나는 것을 구현했습니다.
여기서 버튼 누르면 부저가 켜지고 버튼 누르면 부저가 꺼지는 형식으로 만들고 싶습니다.
//
댓글에 조건식이라고 적었는데 식은 빼고 (구동)조건, 즉 알고리즘이 이상하다고 변경하죠
"버튼 누르면 켜지고 버튼 누르면 꺼진다" 이 것은 알겠습니다.
"초음파 100cm 안으로는 부저에서 소리" 이 부분이 문제입니다.
버튼 눌러서 부저가 꺼진 상태에서 초음파 100cm 이하에서 소리가 나야하나요? 아니면 초음파로 부저 구동은 하지 않는 것인가요?
GAWB님의 댓글
GAWB
버튼 눌러서 부저가 꺼진 상태에서 초음파 100cm 이하에서 소리가 나야하나요?
---
부저가 꺼진상태에서도 초음파 100cm 이하에서 소리가 나면 안되는게 목적입니다.
master님의 댓글
master
초음파로는 부저 제어를 하지 않아야 한다는 말이군요
LED는 스위치와 상관없으니
초음파로는 LED 제어를 하고, 스위치로는 부저를 제어하면 되겠군요
master님의 댓글
master 작성일
알고리즘을 상세히 기술하면
c언어로 알고리즘 대로만 작성하면 그만입니다.
master님의 댓글
master 작성일
초음파 센서를 통해 거리가 250cm 안으로 가까워지면 불빛이 나고
버튼 누르면 부저가 켜지고 버튼 누르면 부저가 꺼지는 형식
//
const int TRIG=9;
const int ECHO=10;
const int LED=6;
const int SPEAKER=12;
const int START_BUTTON=5;
//
long duration;
int distance;
int sw_flag=0,buz_flag=0;
//
void setup() {
pinMode(TRIG,OUTPUT);
pinMode(ECHO,INPUT);
pinMode(LED,OUTPUT);
pinMode(SPEAKER,OUTPUT);
pinMode(START_BUTTON,INPUT);
Serial.begin(9600); //Starts the serial communication
}
//
void loop() {
if(digitalRead(START_BUTTON)){ //버튼을 누르면
if(sw_flag==0){ sw_flag=1;
buz_flag^=1;
digitalWrite(SPEAKER,buz_flag);
}
}
else{ sw_flag=0; }
//--------------------------------------------------------------------------
digitalWrite(TRIG,1); delayMicroseconds(10); digitalWrite(TRIG,0);
duration=pulseIn(ECHO,1); distance=duration/58;
Serial.print("Distance: "); Serial.print(distance); Serial.println("cm");
if(distance<50)digitalWrite(LED,1); // 50cm 미만에서 LED ON
else digitalWrite(LED,0); // 아니면 LED OFF
//--------------------------------------------------------------------------
delay(100);
}
master님의 댓글
master 작성일
먼거리를 측정하고 싶어서 250cm를 측정한 것 같은데, 50cm로 줄였습니다.
초음파센서가 스펙에는 6m(?) 정도까지 측정가능하다고 적혀있지만
소음이 하나도 없는 실험실에서나 가능한 거리겠죠
실험해서 가능한 거리내에서 처리하세요
GAWB님의 댓글
GAWB
스위치가 토글처럼 1이된 상태를 유지하지 못하고 누른 순간만 1이되는것 같습니다. 누르면 계속 1이였다가 다시 또 누르면 0이되는걸 원합니다.
부저역시 가까워진 경우(조건에 맞는경우)에만 울리는게 기본인데 그를 스위치로도 키고 끌수 있도록 하는게 궁극적인 목표입니다. 저 위에 코드에서 어떻게 수정해야하나요?
master님의 댓글
master
스위치에 저항을 연결하지 않았다면 저항을 추가하세요
//
"부저역시 가까워진 경우(조건에 맞는경우)에만 울리는게 기본" <-- 위 댓글에서 초음파와 부저는 관련이 없다고 적지 않았나요?
가까워졌을 때 부저가 울리나요?
c언어 기초문법 조금만 알면 스스로 할 수 있습니다.
스스로 완성시켜보세요