아두 이노 지연[튜토리얼]

이 튜토리얼에서는 제대로 아두 이노 프로그램이 작업 사이에 약간의 지연을 추가하는delay()기능을 사용하는 방법을 배울 수 있습니다. 그런 다음delay()을 사용하는 것이 프로그램을 확장 할 때 종종 좋은 생각이 아닌 이유와 그 문제를 해결하는 방법을 발견 할 수 있습니다.

좋아,시작하자!

목차

왜 당신은 당신의 아두 이노 프로그램에 지연이 필요합니까?

음,아두 이노 프로그램이 작동하는 외부 입력/출력에 많이 의존한다.

간단한 예:푸시 버튼의 상태를 초당 100 회 모니터링하거나 0.5 초마다 깜박임을 할 수 있습니다.

이제 어떻게 달성 할 수 있습니까? 아두 이노 프로그램은 다음과 같이 작동합니다:

  • 먼저,setup()함수는 한번 실행된다.
  • 그런 다음loop()기능은 당신이 당신의 아두 이노의 전원을 끌 때까지,또 다시 실행됩니다.

당신이 쓰는 모든 프로그램은 최고 속도로 실행됩니다. 당신이 당신의 코드에서 주도 깜박임을 만드는 경우에 따라서,무슨 일이 일어날 것은 주도(적어도 초당 여러 수천 번)매우 높은 속도로 깜박 것입니다.

당신은 당신의 자신의 프로젝트를 구축하기 위해 아두 이노를 사용하는 방법을 배우고있다?

초보자를위한 아두 이노를 확인하고 단계별로 배운다.이 응용 프로그램은 당신이 당신의 전화 또는 타블렛에서 무선 랜을 제어 할 수 있습니다.아두 이노 지연()기능

여기에 주도 깜박임을 할 수있는 코드입니다(여기에 우리가 선택 내장 주도,외부 주도 추가 할 필요가 없습니다)모든 0.5 초-이것은 당신이 아두 이노로 시작하는 경우 당신이 볼 수있는 가장 일반적인 예 중 하나입니다.

#define LED_PIN 13void setup() { pinMode(LED_PIN, OUTPUT);}void loop() { digitalWrite(LED_PIN, HIGH); delay(500); digitalWrite(LED_PIN, LOW); delay(500);}

이 코드는 어떻게 작동합니까?

먼저”정의”를 사용하여 코드에서 숫자”13″을 여러 번 하드 코딩 할 필요가 없으며 프로그램을 더 읽기 쉽게 만듭니다.

pinMode()기능으로 출력할 핀 모드를 설정합니다.

그런 다음loop()함수에서:

  1. delay(500)을 사용하여 프로그램을 500 밀리초 동안 절전 모드로 전환하거나 0.5 초 동안 절전 모드로 전환하거나delay(500)을 사용하여 프로그램을 0.5 초 동안 다시 절전 모드로 전환하고loop()기능이 계속 실행되기 때문에 1 단계로 돌아갑니다.

delay()함수는 수면에 초가 아닌 밀리 초를 줄 것으로 예상합니다. 그래서,당신은 초에 생각한다면,다음 1000 에 의해 수를 곱하면 당신은 당신이 필요로하는 값을 가지고있다.

1 분 동안 아두 이노 지연 확인

당신이 1 분 동안 아두 이노 잠을 확인하려면,또는 여러 분,그것은 매우 간단합니다.

분 수를 취하여 60 을 곱하여 초 수를 얻은 다음 1000 을 곱하여 밀리 초 수를 얻습니다.

예:delay(3 * 60 * 1000);는 프로그램을 3 분 동안 절전 모드로 만듭니다.아두 이노 지연 마이크로 초()기능

당신이 더 정확하게해야하는 경우에는delayMicroseconds()기능을 사용해야 할 수도 있습니다. delayMicroseconds()를 사용하면 수면에 마이크로 초를 제공 할 수 있습니다. delay()의 최소 지속 시간은 1 밀리 초이므로 400 마이크로 초 동안 만 잠을 자야하는 경우 여기에 새로운 솔루션이 있습니다.

이 기능은 일부 하드웨어 구성 요소와 통신 할 때 매우 유용 할 수 있습니다. 예를 들어,아두 이노는 구성 요소에 일부 데이터를 전송 한 다음 몇 가지 응답을 읽을 필요가있다. 구성 요소가 요청을 처리하고 정확한 데이터를 전달하기 위해 6 마이크로 초가 필요하다고 가정 해 봅시다.

그런 다음 프로그램에서 다음과 같은 것을 가질 수 있습니다:

...void loop() { // send data to component delayMicroseconds(6); // reach out to component again to read data}

비 차단 지연–당신은 지연을 사용하지 않는 이유()

그래서,지금 당신은 아두 이노의 지연이 무엇인지 이해하고,어떻게delay()delayMicroseconds()로 구현하는 것이,의 지연 기능을 사용하는 방법을 살펴 보자–하지만 그 기능없이.

왜?

delay()을 사용하면 프로그램 실행이 중지되고 지연이 완료된 후에 만 다시 시작됩니다.

수행 할 작업이 하나만 있으면 괜찮습니다.: 하나의 주도 깜박임-하지만 당신은 여러 하드웨어 구성 요소를 돌봐 또는 아두 이노 보드 또는 자신의 컴퓨터와 같은 다른 장치와 통신해야하는 경우?

이전 예제를 사용하면 0.5 초마다 하나의 깜박임을,0.8 초마다 다른 하나의 깜박임을 어떻게 만들 수 있습니까?

이 경우 당신은 아주 빨리 붙어있을 것입니다. 여전히delay()을 사용하려는 경우 여러 작업 간에 짧은 지연을 사용하는 솔루션을 찾을 수 있지만 새 작업을 추가할 때마다 프로그램이 더 복잡해집니다.

그 해결책은 단순히delay()기능을 사용하지 않고 시간을 모니터링하고 기본적으로delay()의 동작을 사용하지 않고 재현하는 방법을 찾는 것입니다.

코드 예–지연없이 아두 이노 지연()

delay()을 사용하지 않고 우리의 깜박임 주도 예를 다시 작성하자.

#define LED_PIN 13unsigned int lastTimeLedBlinked = millis();unsigned int delayBetweenBlink = 500;byte ledState = LOW;void setup() { pinMode(LED_PIN, OUTPUT);}void loop() { unsigned int timeNow = millis(); if (timeNow - lastTimeLedBlinked > delayBetweenBlink) { if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite(LED_PIN, ledState); lastTimeLedBlinked = timeNow; }}

이 코드를 한 줄씩 분석해 보겠습니다.

초기화

#define LED_PIN 13unsigned int lastTimeLedBlinked = millis();unsigned int delayBetweenBlink = 500;byte ledState = LOW;

먼저 전역 범위에서 3 개의 변수를 초기화합니다:

  • 마지막으로 깜박거림:이 변수는 마지막으로 깜박거림 시간을 저장하는 데 사용됩니다. 기본적으로,우리가 주도 깜박임을 만들 것입니다 때마다,우리는 현재 시간이 변수를 업데이트합니다–밀리()기능을 사용하여.
  • 지연베트윈블링:이 두 동작 사이에 대기 할 시간입니다.
  • 리드 상태:우리는 우리가 이전 상태가 무엇인지 알 수 있도록 현재의 주도 상태(높음 또는 낮음)를 저장하고 그에 따라 조치를 취할 필요가있다.

왜 글로벌 범위에서? 음,우리가 할 계획은loop()함수에서 해당 변수를 업데이트하고 다음에loop()안에 들어갈 때 다시 액세스하는 것입니다. 우리가loop()안에 변수를 만들 경우,변수는 로컬 변수가 될 것입니다 당신이loop()함수를 종료 할 때 따라서 파괴 될 것이다. 따라서 다음에loop()이 다시 호출되면 모든 값이 손실되고 내부에 이전 값이없는 변수를 다시 만듭니다. 여기서 함수 외부에 변수를 생성함으로써 변수를”생존”하고loop()을 입력 할 때마다 값을 유지할 수 있습니다.

루프 함수에서 아두 이노 지연 기능 구현

자,loop()함수에서 어떤 일이 일어나는지 보자.

void loop() { unsigned int timeNow = millis();

먼저millis()기능으로 현재 시간을 읽습니다.

 if (timeNow - lastTimeLedBlinked > delayBetweenBlink) {

이제 방금 읽은 현재 시간을 이전 시간과 비교합니다. 시간이 충분하면(지연에 저장된 값보다 많음)if()을 입력할 수 있습니다.

이 코드 구조(시간을 읽고 작업을 수행 한 이전 시간과 비교)는delay()함수를 대체하는 방법입니다. 기본적으로 당신은 여기서 기간을 계산하고 있습니다. 그리고 당신이 볼 수 있듯이 그것은 당신의 프로그램이 간단한 응용 프로그램에 대한 더 많은 라인을 포함 의미하지만,그것은 당신에게 더 많은 제어를 제공하고 훨씬 더 확장 성입니다.

그래서,무슨 일이 일어날 것인가? 음,loop()은 최고 속도로 계속 실행됩니다. 매번 프로그램은 충분한 시간이 경과했는지 확인합니다. 그렇지 않으면loop()이 여기서 끝납니다.

그리고 충분한 시간이 지나면if()에 들어갑니다.

액션 실행

 if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite(LED_PIN, ledState);

좋아,방금if()을 입력했으며,이 곳에서 당신이해야 할 일을 할 것입니다.

여기서 우리는 깜박임을 만듭니다. 그리고 우리는 주도권에 대한 이전 상태가 무엇인지 직접 알 수 없기 때문에(loop()을 여러 번 입력하고 내부에서 생성 된 모든 지역 변수를 잃어 버렸기 때문에)전역 변수에서 그 상태를 얻습니다.

이 전역 변수를 사용하여 수행하는 작업은 간단합니다:낮으면 높음으로 설정하고 높으면 낮음으로 설정합니다. 그리고,물론,우리는digitalWrite()로,그에 따라 물리적 주도 상태를 업데이트합니다.

 lastTimeLedBlinked = timeNow; }}

마지막으로,이 슈퍼 중요하다,우리는 우리가 주도 깜박 마지막으로 현재 시간을 절약 할 수 있습니다. 우리가 그렇게하지 않으면if()내부의 조건이 항상 사실이기 때문에 프로그램이 최고 속도로 주도 깜박입니다.

이전 시간을 현재 시간으로 설정하여”타이머를 재설정”합니다.

따라서 이 예에서if()은 500 밀리초 또는 0.5 초마다 입력됩니다.

그리고 지금 이것은 당신의 프로그램이 멈추지 않기 때문에 중대합니다,그래서 당신은 지도한 깜박거리기 위하여 아직도”기다리는”동안 다른 독립적인 활동을 실행하는 것을 계속할 수 있습니다.

2 동작”동시에”

예를 들어,0 마다 깜박이기를 원한다고 가정 해 봅시다.5 초,다른 하나는 0.8 초마다.

#define LED_1_PIN 13#define LED_2_PIN 10unsigned int lastTimeLed1Blinked = millis();unsigned int delayBetweenBlink1 = 500;byte led1State = LOW;unsigned int lastTimeLed2Blinked = millis();unsigned int delayBetweenBlink2 = 800;byte led2State = LOW;void setup() { pinMode(LED_1_PIN, OUTPUT); pinMode(LED_2_PIN, OUTPUT);}void loop() { unsigned int timeNow = millis(); // Action 1 - Blink LED 1 if (timeNow - lastTimeLed1Blinked > delayBetweenBlink1) { if (led1State == LOW) { led1State = HIGH; } else { led1State = LOW; } digitalWrite(LED_1_PIN, led1State); lastTimeLed1Blinked = timeNow; } // Action 2 - Blink LED 2 if (timeNow - lastTimeLed2Blinked > delayBetweenBlink2) { if (led2State == LOW) { led2State = HIGH; } else { led2State = LOW; } digitalWrite(LED_2_PIN, led2State); lastTimeLed2Blinked = timeNow; }}

보시다시피 추가 한 두 번째 작업에 대한 코드 구조를 반복합니다. 그리고 두 행동은 서로를 방해하지 않습니다!

요점을 되풀이

당신은 사용하지 않고 아두 이노 지연을 확인하려면delay():

  1. 특정 작업을 마지막으로 수행한 시간을 저장할 전역 변수를 만듭니다.
  2. 두 작업 사이에 원하는 기간을 저장할 다른 전역 변수를 만듭니다.
  3. loop()함수에서millis()으로 현재 시간을 읽습니다.
  4. 그 직후에 구조를 사용하고(timeNow - lastTimeActionWasExecuted > delayBetweenActions)조건을 사용하십시오.
  5. if()을 입력했으면 작업을 수행합니다.
  6. 와 여전히if()에서 현재 시간을 이전 시간으로 저장합니다.

당신은 당신이 아두 이노 지연을 필요로하는 모든 행동에 대해 그 단계를 반복 할 수 있습니다.

지연()및 지연 마이크로 초()

를 사용하는 것이 괜찮을 때delay()을 사용하는 특정 경우가 있습니다.

그 중 2 개가 있습니다.:

  • 프로그램을 설치하는 동안 구성 요소를 초기화해야 하며 이 구성 요소는 초기화되는 데 약간의 시간이 필요합니다(예:1.5 초). 이 경우setup()함수에서delay(1500)을 사용하면 완벽하게 괜찮습니다. 기본적으로,당신의 아두 이노 프로그램의setup()기능에 어떤delay()문제가되지 않습니다.
  • delayMicroseconds()부분에 설명 된대로 몇 마이크로 초(밀리 초가 아님!)를 기다려야합니다.)외부 구성 요소와 통신 할 때. 작은 숫자(예:10)로delayMicroseconds()를 사용하는 것이 나머지 프로그램을 방해하지 않는다는 것을 알게되면 너무 걱정할 필요없이 여전히 사용할 수 있습니다. 그러나 그것을 일반적인 규칙이 아닌 예외로 간주하십시오.

결론–주의와 아두 이노 지연()를 사용하여

때문에 아두 이노 프로그램의 특성상,당신은 종종 코드에 지연을 추가해야합니다,그래서 당신은 어떤 작업을 실행할 때 선택할 수 있습니다,얼마나 자주 당신이 그들을 실행하려는.

delay()delayMicroseconds()기능은 사용하기 매우 간단한 기능이며,완전한 초보자가 간단한 무언가로 시작할 수 있도록 아두 이노 언어에 추가되었습니다.

그러나이 튜토리얼에서 보았 듯이delay()을 사용하면 정말 빨리 멈출 수 있습니다. 그래서,먼저 아두 이노delay()기능을 직접 사용하지 않고 동일한 동작을 얻기 위해 다음 방법을 사용하는 방법,당신이 그것을 필요로하는 이유를 이해하는 것이 가장 좋습니다.

당신이delay()없애 코드 구조를 이해하면,당신은 당신의 아두 이노 프로그램을 많이 개선 할 수있을 것입니다,멀티 태스킹은 매우 쉽게 될 것입니다.

답글 남기기

이메일 주소는 공개되지 않습니다.