아두이노 Arduino

[아두이노]1초마다 프로그램 동작 시키기(millis(),delay(), scheduling, 스케쥴링)

끄적끄적아무거나 2022. 5. 10. 08:37
반응형

 

목차

     

     

    Arduino 스케줄에 따라 프로그램 동작 시키기

     

    원하는 시간(Timing)에 원하는 코드(Code)를 실행시키는 방법에 대해 알아보겠습니다. 일반적으로 Atmega 칩에서 이러한 스케쥴링(Scheduling)을 하기 위해서는 타이머 인터럽트(Timer Interrupt)를 사용해서 원하는 시간에 특정 코드가 동작하게 만들어 줍니다. 

     

    아두이노(Arduino)에는 다행이도 millis 라는 함수를 사용해서 해당 라인에 왔을때 당시 시간을 밀리세컨드(milli second)로 Return 해줍니다. 

     

    Delay 함수는 입력 값으로 밀리세컨드를 입력 값으로 받아서 그 시간동안 다른 코드를 진행하지 않고 홀드(Hold) 해서 시간을 보냅니다.

     

    아래의 예제 코드를 통해 쉽게 이해할 수 있습니다.

     

     

     

     

     

     

    Arduino 스케줄에 따라 프로그램 동작 시키기 : 예제

     

    예제 코드>>

    void setup() {
    
      Serial.begin(9600);
      while (!Serial) {
        ;
      }
    }
    
    unsigned long cur_time = 0;
    unsigned long pre_time = 0;
    
    void loop() {
        cur_time = millis();
        if(cur_time%1000 == 0)
        {
          Serial.print(cur_time);
          Serial.println("ms");
        }
    }

    3~7번 라인: 시리얼 통신을 연결해줍니다.

    9번 라인: 현재 시간(Current time)을 저장할 변수를 지정합니다.

    12번 라인: millis 함수를 사용해서 현재 진행 시간 값을 cur_time에 저장합니다.

    13번 라인: 1000ms 단위로 cur_time이 나올 때 14~16번 라인을 실행합니다.

     

     

    결과>>

    각 시간값이 여러번 출력되었습니다. 의미는 13~16번 라인의 코드를 실행하는데 1ms 도 안걸려서 여러번 진행이 된 것입니다. 

     

    초당 한번씩만 구현하고 싶을 때는 아래와 같이 코드를 수정하시면 됩니다.

     

     

     

    수정 예제 코드>>

    void setup() {
    
      Serial.begin(9600);
      while (!Serial) {
        ;
      }
    }
    
    unsigned long cur_time = 0;
    
    void loop() {
        cur_time = millis();
        if(cur_time%1000 == 0)
        {
          Serial.print(cur_time);
          Serial.println("ms");
          delay(1);
        }
    }

    17번 라인: 1ms 의 지연을 줘서 최소 1ms가 지나기 전에는 if 문을 실행하지 않게 합니다.

     

     

    결과>>

     

     

     

    반응형