Arduino는 조건에 따라 프로그램의 시작 부분으로 이동합니다. Arduino 루프. 프로그램 텍스트의 조건 및 분기

설계 ~을 위한중괄호로 묶인 명령문 블록을 반복하는 데 사용됩니다. 증분 카운터는 일반적으로 루프를 증분하고 종료하는 데 사용됩니다. 운영자 ~을 위한반복적인 활동에 적합하며 데이터/출력 컬렉션 배열과 함께 자주 사용됩니다.

루프 헤더 ~을 위한세 부분으로 구성됩니다:

~을 위한 (초기화 ; 상태 ; 증가) (루프에서 실행되는 연산자)

초기화는 처음에 한 번만 수행됩니다. 루프에서 매번 조건을 확인하고, 조건이 참이면 명령문 블록과 증분을 실행한 다음 조건을 다시 확인합니다. 조건의 부울 값이 false가 되면 루프가 종료됩니다.

// PWM 핀을 사용하여 LED 밝기 조절 int PWMpin = 10; // 10핀용 470Ω 저항기와 직렬로 연결된 LED void setup() ( // 설정이 필요하지 않음) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

주기 ~을 위한 C는 루프보다 훨씬 유연합니다. ~을 위한 BASIC과 같은 다른 프로그래밍 언어로. 세미콜론이 필요하더라도 세 가지 헤더 요소 중 일부 또는 모두를 생략할 수 있습니다. 또한 루프 초기화, 조건 및 증분 문은 독립 변수가 있는 유효한 C 문일 수 있으며 부동 소수점을 포함한 모든 C 데이터 유형을 사용할 수 있습니다. 이는 주기에 있어서는 특이한 현상입니다. ~을 위한 연산자 유형을 사용하면 일부 비표준 문제에 대한 소프트웨어 솔루션을 제공할 수 있습니다.

예를 들어, 루프 카운터 연산자에서 곱셈을 사용하면 로그 수열을 만들 수 있습니다.

For(int x = 2; x< 100; x = x * 1.5){ println(x); }

생성됨: 2,3,4,6,9,13,19,28,42,63,94

또 다른 예는 한 사이클을 사용하여 LED에 대한 신호 레벨을 부드럽게 줄이거나 늘리는 것입니다. ~을 위한:

무효 루프())( int x = 1; for (int i = 0; i > -1; i = i + x)( AnalogWrite(PWMpin, i); if (i == 255) x = -1; / / 최대 지연에서의 스위칭 제어(10); ) )

설계 ~을 위한중괄호로 묶인 명령문 블록을 반복하는 데 사용됩니다. 증분 카운터는 일반적으로 루프를 증분하고 종료하는 데 사용됩니다. 운영자 ~을 위한반복적인 활동에 적합하며 데이터/출력 컬렉션 배열과 함께 자주 사용됩니다.

루프 헤더 ~을 위한세 부분으로 구성됩니다:

~을 위한 (초기화 ; 상태 ; 증가) (루프에서 실행되는 연산자)

초기화는 처음에 한 번만 수행됩니다. 루프에서 매번 조건을 확인하고, 조건이 참이면 명령문 블록과 증분을 실행한 다음 조건을 다시 확인합니다. 조건의 부울 값이 false가 되면 루프가 종료됩니다.

// PWM 핀을 사용하여 LED 밝기 조절 int PWMpin = 10; // 10핀용 470Ω 저항기와 직렬로 연결된 LED void setup() ( // 설정이 필요하지 않음) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

주기 ~을 위한 C는 루프보다 훨씬 유연합니다. ~을 위한 BASIC과 같은 다른 프로그래밍 언어로. 세미콜론이 필요하더라도 세 가지 헤더 요소 중 일부 또는 모두를 생략할 수 있습니다. 또한 루프 초기화, 조건 및 증분 문은 독립 변수가 있는 유효한 C 문일 수 있으며 부동 소수점을 포함한 모든 C 데이터 유형을 사용할 수 있습니다. 이는 주기에 있어서는 특이한 현상입니다. ~을 위한 연산자 유형을 사용하면 일부 비표준 문제에 대한 소프트웨어 솔루션을 제공할 수 있습니다.

예를 들어, 루프 카운터 연산자에서 곱셈을 사용하면 로그 수열을 만들 수 있습니다.

For(int x = 2; x< 100; x = x * 1.5){ println(x); }

생성됨: 2,3,4,6,9,13,19,28,42,63,94

또 다른 예는 한 사이클을 사용하여 LED에 대한 신호 레벨을 부드럽게 줄이거나 늘리는 것입니다. ~을 위한:

무효 루프() ( int x = 1; for (int i = 0; i > -1; i = i + x)( AnalogWrite(PWMpin, i); if (i == 255) x = -1; // 최대 지연에서의 스위칭 제어(10); ) )

"에서는 "for" 루프를 사용하여 컨트롤러의 작동을 구성하는 방법을 배웠습니다. 이러한 유형의 루프는 모든 곳에서 사용되며 "루핑 작업의 필요성"을 충족하는 것 이상입니다. 그러나 "while"이라는 또 다른 유형의 루프가 있습니다. for 루프보다 나을 것이 없으며 단지 다른 원리를 사용할 뿐입니다.

대부분의 경우 두 가지 유형의 루프 중 사용할 루프를 선택할 수 있습니다. 사용자가 필요한 데이터를 입력할 때까지 프로그램을 일시 중지하기 위해 "while"을 사용했습니다. 이번 강의에서는 Arduino 플랫폼을 예로 들어 이 루프가 어떻게 작동하는지 자세히 살펴보겠습니다.

2개의 LED로 구성된 회로를 계속 작업해 보겠습니다.

또한 14과에서 마무리한 코드로 계속 작업할 것입니다.

과거로 돌아가기: 컨트롤러는 사용자에게 데이터를 요청하고 입력을 기다린 후 결과 값을 변수에 할당합니다. 깜박임번호녹색그리고 깜박임번호빨강. 이를 통해 사용자는 2개의 LED가 깜박이는 횟수를 제어할 수 있습니다.

프로그래머의 세계관을 확장하려면 두 가지 유형의 루프를 사용하여 동일한 작업을 구현하는 방법을 배우는 것이 가치가 있으며 앞으로는 하나 또는 다른 유형에 대한 동정심을 보여줄 수 있습니다.

그것이 어떻게 작동하는지 알아 봅시다 :

정수 = 1 ; // 변수를 선언하고 값 1을 할당합니다.

~하는 동안 (<=10) { //запускаем цикл ~하는 동안

연속물. 인쇄(); //변수의 현재 값을 출력합니다. 직렬 포트를 통해

= +1 // 변수 값을 증가시킵니다.1까지

) // 루프 종료

while 루프는 괄호 안에 설명된 "조건"이 true인 동안 명령을 계속 실행합니다. 위의 예에서 루프는 z가 10보다 작거나 같은 동안 명령을 계속 실행합니다. 루프 본문은 2개의 명령을 실행합니다.

  • 직렬 포트를 통해 변수 값을 출력합니다.
  • 변수의 값을 1씩 늘리는 것(과학적으로는 증분이라고 함)

변수의 값을 증가시키면 프로그램은 결국 루프를 종료합니다. 이 줄을 지정하는 것을 잊어버렸거나 어떤 종류의 오류가 발생했다고 잠시 상상해 본다면 프로그램은 기꺼이 루프에 들어갈 것입니다(즉, 정지될 것입니다).

루프는 조건의 진실성을 확인하는 것으로 작업을 시작합니다. z가 10보다 작거나 같으면 프로그램은 루프를 실행합니다. 그런 다음 상태를 다시 확인합니다. 변수 값이 z = 11에 도달하면 조건은 더 이상 참이 아닙니다. 프로그램은 루프를 실행하지 않고 루프 중괄호 바로 다음 줄로 이동합니다.

이론은 충분하고 실습으로 넘어 갑시다. 소스 코드의 for 루프를 while 루프로 바꿔보겠습니다.

FOR 사이클에 의해 수행되는 플래셔:

for (int i = 1; i<= blinkNumberGreen; i++) // 시작하다 주기~을 위한

{

연속물. 인쇄("녹색으로 깜박임");

Serial.println(i);

digitalWrite(녹색Led, HIGH); //켜다 녹색 발광 다이오드

지연(timeOnGreenLed); //우리는 기다립니다

digitalWrite(녹색Led, LOW); //끄다 녹색 발광 다이오드

지연(timeOffGreenLed); //우리는 기다립니다

}

WHILE 주기의 점멸 장치:

정수 =1; //변수를 선언하고 값 1을 할당합니다.

동안(나는<= blinkNumberGreen)

{ // 시작하다 주기~하는 동안

Serial.print("녹색 깜박임 «);

Serial.println(i);

digitalWrite(녹색Led,HIGH); //켜다 녹색 발광 다이오드

지연(timeOnGreenLed); //우리는 기다립니다

digitalWrite(녹색Led,LOW); //끄다 녹색 발광 다이오드

지연(timeOffGreenLed); //우리는 기다립니다

= +1 //변수 값을 1씩 증가시킵니다.

}

프로그램을 저장하고 컨트롤러에 펌웨어를 로드합니다. 결과를 살펴보겠습니다.

문을 사용하여 루프 ~을 위한그리고 ~하는 동안 Arduino의 기반이 되는 C++ 언어의 가장 중요한 구성 요소 중 하나입니다. 당신이 모르더라도 절대적으로 모든 스케치에서 발견됩니다. 이 기사에서는 루프에 대해 자세히 살펴보고, for와 while의 차이점이 무엇인지, 루프의 도움을 받아 프로그램 작성을 단순화하는 방법, 피해야 할 실수에 대해 알아봅니다.

아직 초보 프로그래머이고 루프가 무엇인지, 왜 필요한지 이해하고 싶다면 자세한 설명이 포함된 이 기사의 다음 섹션을 살펴보세요.

WHILE 연산자는 C++ 및 Arduino에서 동일한 명령을 임의의 횟수만큼 반복하는 데 사용됩니다. FOR 루프에 비해 WHILE 루프는 더 단순해 보입니다. 일반적으로 변수의 반복 횟수를 계산할 필요가 없지만 무언가 변경되거나 일부 이벤트가 발생할 때까지 코드를 반복해야 하는 경우에 일반적으로 사용됩니다.

WHILE 구문

하는 동안(<условие или список условий>)
{
<программный блок, который будет повторяться>
}

부울 값을 반환하는 모든 언어 구성을 조건으로 사용할 수 있습니다. 조건은 비교 연산, 함수, 상수, 변수일 수 있습니다. Arduino의 다른 논리 연산과 마찬가지로 0이 아닌 모든 값은 true, 0 – false로 인식됩니다.

// 무한 루프 while(true)( Serial.println("Waiting..."); ) // checkSignal() 함수의 값이 변경될 때까지 실행되는 루프 while(!checkSignal())( Serial.println ("대기 중..."); )

while 문은 중괄호로 블록을 차단하지 않고 사용할 수 있으며, 이 경우 루프 이후에 발견되는 첫 번째 명령이 반복됩니다. 중괄호 없이는 사용하지 않는 것이 좋습니다. 이 경우 실수하기가 매우 쉽습니다. 예:

While(true) Serial.print("중단을 기다리는 중"); 지연(1000);

이 경우, 지연(1000) 명령이 반복되지 않기 때문에 비문은 일시정지 없이 무한 루프로 표시됩니다. 이러한 오류를 잡는 데 많은 시간을 소비할 수 있습니다. 중괄호를 사용하는 것이 훨씬 쉽습니다.

사용예 while 루프

대부분의 경우 while은 일부 이벤트를 기다리는 데 사용됩니다. 예를 들어 작업을 위한 Serial 개체의 준비 상태입니다.

Serial.begin(9600); while (!Serial) ( ; // 일부 Arduino 보드에서는 직렬 포트가 사용 가능해질 때까지 기다려야 합니다)

UART를 통해 외부 장치에서 캐릭터가 도착할 때까지 기다리는 예:

While(Serial.available())( int byteInput = Seria.read(); // 기타 작업)

이 경우 Serial.available()이 0이 아닌 값을 반환하는 한 값을 읽습니다. 버퍼의 모든 데이터가 소진되면 루프가 중지됩니다.

Arduino의 FOR 루프

FOR 루프에서는 경계 조건을 설정할 수 있을 뿐만 아니라 카운터에 대한 변수를 즉시 정의하고 각 반복에서 해당 값이 어떻게 변경되는지 나타낼 수 있습니다.

FOR 루프 구문

여기서 디자인은 조금 더 복잡해집니다.
~을 위한 (<начальное значение счетчика>;<условие продолжения выполнения цикла>;<изменение значения счетчика на каждом шаге>){
<список_команд>
}

가장 간단한 예:

For(int i=5;i<10;i++){ // Конструкция «3 в одном» pinMode(i, OUTPUT); }

우리는 즉시 변수를 생성하고 초기화했으며, 각 사이클이 끝날 때 카운터 값이 1씩 증가해야 함을 표시했습니다. 그게 전부입니다. 이제 루프 내에서 변수를 사용할 수 있습니다.

가변 단계는 다를 수 있습니다. 예는 다음과 같습니다.

  • for(int i=0; i<10; i=i+2) // Шаг 2
  • for(int i=0; i<10; i+=2) // Аналогичен предыдущему
  • for(int i=10; i>0; i–) // 뒤로 – 10에서 1로

while 루프를 수행

어떤 경우에는 블록의 명령이 적어도 한 번 실행된 다음 검사가 수행되는 방식으로 루프를 구성해야 합니다. 이러한 알고리즘의 경우 do while 구문을 사용할 수 있습니다. 예:

Do ( Serial.println("Working"); ) while (checkSomething());

이 버전의 루프에는 어떤 어려움도 없습니다. 조건을 아래로 두고 블록을 이동했을 뿐이므로 do 연산자 뒤의 중괄호 안의 모든 내용이 첫 번째 검사 전에 실행됩니다.

계속 및 중단 문

조건 확인 블록으로 이동할 때까지 기다리지 않고 루프 블록 내부의 루프 실행을 긴급하게 중단해야 하는 상황이 있습니다. 이렇게 하려면 연산자를 사용할 수 있습니다. 부서지다:

While (true) ( ​​​​if (checkSomething()) ( break; ) )

단순히 현재 반복의 진행을 중지하고 루프를 종료하지 않고 조건 확인 블록으로 이동하려면 연산자를 사용해야 합니다. 계속하다:

While (true) ( ​​​​if (checkSomething()) ( 계속; ) )

continue 및 break 문은 FOR 및 WHILE 루프의 모든 변형과 함께 사용할 수 있습니다.

Arduino의 중첩 루프

루프의 모든 변형은 서로 쉽게 결합되어 중첩된 구조를 만들 수 있습니다. "겹치는" 루프의 블록에 정의된 변수는 내부 루프에서 사용할 수 있습니다. 이러한 종류의 루프의 가장 일반적인 예는 2차원 배열을 순회하는 것입니다. 다음 예에서는 이중 루프를 사용합니다. 첫 번째 루프는 행(변수 i)을 반복하고, 두 번째 중첩 루프는 변수 arr에 정의한 배열의 열(변수 j)을 반복합니다.

내부 도착; void setup() ( for (int i = 0; i< 10; i++) { for (int j = 0; j < 3; j++) { arr[i][j] = i * j; Serial.println(arr[i][j]); } } }

사이클에 대한 추가 정보

루프를 사용해 본 적이 없다면 이론의 세계로 조금 들어가 루프가 무엇인지, 왜 이러한 신비한 언어 구조가 필요한지 알아봅시다.

루프가 필요한 이유는 무엇입니까?

실제로 루프의 주요 작업은 동일한 언어 구성을 여러 번 반복하는 것입니다. 이러한 요구는 거의 모든 프로그램에서 발생하며 확실히 단일 Arduino 스케치는 루프 없이는 할 수 없습니다. loop() 함수는 무한 루프에서도 호출됩니다.

다음 예를 살펴보겠습니다. 아두이노 보드의 핀 5번부터 9번까지 연결된 5개의 LED에 동시에 전원을 공급해야 합니다. 이에 대한 가장 확실한 옵션은 5개의 명령을 연속으로 배치하는 것입니다.

디지털쓰기(5, HIGH);

디지털쓰기(6, HIGH);

디지털쓰기(7, HIGH);

디지털쓰기(8, HIGH);

디지털쓰기(9, HIGH);

그러한 수의 LED를 동시에 포함하면 보드의 전원 회로에 부하가 증가하기 때문에 지금은 그러한 작업의 위험 문제를 무시합시다. 이제 우리에게 가장 중요한 것은 다섯 줄의 코드를 만들었다는 것입니다. 각 코드는 다른 코드와 한 자리만 다릅니다. 이 접근 방식에는 다음과 같은 단점이 있습니다.

  • 변경 사항이 있으면 여러 줄을 동시에 변경해야 합니다. 예를 들어, LED를 핀 2~6으로 전환해야 하거나 전압을 켜는 대신 꺼야 한다면 코드를 5번 변경해야 합니다. 추가 안내나 변경사항이 있으면 어떻게 되나요?
  • 유사한 명령어가 많이 포함된 큰 코드는 읽기 불편하고 불쾌합니다. 다섯 개의 동일한 줄은 그다지 무섭지 않습니다. 그러나 더러운 코드의 습관은 결국 목록에 수십 또는 수백 페이지의 추가 페이지로 이어질 것이며, 이는 귀하와 귀하의 동료 모두를 낙담하게 만들 것입니다.
  • 거의 동일한 명령을 "복사하여 붙여넣는" 과정에서 핀 번호를 변경하는 것을 잊어버리는 등 쉽게 실수할 수 있습니다. digitalWrite(5, HIGH); 디지털쓰기(5, HIGH);
  • 면접관에게 이 코드를 보여주면 일반 소프트웨어 회사의 면접에서 쉽게 실패할 수 있습니다.

이 모든 것에서 우리는 동일한 문자열을 반복해서 재사용하는 것을 거의 항상 피하고 루프로 대체해야 한다는 결론을 내릴 수 있습니다. 더욱이 많은 상황에서 사이클 없이는 불가능하며 어떤 것도 사이클을 대체할 수 없습니다. 프로그램이 실행되는 동안 코드가 반복되는 횟수를 변경할 수 없습니다. 예를 들어, 각 요소를 처리해야 합니다. 데이터 배열, 외부 장치에서 수신됩니다. 데이터가 얼마나 될지, 처리가 몇 번 반복될지 예측할 수 없으므로 기사를 작성할 때 필요한 수의 명령을 삽입할 수 없습니다.

그리고 여기서 사이클이 우리를 도와줍니다.

구문 규칙

Arduino의 루프프로그램 실행 중에 특정 횟수만큼 호출되는 특수 프로그램 블록입니다. 이 블록 내에서는 호출될 명령 자체와 컨트롤러가 명령을 호출해야 하는 횟수를 결정하는 규칙을 설명합니다.

위의 예에서는 컨트롤러에 다음을 알릴 수 있습니다.

명령을 반복하십시오 디지털 쓰기 5번

로봇 프로그래머가 있는 이상적인 세계에서는 아마도 이것으로 충분할 것입니다. 그러나 우리는 C++로 컴퓨터와 대화하고 있으므로 이 문구를 다음 언어로 번역해야 합니다.

명령을 반복하십시오 – 흥미로운 내용이 while 또는 for 루프로 시작될 것임을 컨트롤러에 알리는 특수 명령을 사용해야 합니다.

디지털 쓰기 – 그대로 두되, 한 번만 작성하고 중괄호로 묶어주세요. 핀 번호로 무엇을 할 것인가 - 바로 아래에 있습니다.

5 회 – 이를 위해 카운터를 사용하십시오. 이는 반복할 때마다 증가합니다. 블록의 시작(또는 끝)에서 비교 작업을 사용하여 이 카운터의 값을 한계 값(이 경우 5)과 비교할 수 있습니다.

while 문을 사용하여 "번역된" 루프 명령의 예를 살펴보겠습니다.

정수 카운터 = 0; // 카운터 값을 저장할 변수 // 괄호 안의 조건이 true를 반환할 때까지 중괄호 안의 구성을 반복하도록 프로세서에 요청합니다. // 우리의 경우, counter는 카운터이고, 5는 제한 값이며, 조건은 카운터 값이 5보다 작다는 것입니다. // 하지만 완전히 다른 논리 연산자를 지정할 수 있습니다. while (counter< 5) { digitaWrite(5, HIGH); // Будем включать светодиод counter++; // Увеличиваем значение счетчика } // Дойдя до сюда, исполняющий процессор переместится в начало блока и опять займется проверкой условий. Если условия вернут истину, команды в блоке между { и } выполнятся еще раз. Если условие не выполнится - процессор переместится к концу блока и пойдет дальше. Этот цикл больше его не заинтересует.

주어진 코드에서 오류를 발견한 사람들을 위해 5를 주고 루프 블록을 다르게 작성합니다.

동안(카운터< 5) { // Вот теперь мы будем включать разные светодиоды, с 5 (0+5) по 9 (4+5) digitalWrite(counter + 5, HIGH); counter++; }

FOR 루프를 사용해도 동일한 결과를 얻을 수 있습니다.

For(int 카운터 =0; 카운터<5; counter ++){ digitalWrite(counter+5, HIGH); }

보시다시피, 이 경우 카운터와 함께 필요한 모든 작업을 하나의 FOR 명령에 즉시 배치합니다. 필요한 양을 계산해야 하는 경우 훨씬 더 편리합니다.

이 문서의 관련 섹션에서 루프 사용 규칙에 대한 자세한 정보를 얻을 수 있습니다.

결론

이 기사에서는 Arduino 언어의 매우 중요한 구성인 FOR 및 WHILE 루프를 살펴보았습니다. 루프가 없으면 데이터에 대한 많은 작업이 불가능하기 때문에 거의 모든 복잡한 스케치에서 이러한 연산자를 찾을 수 있습니다. 루프 구문에는 복잡한 것이 없습니다. 쉽게 익숙해지고 프로젝트에서 적극적으로 사용할 수 있습니다.

/ /

운영자용

설계 ~을 위한중괄호로 묶인 명령문 블록을 반복하는 데 사용됩니다. 증분 카운터는 일반적으로 루프를 증분하고 종료하는 데 사용됩니다. 운영자 ~을 위한반복적인 활동에 적합하며 데이터/출력 컬렉션 배열과 함께 자주 사용됩니다.

루프 헤더 ~을 위한세 부분으로 구성됩니다:

~을 위한 (초기화; 상태; 증가) (루프에서 실행되는 연산자)

초기화는 처음에 한 번만 수행됩니다. 루프에서 매번 조건을 확인하고, 조건이 참이면 명령문 블록과 증분을 실행한 다음 조건을 다시 확인합니다. 조건의 부울 값이 false가 되면 루프가 종료됩니다.

// PWM 핀을 사용하여 LED 밝기 조절 int PWMpin = 10; // 10핀용 470Ω 저항기와 직렬로 연결된 LED void setup() ( // 설정이 필요하지 않음) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

주기 ~을 위한 C는 루프보다 훨씬 유연합니다. ~을 위한 BASIC과 같은 다른 프로그래밍 언어로. 세미콜론이 필요하더라도 세 가지 헤더 요소 중 일부 또는 모두를 생략할 수 있습니다. 또한 루프 초기화, 조건 및 증분 문은 독립 변수가 있는 유효한 C 문일 수 있으며 부동 소수점을 포함한 모든 C 데이터 유형을 사용할 수 있습니다. 이는 주기에 있어서는 특이한 현상입니다. ~을 위한연산자 유형을 사용하면 일부 비표준 문제에 대한 소프트웨어 솔루션을 제공할 수 있습니다.

예를 들어, 루프 카운터 연산자에서 곱셈을 사용하면 로그 수열을 만들 수 있습니다.

For(int x = 2; x< 100; x = x * 1.5){ println(x); }

생성됨: 2,3,4,6,9,13,19,28,42,63,94

또 다른 예는 한 사이클을 사용하여 LED에 대한 신호 레벨을 부드럽게 줄이거나 늘리는 것입니다. ~을 위한:

무효 루프())( int x = 1; for (int i = 0; i > -1; i = i + x)( AnalogWrite(PWMpin, i); if (i == 255) x = -1; / / 최대 지연에서의 스위칭 제어(10); ) )