2014-04-15 2 views
10

나는이 루프를 가지고 있는데, 어떻게 루프를 끝낼 수 있습니까? 실제로 그것을 실행하는 코드에 의해 전시로루프 arduino를 중지하는 방법

void loop() { 
     // read the pushbutton input pin: 

     a ++; 
     Serial.println(a); 
     analogWrite(speakerOut, NULL); 

     if(a > 50 && a < 300){ 
     analogWrite(speakerOut, 200); 
     } 

     if(a <= 49){ 
     analogWrite(speakerOut, NULL); 
     } 

     if(a >= 300 && a <= 2499){ 
      analogWrite(speakerOut, NULL); 
     } 

답변

8

아두 이노는 특히 해당 loop 기능을 종료하는 전혀 방법을 제공합니다 :

setup(); 

for (;;) { 
    loop(); 
    if (serialEventRun) serialEventRun(); 
} 

게다가, 마이크로 컨트롤러에에에 종료 거기에 아무것도 아니다 첫 번째 장소.

가장 가까운 작업은 프로세서를 중지하는 것입니다. 리셋 될 때까지 처리가 중지됩니다.

+11

프로세서를 어떻게 중단합니까? – Brent

+1

@Brent : 인터럽트를 비활성화하고 프로세서를 절전 상태로 전환합니다. 무한 루프로 감싸서 실행을 계속할 수 있습니다. –

+0

"return"은 그렇게 할 것이라고 생각합니다. –

8

Matti Virkkunen 이렇게 말하면 루프를 멈출 수있는 "괜찮은"방법은 없습니다. 그럼에도 불구하고, 당신의 코드를보고 여러 가정을함으로써, 나는 당신이 주어진 주파수로 신호를 출력하려한다고 상상하지만, 그것을 멈출 수 있기를 원한다. 그런 경우

는 몇 가지 솔루션이 있습니다 :

  1. 당신이이 경우

    int speakerOut = A0; 
    int buttonPin = 13; 
    
    void setup() { 
        pinMode(speakerOut, OUTPUT); 
        pinMode(buttonPin, INPUT_PULLUP); 
    } 
    
    int a = 0; 
    
    void loop() { 
        if(digitalRead(buttonPin) == LOW) { 
         a ++; 
         Serial.println(a); 
         analogWrite(speakerOut, NULL); 
    
         if(a > 50 && a < 300) { 
          analogWrite(speakerOut, 200); 
         } 
    
         if(a <= 49) { 
          analogWrite(speakerOut, NULL); 
         } 
    
         if(a >= 300 && a <= 2499) { 
          analogWrite(speakerOut, NULL); 
         } 
        } 
    } 
    

    을 다음 당신이 할 수있는 버튼의 입력에 신호를 생성 할 경우 우리 단추 핀을 INPUT_PULLUP으로 사용하고 있습니다. 이 항목에 대한 자세한 내용은 Arduino reference을 참조하십시오. 간단히 말해서이 구성은 내부 풀업 저항을 설정합니다.이 방법으로 외부 저항이 필요없이 버튼을 접지에 연결할 수 있습니다. 참고 : 버튼의 레벨이 반전되어 LOW이 누락되고 HIGH이 릴리스됩니다.

  2. 다른 옵션은 내장 하드웨어 타이머 중 하나를 사용하여 주기적으로 중단이라는 함수를 얻습니다. 나는 깊이 들어가지 않을 것이다 here는 그것의 인 무슨의 중대한 묘사 및 그것을 사용하는 방법이다.

+0

와우, 정보는 tganks. Il은 참고 문헌을 읽고 이것을 시도합니다. – Beep

3

마음에 와서 세 가지 옵션 :이 옵션은 한 번 코드를 실행 while(true)

void loop(){ 
    //the code you want to run once here, 
    //e.g., If (blah == blah)...etc. 

    while(1)  //last line of main loop 
} 

동등하게 좋은 while(1) ... 나에

1) 끝 void loop() ... 그리고 그런 다음 Ard를 으로 끝없는 "보이지 않는"루프로 시작합니다. 아마도 에가는 가장 좋은 방법은 아니지만, 외관상으로는 끝내게됩니다.
Ard는 에서 끝없는 원을 그리며 전류를 계속 끌어 올 것입니다 ... 아마도 타이머의 종류를 설정할 수 있습니다. 많은 시간이 지나면 Ard가 잠자기 상태가됩니다. 분 등등 루핑 ... 그냥 생각 ... 저기에 확실히 다양한 수면 라이브러리가 있습니다 ... 자세한 내용은 예 : Monk, Programming Arduino : 다음 단계, 페이지 85-100 을 참조하십시오.

두 번째) 조건부 컨트롤 구조를 사용하여 두 번째 패스에서 초기 테스트가 실패하는 "메인 루프 중지"함수를 만듭니다.
이것은 종종 전역 변수를 선언하고 "주 루프 중지"기능을 사용하면 종료시 변수 의 값을 토글해야합니다. 예 :

boolean stop_it = false;   //global variable 

void setup(){ 
    Serial.begin(9600); 
    //blah... 
} 

boolean stop_main_loop(){  //fancy stop main loop function 

    if(stop_it == false){ //which it will be the first time through 

     Serial.println("This should print once."); 

     //then do some more blah....you can locate all the 
     // code you want to run once here....eventually end by 
     //toggling the "stop_it" variable ... 
    } 
    stop_it = true; //...like this 
    return stop_it; //then send this newly updated "stop_it" value 
        // outside the function 
} 

void loop{ 

    stop_it = stop_main_loop();  //and finally catch that updated 
            //value and store it in the global stop_it 
            //variable, effectively 
            //halting the loop ... 
} 

허용되는 경우 매우 좋지 않을 수도 있지만 작동합니다.
Ard를 다른 보이지 않는 "보이지 않는"루프로 시작하지만이 번 if(stop_it == false) 상태를 반복적으로 확인하는 경우가 발생합니다. stop_main_loop() 처음에는 처음부터 매번 통과하지 못합니다.

3rd) 다시 한 번 전역 변수를 사용할 수 있지만 멋진 "stop main loop"기능 대신 간단한 if (test == blah){} 구조를 사용할 수 있습니다.

boolean start = true;     //global variable 

void setup(){ 

     Serial.begin(9600); 
} 

void loop(){ 

     if(start == true){   //which it will be the first time through 



      Serial.println("This should print once.");  

      //the code you want to run once here, 
      //e.g., more If (blah == blah)...etc. 

    } 

start = false;    //toggle value of global "start" variable 
           //Next time around, the if test is sure to fail. 
} 

확실히 무한 메인 루프 하지만이 세 가지뿐만 아니라 이미 시작 가야 언급 한 것과 같은를 성가신 "중지"할 수있는 다른 방법이 있습니다.

30

이것은 Arduino.cc에 게시되지 않았지만 실제로는 루프 루틴을 간단한 exit (0)로 종료 할 수 있습니다.

이것은 보드 목록에있는 거의 모든 보드에서 컴파일됩니다. IDE 1.0.6을 사용하고 있습니다. 나는

void loop() { 
// All of your code here 

/* Note you should clean up any of your I/O here as on exit, 
all 'ON'outputs remain HIGH */ 

// Exit the loop 
exit(0); //The 0 is required to prevent compile error. 
} 

나는이 프로젝트에 이것을 사용 우노, 메가, 프로 마이크로 심지어 그리고 Adafruit 악세사리와 함께 테스트 한 곳 리셋 핀에 버튼에서 I 와이어. 기본적으로 루프는 exit (0)까지 실행됩니다. 그런 다음 마지막 상태에서만 지속됩니다. 내 아이들을위한 로봇을 만들었고, 버튼을 누를 때마다 (다시 설정) 코드가 loop() 함수의 시작에서 시작됩니다.

+0

나는 이것도 사용했습니다. 왜 더 일반적으로 사용/사용되지 않는 이유는 무엇입니까? – sscirrus

+1

이것은 C 라이브러리의 프로세서 정지 방법이며, 위의 주석에서 제안한 것과 정확히 같은 작업을 수행하여 디스 어셈블리로 판단합니다. 즉, 인터럽트를 비활성화하고 무한 루프로 진행합니다. 전원을 보존하기 위해 프로세서를 지원하는 경우 프로세서를 절전 상태로 두는 것도 좋습니다. (C++ 코드에서 exit (0)은 종료 전에 전역 소멸자를 실행할 수도 있습니다). @Beep 허용 된 대답이어야합니다. –

+1

esp8266에서 작동하지 않습니다. 컴파일러 오류. '함수 '루프'에서 : 'exit'에 대한 정의되지 않은 참조 ' –

관련 문제