wake-up-neo.com

wie man einen schleifenarduino stoppt

Ich habe diese Schleife, wie würde ich die Schleife beenden? 

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

Arduino bietet ausdrücklich keine Möglichkeit, die loop-Funktion zu beenden, wie der Code zeigt, mit dem sie tatsächlich ausgeführt wird:

setup();

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

Außerdem gibt es an einem Mikrocontroller überhaupt nichts, worauf man verlassen muss.

Am nächsten können Sie den Prozessor nur anhalten. Dadurch wird die Verarbeitung angehalten, bis sie zurückgesetzt wird.

8
Matti Virkkunen

Dies wird nicht in Arduino.cc veröffentlicht, aber Sie können die Schleifenroutine tatsächlich mit einem einfachen Exit (0) beenden. 

Dies wird auf so ziemlich jedem Board kompiliert, das Sie in Ihrer Boardliste haben. Ich verwende IDE 1.0.6. Ich habe es mit Uno, Mega, Micro Pro und sogar dem Adafruit Schmuckstück getestet

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

Ich verwende dies in Projekten, bei denen ich einen Knopf an den Reset-Pin verdrahte. Grundsätzlich läuft Ihre Schleife bis exit (0); und bleibt dann nur im letzten Zustand bestehen. Ich habe ein paar Roboter für meine Kinder gemacht, und bei jedem Tastendruck (Reset) beginnt der Code mit dem Start der Funktion loop ().

36
Zoul007

Matti Virkkunen sagte es richtig, es gibt keine "anständige" Möglichkeit, die Schleife zu stoppen. Wenn Sie sich jedoch Ihren Code ansehen und verschiedene Annahmen treffen, kann ich mir vorstellen, dass Sie versuchen, ein Signal mit einer bestimmten Frequenz auszugeben, aber Sie möchten es stoppen können.

In diesem Fall gibt es mehrere Lösungen:

  1. Wenn Sie das Signal mit der Eingabe einer Taste erzeugen möchten, können Sie Folgendes tun

    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 diesem Fall verwenden wir einen Button-Pin als INPUT_PULLUP. Weitere Informationen zu diesem Thema finden Sie in der Arduino-Referenz . Kurz gesagt, diese Konfiguration stellt einen internen Pullup-Widerstand ein. Auf diese Weise können Sie Ihren Knopf einfach an Masse anschließen, ohne dass externe Widerstände erforderlich sind. Note: Dadurch werden die Pegel der Schaltfläche invertiert, LOW wird gedrückt und HIGH wird freigegeben.

  2. Die andere Option wäre die Verwendung eines der integrierten Hardware-Timer, um eine Funktion zu erhalten, die regelmäßig mit Unterbrechungen aufgerufen wird. Ich werde nicht in die Tiefe gehen, da hier eine großartige Beschreibung dessen ist, was es ist und wie man es benutzt.

8

Die drei Optionen, die mir einfallen, sind:

1.) Ende void loop() mit while(1)... oder gleichermaßen gut ... 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
}

Diese Option führt Ihren Code einmal aus und führt die Ard in eine endlose "unsichtbare" Schleife. Vielleicht nicht der schönste Weg, um zu gehen, aber soweit es äußerlich aussieht, wird die Arbeit erledigt.
Die Ard wird weiterhin Strom ziehen, während sie sich in .__ dreht. ein endloser Kreis ... vielleicht könnte man eine Art Timer einrichten Funktion, die die Ard nach so vielen Sekunden in den Ruhezustand versetzt, Minuten, usw., schleifen ... nur ein Gedanke ... da gibt es sicherlich verschiedene Schlafbibliotheken , Monk, Programmieren von Arduino: Nächste Schritte, S. 85-100.

2nd) Erstellen Sie eine "stop main loop" -Funktion mit einer bedingten Kontrollstruktur .__, die dazu führt, dass der erste Test beim zweiten Durchlauf fehlschlägt.
Dies erfordert häufig das Deklarieren einer globalen Variablen und das Vorhandensein der Die Funktion "stop main loop" schaltet den Wert der Variablen .__ nach Beendigung um. Z.B.,

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

Zugegeben, das ist vielleicht nicht besonders hübsch, aber es funktioniert auch.
Es führt die Ard in eine weitere endlose "unsichtbare" Schleife, aber diesmal müssen die Bedingungen von if(stop_it == false) in stop_main_loop() .__ wiederholt überprüft werden. was natürlich nicht jedes Mal nach dem ersten Durchlauf durchläuft. 

3.) Man könnte wieder eine globale Variable verwenden, aber eine einfache if (test == blah){}-Struktur anstelle einer fantastischen "stop main loop" -Funktion verwenden.

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

Es gibt sicherlich andere Wege, um diese nervige Endlosschleife zu "stoppen", aber diese drei sowie die bereits erwähnten sollten Ihnen den Einstieg erleichtern.

3
philomech

Dadurch werden die Interrupts deaktiviert und die CPU in den Ruhezustand versetzt (dauerhaft bis zum Zurücksetzen/Umschalten).

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

Siehe auch http://arduino.land/FAQ/content/7/47/de/how-to-stop-an-arduino-sketch.html , für weitere Einzelheiten.

2
Sigivald
> #include <SPI.h>
> #include <MFRC522.h>
> #include <Ethernet.h>
> 
> #define RST_PIN 4
> #define SS_PIN 2
> 
> String content="";
> 
> byte mac[]={0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; IPAddress
> ip(192,168,3,15);
> 
> MFRC522 mfrc522(SS_PIN, RST_PIN); EthernetClient client;
> 
> void setup() {   Serial.begin(9600);                                  
> SPI.begin();   while(!Serial){;}   Ethernet.begin(mac, ip);           
> mfrc522.PCD_Init();             
>                                     //Serial.println(F("Silahkan Scan Kartu RFID Anda:")); }
> 
> void loop() {   rfid();   database(); }
> 
> void rfid(){   //membaca kartu RFID   if ( !
> mfrc522.PICC_IsNewCardPresent())    {
>     return;   }   // memilih salah satu card yang terdeteksi   if ( ! mfrc522.PICC_ReadCardSerial())    {
>     return;   }
>      //Serial.print("Kartu Anda Adalah :");   //String content= "";   //byte letter;   //for (byte i = 0; i < mfrc522.uid.size; i++) {
>      //Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
>      //Serial.print(mfrc522.uid.uidByte[i], HEX);
>      //content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
>      //content.concat(String(mfrc522.uid.uidByte[i], HEX));   //}   //Serial.println();   //delay(1000); //change value if you want to
> read cards faster
> 
>   //mfrc522.PICC_HaltA();   //mfrc522.PCD_StopCrypto1(); }
> 
> void database(){   EthernetClient client;   rfid();   if
> (client.connect("192.168.3.12", 80)){
>     Serial.print("Kartu Anda Adalah :"); 
>     String content="";
>     byte letter;
>     for (byte i = 0; i < mfrc522.uid.size; i++) {
>      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
>      Serial.print(mfrc522.uid.uidByte[i], HEX);
>      content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
>      content.concat(String(mfrc522.uid.uidByte[i], HEX));   }   Serial.println();   delay(1000); //change value if you want to read
> cards faster   mfrc522.PICC_HaltA();   mfrc522.PCD_StopCrypto1();
>     
>     //Serial.println("connected");
>     Serial.print(content);
>     client.println("POST /gerbang2/insert.php HTTP/1.1");
>     client.println("Host: 192,168,3,12"); 
>     client.println("Connection: close");
>     client.print("Content-Type: application/x-www-form-urlencoded\n");
>     client.print("Content-Length: "); 
>     client.print(content.length());
>     client.print("\n\n");
>     client.print(content);
>     Serial.println(content);
>     delay (1000);
>     client.stop();     }   else{
>     Serial.println("Connection Failed.");  
>     Serial.println();
>     delay (1000);   } }

wie kann ich die Schleife im seriellen Monitor stoppen?

0
한룻디