아두이노

아두이노와 함수

CreatoMaestro 2023. 12. 31. 22:47
반응형

프로그래밍을 하다 보면 코드가 길어져 함수를 써야 할 때가 있습니다.

함수는 코드의 가독성을 높여주고, 반복되는 작업을 줄여줍니다.

 

아두이노를 코딩할 때도 함수를 사용할 수 있습니다.

함수를 쓰는 방법은 C언어를 쓰는 방법과 동일합니다.

여기서는 함수에 대해 모르는 분들을 위해 기초부터 설명하도록 하겠습니다.

 

함수를 사용하는 방법

함수의 구성요소로는 반환타입, 매개변수, 함수 이름, 실행할 코드가 있습니다.

각각에 간단하게 대해 살펴보겠습니다.

  • 반환 타입 : 반환타입은 함수 안에서 실행한 코드의 결과 값의 타입을 나타냅니다. 꼭 필요한 것은 아닙니다.
  • 매개변수 : 함수 내의 코드가 실행할 때 필요한 변수 값을 의미합니다. 함수를 호출할 때 값을 넣습니다.
  • 함수 이름 : 함수의 이름을 의미합니다.
  • 실행할 코드 : 함수가 호출되었을 때 실행될 코드를 의미합니다.

이 구성요소들을 이용해 함수를 정의합니다.

함수를 정의한다는 것은 함수가 어떤 코드를 실행할지 정해준다는 것을 의미합니다.

함수는 다음과 같이 정의합니다.

반환타입 함수_이름 (매개변수_타입 매개변수) {
  실행할 코드
  return;
}


//example
int add(int a, int b) {
  int c = a+b;
  return c;
}

 

우선 반환 타입을 정해줍니다.

예제 함수에서는 int 타입의 데이터를 반환한다고 정의했습니다.

 

그다음에 함수 이름을 지정해 줍니다. 

예제에서는 'add'를 함수 이름으로 지정했습니다.

 

이후 소괄호를 써주고 그 안에 매개변수를 적어줍니다.

매개변수를 지정할 때는 'int a'와 같이 '매개변수_타입 매개변수'와 같이 적어주면 됩니다.

예제에서는 int 타입의 변수 a, b를 지정해 주었습니다.

 

이후 중괄호 안에 실행할 코드를 적어줍니다.

여기서는 int 타입 변수 c에 a+b의 값을 저장합니다.

 

마지막으로 return을 써 주었습니다. 

return은 이 함수에서 벗어나 실행하던 곳으로 다시 돌아간다는 것을 의미합니다.

이 return 뒤에 반환할 값을 써 주시면 됩니다.

예제에서는 c를 반환했습니다.

 

이후 정의된 함수를 호출할 때는 다음과 같이 쓰면 됩니다.

함수_이름 (매개변수_값);

add(1,2);

 

함수이름을 써주고 소괄호를 써 줍니다.

이후 소괄호 안에 매개변수의 값을 적어줍니다.

예제의 경우 add(1,2);와 같이 적어주시면 됩니다.

 

아두이노에서 함수 사용하기

아두이노에서도 위에서 설명한 것과 같이 함수를 쓸 수 있습니다.

다음 예제를 살펴보겠습니다.

코드 실행을 위한 회로도
예제 회로도

void setup() {
  // put your setup code here, to run once:
  pinMode(13,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  Blink_LED(13,100,3);
  delay(500);
  Blink_LED(13,300,2);
  delay(500);
}


void Blink_LED(int pin, int delay_time, int loop) {
  for(int i = 0; i < loop; i++) {
    digitalWrite(pin,1);
    delay(delay_time);
    digitalWrite(pin,0);
    delay(delay_time);
  }

  return;
}

 

위 코드에서는 13번 핀을 출력으로 설정했습니다.

이후 Blink_LED라는 함수를 500ms 간격으로 호출합니다.

그리고 Blink_LED는 마지막에 정의되어 있습니다.

 

Blink_LED함수를 좀 더 자세히 살펴보겠습니다.

void Blink_LED(int pin, int delay_time, int loop) {
  for(int i = 0; i < loop; i++) {
    digitalWrite(pin,1);
    delay(delay_time);
    digitalWrite(pin,0);
    delay(delay_time);
  }

  return;
}

 

이 함수의 반환 타입은 void로 설정되어 있습니다.

이 void는 반환하는 값이 없다는 것을 의미합니다.

맨 마지막에 return만 쓰여 있는 것을 확인할 수 있습니다.

반환할 값이 없기 때문에 return만 쓴 것입니다.

 

실행할 코드는 일반적인 blink코드입니다.

매개변수로 받은 pin을 delay_time의 주기로 blink 합니다.

또한 for문 안에 있어 매개변수인 loop 값만큼 반복합니다.

 

이렇게 하면 Blink_LED 한 줄만 써도 원하는 횟수만큼 깜박일 수 있습니다.

 

만약 이 코드를 함수를 쓰지 않고 적는다면 다음과 같을 것입니다.

void setup() {
  // put your setup code here, to run once:
  pinMode(13,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  for(int i = 0; i < 3; i++) {
    digitalWrite(13,1);
    delay(100);
    digitalWrite(13,0);
    delay(100);
  }
  delay(500);

  for(int i = 0; i < 2; i++) {
    digitalWrite(13,1);
    delay(300);
    digitalWrite(13,0);
    delay(300);
  }
  delay(500);
}

 

지금까지는 쓰는 코드의 길이가 비슷한 것 같습니다.

하지만 이 것을 4번 5번 반복하면 어떻게 될까요?

코드는 굉장히 길어지고 보기도 힘들어질 것입니다.

 

함수는 코드가 복잡해질수록 그 진가를 발휘합니다.

반응형