6 Domanda: come fermare un loop arduino

domanda creata a Tue, Apr 15, 2014 12:00 AM

Ho questo ciclo, come concluderei il ciclo?

 
 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
6 risposte                              6                         

Arduino non fornisce assolutamente alcun modo per uscire dalla loro funzione loop, come mostrato dal codice che lo esegue effettivamente:

 
setup();

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

Inoltre, su un microcontrollore non c'è nulla da cui uscire in primo luogo.

Il più vicino che puoi fare è fermare il processore. Ciò interromperà l'elaborazione fino al suo ripristino.

    
8
2014-04-15 23: 41: 42Z
  1. Come si ferma il processore?
    2015-05-31 20: 08: 34Z
  2. @ Brent: disabilitando gli interrupt e mettendo il processore in uno stato di sospensione. Puoi avvolgerlo in un ciclo infinito per essere più sicuro che l'esecuzione non continui mai.
    2015-06-01 15: 12: 46Z
  3. Penso che "return" lo farà
    2016-03-19 21: 04: 01Z
  4. @ MohamedElShenawy: Questo ritornerebbe dalla chiamata alla funzione "loop" e tornerà al ciclo for in main ().
    2016-03-20 21: 33: 56Z

Questo non è pubblicato su Arduino.cc ma puoi in effetti uscire dalla routine del ciclo con una semplice exit (0);

Questo compilerà praticamente tutte le board che hai nella tua board list. Sto usando IDE 1.0.6. L'ho provato con Uno, Mega, Micro Pro e persino il Trinket di Adafruit

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

Lo uso nei progetti in cui collego un pulsante al pin di ripristino. Fondamentalmente il tuo ciclo viene eseguito fino all'uscita (0); e poi persiste solo nell'ultimo stato. Ho creato alcuni robot per i miei figli e ogni volta che si preme un pulsante (ripristina) il codice inizia dall'inizio della funzione loop ().

    
37
2015-01-08 04: 23: 05Z
  1. Ho usato anche questo. Perché questo non è più comunemente conosciuto /usato?
    2015-06-22 20: 06: 28Z
  2. Questo sarebbe il modo corretto di libreria C per arrestare il processore e, a giudicare dallo smontaggio, fa esattamente quello che ho suggerito in un commento sopra, cioè disattiva gli interrupt e va in un ciclo infinito. Sarebbe anche meglio mettere il processore in uno stato di sospensione se lo supporta, per risparmiare energia. (Si noti che in C ++, il codice exit (0) potrebbe anche eseguire distruttori globali prima di spegnersi). @Beep Questa dovrebbe essere la risposta accettata.
    2016-02-17 10: 56: 54Z
  3. Non funziona con esp8266. Errore del compilatore. In function 'loop': undefined reference to 'exit'
    2016-08-08 17: 32: 10Z
  4. Su ESP8266 Sto usando ESP.deepSleep (secondi * 1000000, WAKE_RF_DISABLED); Non si sveglia nemmeno in 30 secondi se GPIO16 non è legato a RST.
    2017-03-01 15: 18: 32Z
  5. questo ha funzionato per me
    2017-06-08 04: 22: 54Z

Matti Virkkunen ha detto bene, non c'è un modo" decente "di fermare il ciclo. Tuttavia, osservando il tuo codice e facendo diverse ipotesi, immagino tu stia cercando di emettere un segnale con una determinata frequenza, ma tu vuoi essere in grado di fermarlo.

Se questo è il caso, ci sono diverse soluzioni:

  1. Se vuoi generare il segnale con l'input di un pulsante, puoi fare quanto segue

     
    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 questo caso utilizziamo un pin del pulsante come INPUT_PULLUP. Puoi leggere il riferimento Arduino per ulteriori informazioni su questo argomento, ma in poche parole questa configurazione imposta un resistore di pullup interno, in questo modo puoi semplicemente collegare il tuo pulsante a terra, senza bisogno di resistori esterni. Nota ​​strong>: invertirà i livelli del pulsante, verrà premuto LOW e verrà rilasciato HIGH.

  2. L'altra opzione utilizza uno dei timer hardware integrati per ottenere una funzione chiamata periodicamente con interruzioni. Non approfondirò qui 'un'ottima descrizione di cosa sia e come usalo.

8
2017-05-23 11: 55: 10Z
  1. wow, tganks per l'informazione. Leggi i riferimenti e prova questo.
    2014-04-16 12: 30: 23Z

Le tre opzioni che ti vengono in mente:

1 °) Fine void loop() con while(1) ... o altrettanto buono ... 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
}

Questa opzione esegue il tuo codice una volta e poi calcia l'Ard in un ciclo infinito "invisibile". Forse non è il modo più bello per farlo vai, ma fino alle apparenze esterne, fa il lavoro.
L'Ard continuerà ad attirare corrente mentre si gira  un cerchio infinito ... forse si potrebbe impostare una sorta di timer  funzione che mette l'Ard a dormire dopo tanti secondi, minuti, ecc., di looping ... solo un pensiero ... ci sono certamente varie librerie del sonno là fuori ... vedi ad es. Monk, Programmazione di Arduino: Passaggi successivi, pagine 85-100 per ulteriori discussioni su questo.

2nd) Crea una funzione "stop loop principale" con un controllo condizionale struttura che fa fallire il test iniziale in un secondo passaggio.
Questo spesso richiede la dichiarazione di una variabile globale e l'avere il  La funzione "stop main loop" commuta il valore della variabile alla fine. Per es.,

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

Certo, potrebbe non essere particolarmente carino, ma funziona anche.
Calcia l'Ard in un altro ciclo infinito "invisibile", ma questo volta è il caso di verificare ripetutamente la condizione if(stop_it == false) in stop_main_loop()  che naturalmente non riesce a passare ogni volta dopo la prima volta.

3) Si potrebbe ancora una volta usare una variabile globale, ma usare una semplice struttura if (test == blah){} invece di una funzione "stop main loop" di fantasia.

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

Ci sono sicuramente altri modi per "fermare" quel fastidioso ciclo principale senza fine ma questi tre e quelli già menzionati dovrebbero farti iniziare.

    
3
2014-06-23 22: 32: 31Z

Questo spegnerà gli interrupt e metterà la CPU in (permanente fino al reset /accensione alternata) sleep:

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

Vedi anche http : //arduino.land/FAQ/content/7/47/en/how-to-stop-an-arduino-sketch.html , per ulteriori dettagli.

    
2
2017-05-20 19: 08: 42Z
  1. controlla questo URL , ti sarà utile per aiutarti ad aumentare il tuo qualità dei contenuti
    2016-05-02 23: 12: 11Z
 
> #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);   } }

come fermare il ciclonel monitor seriale?

    
0
2018-04-30 01: 45: 24Z
fonte posta Qui
Altre domande
6
come fermare un loop arduino
chiesto 5 anni fa