반응형

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}

아두이노에서 LED를 1초에 한번 켰다 껐다 하려면 위와 같은 코드를 사용한다!

여기서 LED-BUILTIN은 아두이노 내장LED의 핀번호를 의미하고 두번째 매개변수인 HIGH는 디지털핀의 출력을 5V로 하겠다는 것이고 LOW는 0V로 하겠다는 의미이다!(전원을 공급한다와 하지 않는다로 해석하면 됨!)

bool mybool = true;

  if(mybool){
    Serial.println("야호!"):
  }

위 코드는 IF의 조건식안에 mybool이 true혹은 false가 될 수 있는데 true일때 "야호"를 출력하겠다는 의미이다!

 

아두이노에서는 ①false와 LOW와 0이 서로 같은 의미 이다! (false == LOW == 0)

그리고 ②true와 HIGH와 1이 서로 같은 의미이다! (true == HIGH == 1)

 

②번 부분을 조금 좁게 해석했는데 정확히 표현하자면 true와 HIGH는 0이 아닌 모든 숫자가 true로 적용된다!

(음의 숫자도 포함되는지는 확인을 안해봤네..)

 

이런 지식이 있다면 아래 독특한 코드가 어떻게 돌아가는지 이해할 수 있다!

void setup() {
  Serial.begin(9600);
}

void loop() {
  if(Serial.available()){
    char c = Serial.read();
  }
}

Serial.available()이란 함수는 지금 외부에서 아두이노쪽으로 입력된 데이터의 갯수가 버퍼에 몇개 있는지를 반환하는 함수이다!

여기서 "몇개"라는게 중요한데 몇개는 조건이 아니다! 조건은 참이냐 거짓이냐를 판단하는 것인데,

숫자가 if조건식안에 덩그러니 들어가 있다!

 

Serial.available()의 결과가 0이라면 수신한 데이터의 갯수가 0임을 의미하고 수신한게 없다고 해석할 수 있을 것이다!

①에서 0은 false하고 같다고 했다! 그렇다면 저 조건식은 if(false)가 되므로 실행되지 않을 것이다!

 

그런데 수신한 데이터가 있다고 한다면 ②에서 언급한것과 같이 0이 아닌 모든 양수에 해당되므로 if안에 들어가는 숫자는 1~~N의 값을 가지게 될 것이고 true로 적용되게 된다! 

 

loop안에 있는 구문은 "수신한 값이 있다면 조건문을 실행시키겠다"로 해석할 수 있는 것이다!

위 식을 조금더 명시적으로 활용한다면 이렇게 쓰는게 맞다!

void setup() {
  Serial.begin(9600);
}

void loop() {
  if(Serial.available() > 0){
    char c = Serial.read();
  }
}

Serial.available() > 0는 결과가 참이냐 거짓이냐이므로 조건식이 맞다!

그러나 위코드와 이코드의 결과는 동일하다!

동일한 결과인데 해석을 어떻게 할 수 있느냐의 차이고 결국 0이 아닌 모든 숫자는 true다 라는걸 알고 있어야 한다!

 

다음으로 HIGH와 LOW도 독특하게 아두이노에서 활용될 때가 있다!

int sensor = 30;
  int led_pin = 5;
  if(sensor > 20) digitalWrite(led_pin, HIGH);
  else digitalWrite(led_pin, LOW);

이코드는 sensor값이 20보다 크면 LED가 켜지고 20이하이면 LED가 꺼지는 예제이다!

이코드는 이렇게 써도 결과가 동일하다!

int sensor = 30;
  int led_pin = 5;
  bool detect;
  if(sensor > 20) detect = true;
  else detect = false;
  
  digitalWrite(led_pin, detect);

왜냐하면 LOW와 false가 같고 HIGH와 true가 같기 때문이다~~!

마지막으로 삼항연산자를 활용한다면 이런 구문도 튀어나와서 혼란을 야기할 수 있다!

int sensor = 30;
  int led_pin = 5;
  
  digitalWrite(led_pin, sensor>20?HIGH:LOW);
  //digitalWrite(led_pin, sensor>20?true:false);

digitalWrite(led_pin, sensor>20?HIGH:LOW);
digitalWrite(led_pin, sensor>20?true:false);

이 코드의 결과가 동일하게 된다~~!

끝!

반응형
Posted by 덕력킹
,