hoe een lus arduino te stoppen

Ik heb deze lus, hoe kan ik de lus beëindigen?

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);
      }

Antwoord 1, autoriteit 100%

Arduino biedt absoluut geen manier om hun loop-functie te verlaten, zoals blijkt uit de code die het daadwerkelijk uitvoert:

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

Bovendien is er op een microcontroller niets om naar toe te gaan.

Het beste wat u kunt doen, is de processor gewoon stoppen. Dat stopt met verwerken totdat het is gereset.


Antwoord 2, autoriteit 92%

Dit is niet gepubliceerd op Arduino.cc, maar je kunt de loop-routine in feite verlaten met een simpele exit(0);

Dit compileert op vrijwel elk bord dat je in je bordlijst hebt staan. Ik gebruik IDE 1.0.6. Ik heb het getest met Uno, Mega, Micro Pro en zelfs de Adafruit Trinket

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.
}

Ik gebruik dit in projecten waarbij ik in een knop aan de reset-pin ga. Eigenlijk loopt je lus tot afslag (0); en blijft dan gewoon in de laatste staat. Ik heb een paar robots gemaakt voor mijn kinderen en elke keer op een knop (reset) begint de code vanaf het begin van de functie Loop ().


Antwoord 3, Autoriteit 69%

Matti Virkkunen zei het goed, er is geen “fatsoenlijke” manier om de lus te stoppen. Niettemin, door naar uw code te kijken en verschillende aannames te maken, stel ik me voor dat u probeert een signaal met een gegeven frequentie uit te voeren, maar u wilt het kunnen stoppen.

Als dat het geval is, zijn er verschillende oplossingen:

  1. Als u het signaal wilt genereren met de invoer van een knop, kunt u het volgende doen

    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);
            }
        }
    }
    

    In dit geval gebruiken we een knop PIN als een INPUT_PULLUP. U kunt de Arduino Reference voor meer informatie over dit onderwerp, maar in een notendop deze configuratiesets in een notendop, maar in een notendop deze configuratiesets Een interne pulrupweerstand, op deze manier kunt u gewoon uw knop aangesloten op de grond, zonder externe weerstanden behoefte.
    Opmerking : Hiermee wordt de niveaus van de knop invert, LOWwordt ingedrukt en HIGHwordt vrijgegeven.

  2. De andere optie zou een van de ingebouwde hardwaretimers gebruiken om een ​​functie periodiek met onderbrekingen met de naam te krijgen. Ik zal niet in de diepte gaan zijn hier ‘sa grote beschrijving van wat het is en hoe gebruik het.


Antwoord 4, Autoriteit 31%

De drie opties die bij de geest komen:

1e) einde void loop()met while(1)… of even zo goed … 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
}

Met deze optie wordt uw code eenmaal uitgevoerd en schopt dan de ARD in
een eindeloze “onzichtbare” lus. Misschien niet de leukste manier om
Ga, maar zover buiten verschijningen, wordt het werk gedaan.
De ARD zal de stroom blijven tekenen terwijl het zich in spint
Een eindeloze cirkel … Misschien kan men een soort timer opzetten
functie die de ARD neerzet om na zoveel seconden te slapen,
minuten, enz., Van Looping … Gewoon een gedachte … er zijn zeker
Verschillende slaapbibliotheken die er zijn … zien
b.v., monnik, programmeren Arduino: volgende stappen, pgs., 85-100
voor verdere discussie over dergelijke.

2nd) Maak een “stop hoofdlus” -functie met een voorwaardelijke controle
Structuur die zijn eerste test maakt faalt op een tweede pas.
Dit vereist vaak een globale variabele en het hebben van de
“Stop Main Loop” -functie Schakel de waarde van de variabele in
bij beëindiging. B.v.,

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  ...
}

Dit is misschien niet bijzonder mooi, maar het werkt ook.
Het schopt de ARD in een andere eindeloze “onzichtbare” lus, maar dit
Tijd is het een geval van herhaaldelijk controleren van de if(stop_it == false)CONDITION IN stop_main_loop()
wat natuurlijk niet elke keer na het eerste keer doorbreekt.

3e) men zou opnieuw een globale variabele kunnen gebruiken, maar gebruik een eenvoudige if (test == blah){}structuur in plaats van een mooie “stop hoofdlus” -functie.

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.
}

Er zijn zeker andere manieren om die vervelende eindeloze hoofdlus te ‘stoppen’
maar deze drie en de reeds genoemde zouden u op weg moeten helpen.


Antwoord 5, autoriteit 15%

Hiermee worden onderbrekingen uitgeschakeld en wordt de CPU in (permanente tot reset/aan-uitschakeling) slaapstand gebracht:

cli();
sleep_enable();
sleep_cpu();

Zie ook http ://arduino.land/FAQ/content/7/47/en/how-to-stop-an-arduino-sketch.html, voor meer details.


Antwoord 6

gebruik deze regel om de functie te verlaten:

return;

Other episodes