BASIC4MCU | 질문게시판 | 리모컨으로 모터 제어
페이지 정보
작성자 코시 작성일2019-05-29 00:43 조회3,329회 댓글0건본문
리모컨을 사용하여
재생 버튼 누르면 시스템이 오토모드로 센서가 자동적으로 돌아가게 하고
C 버튼 누르면 수동모드로 바뀌면서 이후에 누르는 키에 따라서 동작하게 하고싶은데
지금 상태에서는 한 번 입력이 들어가면 더이상 키를 눌러도 먹히지가 않는데 어떻게 해결해야할까요?
문 여는 버튼과 불 키는 버튼은 토글식으로 하고자 합니다.
문은 서보모터로, 불은 LED로 설정했습니다.
#include <Servo.h>
#include <IRremote.h>
/*
FFA25D : Power
FF22DD : Test
FFE21D : Menu
FFC23D : Back
FF02FD : +
FF9867 : -
FFE01F : <<
FF906F : >>
FFA857 : Play
FF6897 : 0
FF30CF : 1
FF18E7 : 2
FF7A85 : 3
FF10EF : 4
FF38C7 : 5
FF5AA5 : 6
FF42BD : 7
FF4AB5 : 8
FF52AD : 9
FFB04F : C
*/
decode_results results;
Servo servo;
int RECV_PIN = A0;
IRrecv irrecv(RECV_PIN);
int angle = 0; // 모터 동작 각도 인수
int trig1 = 7; // 차고 입구 초음파센서 trig1 핀 지정
int echo1 = 8; // 차고 입구 초음파센서 echo1 핀 지정
int trig2 = 2; // 차고 내부 초음파센서 trig2 핀 지정
int echo2 = 4; // 차고 내부 초음파센서 echo2 핀 지정
int resPin = A3; // 가변저항 핀 지정
int light1 = 5; // 복도 등
int light2 = 6; // 차고 등
int timer = 0;
int flag1 = 0;
int flag2 = 0;
int flag3 = 0;
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
int f = 0;
float duration1;
float distance1; // 위 아래 둘 다 초음파센서용
float duration2;
float distance2;
void setup() {
Serial.begin(9600);
servo.attach(3); //서브모터 핀 지정
pinMode(trig1, OUTPUT);
pinMode(echo1, INPUT);
pinMode(trig2, OUTPUT);
pinMode(echo2, INPUT);
pinMode(light1, OUTPUT);
pinMode(light2, OUTPUT);
irrecv.enableIRIn();
}
void loop() {
int resVal = analogRead(resPin);
int resOut = map(resVal, 0, 1023, 0, 1000); // 저항값을 0~1000사이로 맵핑
if(irrecv.decode(&results)){
if(results.decode_type == NEC){
switch(results.value){
case 0x00FFA857: // Play 키 누를 시 오토 동작
a = 1;
Serial.println("Auto Mode");
break;
case 0x00FFB04F: // C 키 누를 시 수동 동작
a = 2;
Serial.println("Manual Mode");
break;
case 0x00FF02FD: // + 키 문 열림 한 번 더누르면 닫힘
b = 1;
break;
case 0x00FF9867: // - 키 차고 점등 한 번 더누르면 소등
b = 1;
break;
case 0x00FF6897: // 0 키 복도 점등 한 번 더누르면 소등
b = 1;
break;
}
}
}
if (a == 1) {
Serial.print("Resistor value:");
Serial.println(resOut); // 가변저항 저항값 출력
digitalWrite(trig1, HIGH); // 차고 문 초음파센서
delayMicroseconds (10);
digitalWrite(trig1,LOW);
duration1 = pulseIn(echo1,HIGH);
distance1 = ((340*duration1) / 10000) / 2;
Serial.print("Door - Vehicle: ");
Serial.print(distance1); // 차고 문과 차량 사이 거리
Serial.println("cm");
if (resOut > 500 && distance1 < 70) // 저항값과 초음파센서 거리값이 임계값을 만족할 때
{
Serial.println("Open");
angle = 90;
servo.write(angle);
delayMicroseconds (10);
digitalWrite(trig2, HIGH); // 차고 내부 초음파 센서 동작
delayMicroseconds (10);
digitalWrite(trig2,LOW);
duration2 = pulseIn(echo2,HIGH); // pulseln 단위 ms(microsecond) 초음파 시간차 duration값에 입력
distance2 = ((340*duration2) / 10000) / 2; // 초음파 속도 (34000) * 센서 시간차 / 100000 / 2
Serial.print("Celling - Vehicle: ");
Serial.print(distance2); // 차고 천장과 차량 사이 거리
Serial.println("cm");
digitalWrite(light1, HIGH); // 차고 점등
if (distance2 <50) // 복도에 사람 진입
{
digitalWrite(light2, HIGH); // 복도 점등
for (timer = 0; timer <= 30; timer++)
{
Serial.println(timer);
delay(100); // 30초 동안 점등이지만 빠른 결과 위해 3초로 설정
if (timer == 30)
{
digitalWrite(light1, LOW);
digitalWrite(light2, LOW);
Serial.println("Turn off the Lights");
}
}
}
else
digitalWrite(light2, LOW);
}
else
{
digitalWrite(light1, LOW);
angle = 0;
Serial.println("Close");
delay (10);
}
a = 2;
servo.write(angle);
delay(1000); // 루프 속도
}
else if (a == 2)
{
if (b == 1)
{
if (flag1 == 0)
{
Serial.println("Open");
servo.write(90);
delayMicroseconds (10);
}
else
{
Serial.println("Close");
servo.write(0);
delayMicroseconds (10);
}
}
else
angle = 0;
Serial.println("Close");
a = 1;
}
}
댓글 0
조회수 3,329등록된 댓글이 없습니다.