Skip to Content

Cómo detener un programa en ejecución en Arduino

Cómo detener un programa en ejecución en Arduino

In this tutorial, you will learn how to stop a running Arduino program and why you need the Arduino reset. If you are just starting with Arduino programming, also have a look at our tutorial on How Easy Is It To Learn Arduino.

Componentes de hardware

Arduino Uno Rev3x1Amazon
Arduino Mega (opcional)x1Amazon
LEDx1Amazon
Resistencia de 220Ω x1Amazon
Cable USB tipo A/Bx1Amazon

Software

Arduino IDEArduino IDE

Makerguides.com is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn advertising fees by advertising and linking to products on Amazon.com. As an Amazon Associate we earn from qualifying purchases.

¿Por qué es necesario detener un programa Arduino?

El propósito de detener un programa Arduino podría ser detener un programa Arduino de la construcción de nuevos proyectos, detener bucles molestos, o corregir un error en su código.

En mi experiencia, encuentro que los bucles pueden ejecutarse eternamente porque el programador olvidó incluir una condición de salida, o su código tiene un error que impide que el bucle termine.

Como resultado, puede ser difícil escapar del bucle si no se detiene el programa en su totalidad.

¿Cómo puedo detener el funcionamiento de mi Arduino?

Un programa Arduino puede detenerse mediante hardware o software:

1. Uso del hardware

Detener un programa utilizando el hardware es quizás la opción más sencilla y rápida, y tienes 2 opciones principales:

1) ¿Cómo puedo arrancar y parar Arduino de forma segura?

Arduino Uno puede desenchufarse de la corriente en cualquier momento. Al enchufar o reconectar la alimentación, el Hardware se iniciará tal cual, sin pérdida de datos.

De este modo, podrá poner en marcha y detener su placa Arduino sin ninguna duda.

2) Reiniciar el Arduino a través del botón

El programa de Arduino se detendrá al pulsar el botón RESET. Después de reiniciar la placa Arduino, todas las variables pueden definir e inicializar los periféricos, y el resto del código se ejecuta tal cual.

Reiniciar el Arduino a través del botón
Reset Button

Con los métodos de hardware, puede detener el programa de Arduino manualmente, y éste volverá a ejecutar el programa principal después de encenderlo.

Por lo tanto, si hay algún bucle infinito innecesario en su código, entonces de nuevo, el programa se quedará atascado en ese bucle infinito, y los métodos de hardware no son adecuados para tal problema.

2. Uso del software

Para superar la limitación de los métodos de hardware, también se puede detener un programa que se ejecuta en Arduino utilizando el software, lo que puede ser necesario hacer si su programa está atascado en un bucle.

¿Cuál es el propósito de un bucle Arduino en primer lugar?

Un bucle de Arduino realiza tareas muy repetitivas por ti de forma rápida, lo cual es muy útil. Este bucle puede ahorrarte tiempo y esfuerzo.

El IDE de Arduino utiliza el bucle por defecto, que es el bucle void. Es necesario incluirlo en el código.

Código Arduino con bucle para tareas repetitivas

int counter=10;

void setup(){
  Serial.begin(9600);
  Serial.println("Start the counter");
}

void loop() {
  Serial.print("Counter: ");
  Serial.println(counter);
  counter++;    
  delay(1000);   
}

Cómo funciona el código

Paso 1:

 int contador=10;

En primer lugar, declaro e inicializo el contador.

Paso 2:

void setup() {
   Serial.begin(9600);
   Serial.println("Start the counter");
 }

En la función setup(), inicializa el terminal serie a una velocidad de 9600 baudios.

Paso 3:

void loop() {
  Serial.print("Counter: ");
  Serial.println(counter);
  counter++;  
  delay(1000); 
}

En la función void loop(), el contador se incrementa de uno en uno y se actualiza después de un segundo.

Además, imprime un mensaje en el terminal de serie.

Salida en el terminal de serie

Salida en el terminal de serie

Este valor del contador se actualiza constantemente. Pero, en algunos casos, se requiere un valor menor; es imposible controlar este bucle en esta situación.

¿Cómo se detiene un bucle en Arduino?

1. ¿Existe una función de parada en el Arduino?

Arduino IDE tiene una función exit(); para detener los bucles.

Código Arduino con la función exit() para detener los bucles
int counter=10;

void setup(){
  Serial.begin(9600);
  Serial.println("Start the counter");
}

void loop() {
  Serial.print("Counter: ");
  Serial.println(counter);
  counter++;
  delay(1000);
  exit(0); 
}

Cómo funciona la función exit()

Aquí, en el código anterior, he utilizado la función exit() para salir del bucle.

Salida en el terminal de serie

Salida en el terminal de serie

2. Detener el bucle vacío() utilizando el bucle infinito

Hay tres maneras diferentes de utilizar un bucle infinito en su función void():

1. Using for ( ; ; ) { /* empty */ }

2. Usando while (1) { /* empty */ }

3. Usando while(true) { /* empty */ }

Código Arduino para detener el bucle con infinito for o while loop
int counter=10;

void setup(){
  Serial.begin(9600);
  Serial.println("Start the counter");
}

void loop() {
  Serial.print("Counter: ");
  Serial.println(counter);
  counter++; 
  delay(1000);
   
  for(; 😉 {
    /*Empty*/  
  }
}
Cómo funciona el código del bucle For o While infinito

Paso 1:

int contador=10;

En primer lugar, declara la variable y la inicializa con 10.

Paso 2:

void setup() {
  Serial.begin(9600);
   Serial.println("Start the counter");
 }

En la función setup(), inicializa el terminal serie.

void loop() {
  Serial.print("Counter: ");
  Serial.println(counter);
  counter++; 
  delay(1000);
   
  for(; 😉 {
    /*Empty*/  
  }
}

En la función void loop(), inicia el contador. E imprime un mensaje en el terminal serie.

After  for ( ; ; ) {  /* empty */ }  using break the loop.

Al igual que el bucle for, se puede utilizar el bucle while (1) { /* empty */ } y while (true) { /* empty */ }

Utilice el bucle while (1) { /* empty */ } y while (true) { /* empty */ } en lugar del bucle 

for ( ; ; ) {  /* empty */ } loop inside the above code.

Salida del bucle for ( ; ; )

Salida del bucle while (1)

Salida del bucle while (1)

Salida del bucle while (verdadero)

Salida del bucle while (verdadero)

Salida del bucle while (verdadero)

Puedes ver la salida y observar; al incluir uno de estos, estás dando efectivamente la ilusión de que el Arduino no está funcionando.

3. Detener el bucle void() utilizando tanto la declaración If como la booleana.  

Puede controlar sus bucles utilizando un booleano y una sentencia if. Un booleano tiene sólo dos valores: verdadero y falso.

Código Arduino para detener el bucle con la sentencia if
boolean Counter_Check = true;
int counter = 10;

void setup() {
  Serial.begin(9600);
  Serial.println("Start the counter");
}

void loop() {
  if (Counter_Check == true) {
    Serial.print("Counter: ");
    Serial.println(counter);
    counter++;
    delay(1000);
  }

  Counter_Check = false;
}
Cómo funciona el código de la sentencia if

Paso 1: 

boolean Comprobación_del_contador = true;
int contador = 10;

Primero, definí la variable booleana Counter_Check y declaré la variable counter.

void setup() {
  Serial.begin(9600);
  Serial.println("Start the counter");
}

En la función setup(), inicializa el terminal serie.

Paso 3: 

void loop() {
  if (Counter_Check == true) {
    Serial.print("Counter: ");
    Serial.println(counter);
    counter++;
    delay(1000);
  }

  Counter_Check = false;
}

En el bucle void(), comprueba la condición de que si el valor Counter_Check es verdadero, entonces el valor del contador se imprime en el terminal serie.

Después de la condición, hago que el valor de Counter_Check sea falso. Entonces, para el bucle vacío.

Salida en el terminal de serie

Salida en el terminal de serie

4. Detener el módulo Arduino utilizando el modo de reposo

El modo de reposo puede utilizarse para una pausa controlada o para un bloqueo completo de la tarea.

El método para despertar al Arduino se puede elegir antes de ponerlo en modo de reposo; normalmente, un Arduino se configura para despertarse mediante un temporizador o una interrupción externa.

Puede obtener más información sobre el modo de reposo en la hoja de datos del ATmega328 y consultar el tema nº. 14.

Instalación de las librerías Arduino necesarias

Para utilizar el modo de reposo con el IDE de Arduino, puede utilizar una biblioteca ya construida, Sleep_n0m1. Siga los pasos mencionados a continuación para instalar la biblioteca. 

Paso 1: Vaya a Herramientas > Gestionar Bibliotecas para abrir el gestor de bibliotecas en Arduino IDE.

el gestor de bibliotecas en Arduino IDE

Paso 2: Ahora, en el cuadro de búsqueda, escriba "Sleep_n0m1.h". Instala la librería y úsala.

Instalar una biblioteca y utilizarla
Sleep_n0m1.h
Código Arduino para el modo de reposo
#include "Sleep_n0m1.h"

int counter = 0;
Sleep sleep;
unsigned long Rest_Time; 		// how long you want the arduino to sleep

void setup()
{
   Serial.begin(9600);
   Rest_Time = 50000; 		// set sleep time in ms 
}

void loop()
{
  delay(100); 			// delay to allow serial output to be ready after waking up
  Serial.print("Awake for ");
  Serial.print(counter);
  Serial.println("sec");

  counter++;
  delay(1000);                           // waits for a second
  
  if(counter >= 3)
  {
    Serial.print("sleeping Time :");
    Serial.println(Rest_Time); 
    delay(100); 	//delay to allow serial to fully print before sleep
    counter = 0;
    sleep.pwrDownMode(); 		// set sleep mode
    sleep.sleepDelay(Rest_Time); 	// sleepTime
  }
}
Cómo funciona el código del modo de reposo

Paso 1: Primero, he incluido los archivos de cabecera necesarios Sleep_n0m1.h.

#include "Sleep_n0m1.h"

Paso 2: Inicializar la variable contador y la variable Rest_Time.

int contador = 0;
Dormir el sueño;
unsigned long Tiempo_de_reposo;

Paso 3:

void setup()
{
  Serial.begin(9600);
  Rest_Time = 50000; 		//set sleep time in ms
}

En la función setup(), inicializa el terminal serie. Establezca el tiempo de espera en milisegundos.

Paso 4:

void loop()
{
  delay(100); 			       // delay to allow serial output to be ready after waking up
  Serial.print("Awake for ");
  Serial.print(counter);
  Serial.println("sec");

  counter++;
  delay(1000);                            // waits for a second

En la función void loop(), inicia la cuenta por un segundo, incrementa el contador y espera 1 segundo.

Paso 5:

if (counter >= 3)
  {
    Serial.print("sleeping Time :");
    Serial.println(Rest_Time);
    delay(100);	 			//delay to allow serial to fully print before sleep
    counter = 0;
    sleep.pwrDownMode(); 			//set sleep mode
    sleep.sleepDelay(Rest_Time); 		//sleep for: sleepTime
  }
}

He utilizado esta condición si el contador cuenta el segundo. Cuenta hasta 3 segundos. Después del contador, hago 0.

Usando la función sleep.pwrDownMode() y sleep.sleepDelay(sleepTime), la CPU pasa al modo de reposo durante 50.000 ms.

Salida en el terminal de serie

Salida en el terminal de serie

5. Uso del reinicio externo para reiniciar la placa Arduino

El Arduino gira para reiniciarse a sí mismo usando un reinicio externo.

Diagrama de cableado para el rearme externo

Paso 1: Conecta el cátodo del LED (-) a un pin GND del Arduino.

Paso 2: Conecta el ánodo (+) del LED a la resistencia de 220 Ohmios al pin digital 10 del Arduino.

pin digital 10 del Arduino

Paso 3: Conecta el pin 4 del Arduino al pin de Reset.

Conecta el pin 4 del Arduino

Ahora, listo para usar este diagrama de cableado.

Código Arduino para el reinicio externo
#define Blink_LED 10
#define RESET_PIN 4

void setup() {  
  digitalWrite(RESET_PIN, HIGH);
  delay(200);
  pinMode(Blink_LED, OUTPUT);    
  pinMode(RESET_PIN, OUTPUT);     
  Serial.begin(9600);	
  delay(200);
}

void loop() {
  delay(10);
  digitalWrite(Blink_LED, HIGH);   // turn the LED on 
  Serial.println("LED ON");
  delay(1000);               // wait for a second
  digitalWrite(Blink_LED, LOW);    // turn the LED off 
  Serial.println("LED OFF");
  delay(1000);               
  Serial.println("RESETTING..........");
  delay(50);    //  necessary to use delay 50 second
  digitalWrite(RESET_PIN, LOW);
  Serial.println("Arduino will never reach there");
}
Cómo funciona el código de reinicio externo

Paso 1: Definí el LED Arduino Pin 10. y Reset el pin a Arduino pin 4.

#define Blink_LED 10
#define RESET_PIN 4

Paso 2:

void setup() {  
  digitalWrite(RESET_PIN, HIGH);
  delay(200);
  pinMode(Blink_LED, OUTPUT);    
  pinMode(RESET_PIN, OUTPUT);     
  Serial.begin(9600);
  delay(200);
}

En la función setup(), usando la función pinMode(); el LED y el pin de reset se establecen como modo OUTPUT. Inicializar el terminal de serie.

Paso 3:

void loop() {
  delay(10);
  digitalWrite(Blink_LED, HIGH);   // turn the LED on 
  Serial.println("LED ON");
  delay(1000);               // wait for a second
  digitalWrite(Blink_LED, LOW);    // turn the LED off 
  Serial.println("LED OFF");
  delay(1000);               // wait for a second
  Serial.println("RESETTING..........");
  delay(50);   		//  necessary to use delay 50 second
  digitalWrite(RESET_PIN, LOW);
  Serial.println("Arduino will never reach there");
}

En el bucle void(), enciende el LED y, después de 1 segundo, reinicia el Arduino. Después de reiniciar el Arduino, la siguiente línea no se ejecutará. Debido a Antes de esta línea, Arduino va a reiniciar.

Salida en el terminal de serie

Salida en el terminal de serie

6. Stop The Arduino Using Watchdog Timer Method

El ATmega328P tiene un temporizador de vigilancia (WDT).

Esta función es útil para ayudar al sistema a recuperarse de una situación en la que el sistema se cuelga debido a errores en el código escrito o debido a condiciones que pueden surgir debido a problemas de hardware.

El WDT debe ser configurado de acuerdo con su aplicación.

Código Arduino para detener el bucle utilizando el temporizador de vigilancia
#include "avr/wdt.h"
int counter=10;

void setup() {
   Serial.begin(9600);
   wdt_disable(); 	// Disable WDT
   delay(3000);
   
   wdt_enable(WDTO_1S); // Enable WDT with a timeout of 1 second
   Serial.println("Watchdog Timer Enabled");
   Serial.println("Start the counter");
}

void loop() {
  Serial.print("Counter: ");
  Serial.println(counter);
  counter++;
    
  delay(1000);
  wdt_reset(); 		// Reset the watchdog
   
  while(1); 		// Watchdog timer get triggered
}
Cómo funciona el código del temporizador de vigilancia

Paso 1: Estoy usando la librería AVR WDT. Inicialice el contador variable.

#include "avr/wdt.h"
int counter=10;

Paso 2:

void setup() {
   Serial.begin(9600);
   wdt_disable(); // Disable WDT
   delay(3000);
   wdt_enable(WDTO_1S); 		//Enable WDT with a timeout of 1 second
   Serial.println("WDT Enabled");
   Serial.println("Start the counter");
}

Inicialice la terminal serial y primero desactive el WDT. Utilicé un retraso de 3 segundos. El programa no se reiniciará aquí porque el watchdog está deshabilitado.

Paso 3: Ahora, el WDT con un tiempo de espera de 1 segundo está habilitado. Si el programa no restablece este temporizador dentro de cada 1 segundo, entonces el watchdog se activará y reiniciará el Arduino.

Paso 4:

void loop() {
  Serial.print("Counter: ");
  Serial.println(counter);
  counter++;
    
  delay(1000);
  wdt_reset(); 		// Reset the watchdog
   
  while(1); 		// Watchdog timer get triggered
}

Los valores de los contadores se envían al monitor serie y se reinician al watchdog cada segundo en el bucle.

A continuación, el programa entra en un bucle while infinito.

Aquí, como no hay WDT, se activará y reiniciará el Arduino.

Salida en el terminal de serie

Salida en el terminal de serie

Conclusión

En este tutorial, he discutido por qué usted puede necesitar para detener un programa de Arduino y proporcionó múltiples maneras que usted puede hacer esto utilizando el hardware o el software.

El IDE de Arduino tiene una biblioteca de funciones incorporada para detener los programas de Arduino, y he compartido con usted varios trozos de código que puede utilizar en función de sus objetivos. 

Espero que hayas encontrado este artículo informativo, y me encantaría saber qué proyecto planeas construir o ya has hecho con el Arduino.

Si tienes alguna duda o sugerencia o crees que faltan cosas en este tutorial, por favor, comenta abajo.

Tenga en cuenta que los comentarios son retenidos por la moderación para evitar el spam.