아두이노 Arduino

[아두이노] 일정 시간 간격으로 시리얼 출력하기(Arduino, millis, delay, 1초)

끄적끄적아무거나 2024. 1. 8. 09:02
반응형

 

목차

     

     

     

     

     

     

    [아두이노] 일정 시간 간격으로 시리얼 출력하기

    아두이노에서 1초에 한 번씩 시리얼 데이터를 보내는 코드를 작성하는 것은 비교적 간단합니다. 기본적인 아이디어는 millis() 함수를 사용하여 현재 시간을 체크하고, 마지막으로 데이터를 보낸 시간과 현재 시간의 차이가 1000밀리초(1초) 이상이 되었을 때 데이터를 보내는 것입니다.


    delay(1000)를 사용하는 경우 정확한 1초의 지연을 보장하지 않는 이유는 아두이노의 delay() 함수가 프로그램의 나머지 부분을 "블록(block)" 또는 일시 중지 시키기 때문입니다. delay(1000)을 호출하면 프로그램은 1000밀리초 동안 아무런 다른 작업도 수행하지 않습니다. 이 기간 동안 센서를 읽거나, 입력을 체크하거나, 시리얼 데이터를 전송하는 등의 다른 작업을 할 수 없습니다.

     

    예제 코드>>

    unsigned long previousMillis = 0;  // 마지막으로 데이터를 보낸 시간을 저장할 변수
    const long interval = 1000;        // 메시지를 보내는 간격 (밀리초 단위), 여기서는 1초
    
    void setup() {
      Serial.begin(9600);  // 시리얼 통신을 시작 (9600 보드레이트)
    }
    
    void loop() {
      unsigned long currentMillis = millis();  // 현재 시간을 밀리초 단위로 가져옴
    
      if (currentMillis - previousMillis >= interval) {
        // 마지막으로 메시지를 보낸 시간에서 1초가 지났는지 확인
        previousMillis = currentMillis;  // 현재 시간을 '마지막으로 메시지를 보낸 시간'으로 업데이트
    
        // 1초마다 실행할 코드
        Serial.println("1초마다 보내는 메시지");  // 시리얼 모니터에 메시지 보내기
      }
    }

     

    주석>>

    이 코드는 아두이노의 loop() 함수 내에서 지속적으로 현재 시간을 체크하고, 마지막으로 메시지를 보낸 시간과의 차이가 1초 이상일 때 시리얼 모니터에 메시지를 보냅니다. 이 방법은 간단하고 효과적이며, 일반적인 시리얼 통신에서 자주 사용됩니다.

     

    아두이노에서 long 데이터 타입은 32비트 정수 값을 저장하는 데 사용됩니다. millis() 함수는 프로그램이 시작된 이후의 밀리초 단위 시간을 반환하며, 이 값은 시간이 지남에 따라 계속 증가합니다. 아두이노가 오랜 시간 동안 실행될 경우, millis()에서 반환되는 값은 매우 큰 수가 될 수 있습니다. 따라서, long 타입은 이러한 큰 값을 안전하게 저장하기 위해 사용됩니다.

     

    const 키워드는 상수(constant)를 정의하는 데 사용됩니다. 상수는 프로그램 실행 중에 그 값이 변경되지 않는 변수를 의미합니다. 이 코드에서 const long interval = 1000; 구문은 interval이라는 이름의 상수를 선언하고, 이를 1000으로 초기화합니다. interval은 시간 간격을 나타내며, 이 값은 프로그램 실행 중에 변경되어서는 안 됩니다. const를 사용하여 이 변수의 값이 프로그램 내에서 실수로 변경되는 것을 방지할 수 있습니다.

     

     unsigned long의 빼기 연산은 모듈로 2^32의 산술을 사용하기 때문에, 오버플로가 발생해도 currentMillis - previousMillis의 계산 결과가 올바르게 유지되기 때문에 Overflow를 고려하지 않아도 됩니다.

     

     

    결과>>

     

     

    반응형