http://kocoafab.cc/fboard/484 의 두 번째 질문입니다.
int trigPin = 12;
int echoPin = 13;
int safeZone = 30;
#define PIN_RX 2
#define PIN_TX 3
#include
SoftwareSerial btSerial(PIN_RX, PIN_TX);
char val;
void setup()
{
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
btSerial.begin(9600);
Serial.println("HC-SR04. distance measure start!");
btSerial.println("HC-SR04. distance measure start!");
Serial.println();
}
void loop()
{
float duration, distance;
digitalWrite(trigPin, LOW);
digitalWrite(echoPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = ((float)(340 * duration) / 10000) / 2;
if( btSerial.available() )
{
val = btSerial.read();
if(val == '3') //SONAR
{
btSerial.println("Auto Sonar Start!");
if (distance < 30) // 만약 30cm 안에 장애물이 감지되면,
{
Serial.print(val);
Serial.println("right"); // 오른쪽으로 회전합니다.
}
else // 아닐경우,
{
Serial.print(val);
Serial.println("forward"); // 계속 전진합니다.
}
delay(500);
}
}
}
while문 밖에다가 써봤는데 그것이 안되서 아예 처음부터 코딩을 하여서.
이런식으로 작성하고 시리얼 통신으로 테스트 해봤는데
3을 입력받고 계속 초음파 센서를 통한 거리재기가 계속 나오지 않고
3을 입력 받을때만 작동합니다.. 어떻게 하면 좋죠
HC-SR04. distance measure start!
3forward
3forward
3forward
3right
|
원기옥 2016-02-03 08:52:51
위의 소스코드에서는 '3'번을 입력해야, 그 시점에서 단한번 해당 블럭이 실행됩니다.
의도하시는 것 같이, 3을 한번 입력하면, 무한 반복되면서 거리를 계속 체크하는 로직이 아닙니다.
계속 수행을 하게하려면, 조건을 없애거나, 3을 입력 받았을때, 특정 boolean 변수를 true|false 값으로 변경하고 이 변수를 기반으로 동작 여부를 결정하면 됩니다.
즉, 위와 같이 작성을 하면, 무한 반복이 되겠죠. 그리고 특정 값으로, 가령 3으로 해당 블럭의 실행여부를 결정하고자 한다면, 아래와 같이 하면 됩니다.