Se repite el mensaje de salida

Hola:

Hice un código de prueba sobre encender y apagar un Led 13 con Arduino UNO r3, con un pulsador en entrada digital número 8. Este es su código.

Código:
int estadoBoton=0; // Guardará el estado del botón HIGH o LOW.
char caracter;
String comando;

void setup()
{
  pinMode(13,OUTPUT); // Donde está el Led 13.
  pinMode(8,INPUT); // Entrada digital donde está el pulsador.
  Serial.begin(115200);
}

void loop()
{
    estadoBoton=digitalRead(8); // Leer entrada digital número 8.
    // Si el pulsador está pulsado, se enciende el Led 13 y 
    // envía comando HIGH por el puerto serie.
 if (estadoBoton == HIGH) 
    { 
      digitalWrite(13,HIGH);
      Serial.println("HIGH");
    } 
 // De lo contrario, Led 13 epagado y envía LOW al puerto serie.
 else
    {
      digitalWrite(13,LOW);
      Serial.println("LOW");
    }
}
He intentado hacer la misma función pero sigue con el mismo problema de enviar mensajes a lo loco como si fuera un bucle.

Código:
int estadoBoton=0; // Guardará el estado del botón HIGH o LOW.
char caracter;
String comando;

void setup()
{
  pinMode(13,OUTPUT); // Donde está el Led 13.
  pinMode(8,INPUT); // Entrada digital donde está el pulsador.
  Serial.begin(115200);
}

void loop()
{
    estadoBoton=digitalRead(8); // Leer entrada digital número 8.
    // Si el pulsador está pulsado, se enciende el Led 13 y 
    // envía comando HIGH por el puerto serie.
      
    switch (estadoBoton)
{
  case 0:
      digitalWrite(13,HIGH);
      Serial.println("HIGH");
      break;
      
  case 1:
      digitalWrite(13,LOW);
      Serial.println("LOW");     
      break;
      default:
      Serial.println("Error desconocido");
}
}
Para quitar el bucle, hice esto de otra manera pero no funciona nada de nada.
Código:
int estadoBoton=0; // Guardará el estado del botón HIGH o LOW.
char caracter;
String comando;

void setup()
{
  pinMode(13,OUTPUT); // Donde está el Led 13.
  pinMode(8,INPUT); // Entrada digital donde está el pulsador.
  Serial.begin(115200);


      
    switch (estadoBoton)
{
  case 0:
      digitalWrite(13,HIGH);
      Serial.println("HIGH");
      break;
      
  case 1:
      digitalWrite(13,LOW);
      Serial.println("LOW");     
      break;
      default:
      Serial.println("Error desconocido");
}
}

void loop()
{
        estadoBoton=digitalRead(8); // Leer entrada digital número 8.
    // Si el pulsador está pulsado, se enciende el Led 13 y 
    // envía comando HIGH por el puerto serie.
}
A parte de encender un Led, no hay ningún problema, si al enviar mensaje de texto como HIGH o LOW de forma muy repetitiva hasta colapsar el otro programa que tengo al recibir mensajes. El otro programa en un ordenador de sobre mesa con Visual Studio 2015.

¿Hay alguna solución?

Un cordial saludo.
 
El setup() solo se ejecuta una vez, mientras que loop() se ejecuta como un bucle infinito. Esto no quita que pongamos toda la lógica en setup(), por supuesto.

Si quieres que el bucle (esté donde esté) no te imprima textos sin parar (es decir, mientras el botón está pulsado), debes usar una variable que indique el último estado leído. Si lo que lees desde la entrada digital no coincide con el contenido de la variable, es que ha ocurrido un cambio, por lo que sacas el texto consecuente. Y actualiza el valor de la variable, para la siguiente vuelta.
 
Hola:

Alguien me soltó un ejemplo y no se el motivo por el cual lo borró.
Código:
int estadoBoton=0; // Guardará el estado del botón HIGH o LOW.
char caracter;
String comando;
int flag = 0;

void setup()
{
  pinMode(13,OUTPUT); // Donde está el Led 13.
  pinMode(8,INPUT); // Entrada digital donde está el pulsador.
  Serial.begin(115200);
}

 void loop()
{
    estadoBoton=digitalRead(8); // Leer entrada digital número 8.
    switch (estadoBoton)
{
  case 0:
      if(flag == 1){
      flag= 0;
      digitalWrite(13,HIGH);
      Serial.println("HIGH");
      }
      break;

  case 1:
      if(flag == 0){
      flag= 1;
      digitalWrite(13,LOW);
      Serial.println("LOW");
    }
      break;
      default:
      Serial.println("Error desconocido");
}
}
Funciona, lo he probado, eso si, se puede mejorar mejor porque tiene el típico fallo del antirrebote.


Gracias por el que hizo el código de arriba.
 
Aquí hay otro mejor código.

PHP:
byte estadoBoton = 0; // Guardará el estado del botón HIGH o LOW.
byte estadoBotonAnt = 0;
long lastDebounceTime = 0;
char caracter;
String comando;

void setup(){
  pinMode(13,OUTPUT); // Donde está el Led 13.
  pinMode(8,INPUT);   // 
  Serial.begin(115200);
}
void loop() {
    estadoBoton = digitalRead(8); // Leer entrada digital número 8.
    // Si el pulsador está pulsado, se enciende el Led 13 y 
    // envía comando HIGH por el puerto serie.
  if ((millis() - lastDebounceTime) > 100)
  {
    if (estadoBoton == HIGH && estadoBotonAnt == LOW) { 
        digitalWrite(13,HIGH);
        Serial.println("HIGH");
    }
       // De lo contrario, Led 13 epagado y envía LOW al puerto serie.
         if (estadoBoton == LOW && estadoBotonAnt == HIGH) {
      digitalWrite(13,LOW);
      Serial.println("LOW");   // sin el agregado de este if tendrian cientos de LOW en el MOnitor Serie
    }
    estadoBotonAnt = estadoBoton;
  } 
}

Y con delay.

Saludos
 
Hola:

He hecho programas para Arduino UNO r3 en el que detecta 4 interruptores y lo muestra en el Monitor Serie de Arduino IDE 1.6.6.

1. Lo que hace es, detectar las entradas digitales y enviarlo por puerto Serie/USB. Para hacer pruebas, en el Monitor Serie se muestra los datos.
2. Al encender o resetear Arduino, muestra sus estados como están.

Lo puedes ver en este código.
Código:
byte estadoBoton1, estadoBoton2, estadoBoton3, estadoBoton4;
byte estadoBotonAnt1, estadoBotonAnt2, estadoBotonAnt3, estadoBotonAnt4;
char buffer[44];

void setup()
{
  pinMode(13,OUTPUT); // Donde está el Led 13.
  pinMode(12,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(8,INPUT); // Entrada digital 8.
  pinMode(7,INPUT);
  pinMode(6,INPUT);
  pinMode(5,INPUT);
  Serial.begin(115200);
  leeEstado();
  printEstado();
}

void loop() {
  leeEstado();
  if ((estadoBoton1 != estadoBotonAnt1) ||
  (estadoBoton2 != estadoBotonAnt2) ||
  (estadoBoton3 != estadoBotonAnt3) ||
  (estadoBoton4 != estadoBotonAnt4))
  {
    printEstado();
    delay(50);
  }
}

void leeEstado() {
  estadoBoton1 = digitalRead(8);
  estadoBoton2 = digitalRead(7);
  estadoBoton3 = digitalRead(6);
  estadoBoton4 = digitalRead(5);
}

void printEstado(void) {
  digitalWrite(13,estadoBoton1);
  digitalWrite(12,estadoBoton2);
  digitalWrite(11,estadoBoton3);
  digitalWrite(10,estadoBoton4);
  sprintf(buffer,"%s %s %s %s",
    estadoBoton1?"HIGH 1":"LOW 1",
    estadoBoton2?"HIGH 2":"LOW 1",
    estadoBoton3?"HIGH 3":"LOW 3",
    estadoBoton4?"HIGH 4":"LOW 4");
  Serial.println(buffer);
  estadoBotonAnt1 = estadoBoton1;
  estadoBotonAnt2 = estadoBoton2;
  estadoBotonAnt3 = estadoBoton3;
  estadoBotonAnt4 = estadoBoton4;
}
Hasta ahí todo bien en el código de arriba. Ahora quiero hacer otra cosa más que me da problemas.
Por ejemplo, desde el Monitor Serie, envío un comando llamado ACTUALIZAR para que me actualice los datos de los interruptores como están.
Lo he intentado hacer en el código de abajo, se vuele como loco.

Código:
byte estadoBoton1, 
estadoBoton2, 
estadoBoton3, 
estadoBoton4;
byte estadoBotonAnt1, 
estadoBotonAnt2, 
estadoBotonAnt3, 
estadoBotonAnt4;
char buffer[44];
char caracter;
String comando;

void setup()
{
  pinMode(13,OUTPUT); // Donde está el Led 13.
  pinMode(12,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(8,INPUT); // Entrada digital 8.
  pinMode(7,INPUT);
  pinMode(6,INPUT);
  pinMode(5,INPUT);
  Serial.begin(115200);
  leeEstado();
  printEstado();
}

void loop() {
  leeEstado();
  if ((estadoBoton1 != estadoBotonAnt1) ||
  (estadoBoton2 != estadoBotonAnt2) ||
  (estadoBoton3 != estadoBotonAnt3) ||
  (estadoBoton4 != estadoBotonAnt4))
  {
    printEstado();
    delay(50);
  }

  while (Serial.available() > 0)
  {
    caracter= Serial.read();
    comando.concat(caracter);
    delay(10);
  }

  if (comando.equals("ACTUALIZAR") == true)
  {
   printEstado();
  }
  
}

void leeEstado() {
  estadoBoton1 = digitalRead(8);
  estadoBoton2 = digitalRead(7);
  estadoBoton3 = digitalRead(6);
  estadoBoton4 = digitalRead(5);
}

void printEstado(void) {
  digitalWrite(13,estadoBoton1);
  digitalWrite(12,estadoBoton2);
  digitalWrite(11,estadoBoton3);
  digitalWrite(10,estadoBoton4);
  sprintf(buffer,"%s %s %s %s",
    estadoBoton1?"HIGH 1":"LOW 1",
    estadoBoton2?"HIGH 2":"LOW 1",
    estadoBoton3?"HIGH 3":"LOW 3",
    estadoBoton4?"HIGH 4":"LOW 4");
  Serial.println(buffer);
  estadoBotonAnt1 = estadoBoton1;
  estadoBotonAnt2 = estadoBoton2;
  estadoBotonAnt3 = estadoBoton3;
  estadoBotonAnt4 = estadoBoton4;
}
¿Dónde está el problema y cómo lo solucionamos?

Saludos.
 
Última edición por un moderador:
Atrás
Arriba