[SOLUCIONADO] Se repite el mensaje de salida como loco

Hola:

Me despisté lo del código que he borrado sin querer.

He probado el código, sigue con el doble HIGH. No funciona como debería. Estoy arprendiendo con el libro que compré, no te preocupes. Solo quiero hacer este ejemplo rápido.

Saludos.

Agrega

estadoBotonAnt = estadoBoton;

Al final del setup()

Hola:

Si te refieres así:

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

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

  estadoBoton = digitalRead(8);

  // imprime el estado al encender arduino
  if(estadoBoton == 0){
    Serial.println("LOW");
  }else{
    Serial.println("HIGH");
  }

  estadoBotonAnt = estadoBoton;
}

void loop() {

  estadoBoton = digitalRead(8);
 
    // Si el pulsador está pulsado, se enciende el Led 13 y
    // envía comando HIGH por el puerto serie.
    if (estadoBoton == HIGH && estadoBotonAnt == LOW)
    {
        digitalWrite(13,HIGH);
        Serial.println("HIGH");
        delay(50);
    }
    
    // De lo contrario, Led 13 epagado y envía LOW al puerto serie.
    if (estadoBoton == LOW && estadoBotonAnt == HIGH) {
        digitalWrite(13,LOW);
        Serial.println("LOW");
        delay(50);
    }
}

Por fin me funciona lo de HIGH de una vez, sin embargo, sale infinitos LOW cuando pulso a 0 o LOW el interruptor.

Si lo pongo justo debajo o por fuera del Setup, como indica el código de abajo sale error.

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

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

  estadoBoton = digitalRead(8);

  // imprime el estado al encender arduino
  if(estadoBoton == 0){
    Serial.println("LOW");
  }else{
    Serial.println("HIGH");
  }
}


  estadoBotonAnt = estadoBoton;

void loop() {

  estadoBoton = digitalRead(8);
 
    // Si el pulsador está pulsado, se enciende el Led 13 y
    // envía comando HIGH por el puerto serie.
    if (estadoBoton == HIGH && estadoBotonAnt == LOW)
    {
        digitalWrite(13,HIGH);
        Serial.println("HIGH");
        delay(50);
    }
    
    // De lo contrario, Led 13 epagado y envía LOW al puerto serie.
    if (estadoBoton == LOW && estadoBotonAnt == HIGH) {
        digitalWrite(13,LOW);
        Serial.println("LOW");
        delay(50);
    }
}

Arduino:1.6.6 (Windows 7), Placa:"Arduino/Genuino Uno"
Entrada_digital:30: error: 'estadoBotonAnt' does not name a type
** estadoBotonAnt = estadoBoton;**
** ^**
exit status 1
'estadoBotonAnt' does not name a type

Saludos.

Metaconta a esta altura no deberías tener dudas sobre donde NO puedes definir cosas o escribir sentencias.
Cómo vas a poner,

estadoBotonAnt = estadoBoton;

entre setup y loop?

la organización de un sketch es
Definiciones
Librerías
variables globales
setup()
loop()
pero entre medio de setup y loop nada.

Hola:

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

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

  estadoBoton = digitalRead(8);

  // imprime el estado al encender arduino
  if(estadoBoton == 0){
    Serial.println("LOW");
  }else{
    Serial.println("HIGH");
  }
}

void loop() {

  estadoBoton = digitalRead(8);
 
    // Si el pulsador está pulsado, se enciende el Led 13 y
    // envía comando HIGH por el puerto serie.
    if (estadoBoton == HIGH && estadoBotonAnt == LOW)
    {
        digitalWrite(13,HIGH);
        Serial.println("HIGH");
        delay(50);
    }
    
    // De lo contrario, Led 13 epagado y envía LOW al puerto serie.
    if (estadoBoton == LOW && estadoBotonAnt == HIGH) {
        digitalWrite(13,LOW);
        Serial.println("LOW");
        delay(50);
    }

        estadoBotonAnt = estadoBoton;
}

Si reseteo o enciendo Arduino y me detecta que el interruptor está a 1 o HIGH, tiene que aparecer solo un HIGH en el Monitor Serie, no dos veces como muestra abajo.

Saludos.

...No hiciste lo que te recomendé en: http://forum.arduino.cc/index.php?topic=360039.msg2491047#msg2491047

increíble otra vez tu consulta!!!

En el setup preguntas por el estado del botón va un HIGH
En el loop en el primero ciclo hasta que las variables se ponen en sus estasdos va el segundo HIGH impreso en el MONITOR
Saca el del setup() o al final del setup le ponges

estadoBotonAnt = estadoBoton;

pero no fuera dentro del setup
si haces esto

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

  estadoBoton = digitalRead(8);

  // imprime el estado al encender arduino
  if(estadoBoton == 0){
    Serial.println("LOW");
  }else{
    Serial.println("HIGH");
  }
  estadoBotonAnt = estadoBoton;
}

Luego en el loop cuando se encuntre con

if (estadoBoton == HIGH && estadoBotonAnt == LOW)

no va a pasar porque estadoBotonAnt = HIGH

gepd:
...No hiciste lo que te recomendé en: http://forum.arduino.cc/index.php?topic=360039.msg2491047#msg2491047

Hola:

Si me dices que no lo hice, entonces hasta ahora no te he entendido. Por eso estoy todo el rato con el estadoBotonAnt = estadoBoton;
Para arriba y para abajo como indicaba arriba.

¿Cómo es?

Me siento tronco ahora. :frowning:

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

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

  estadoBoton = digitalRead(8);

  // imprime el estado al encender arduino
  if(estadoBoton == 0){
    Serial.println("LOW");
  }else{
    Serial.println("HIGH");
  }
  estadoBotonAnt = estadoBoton;
}

void loop() {

  estadoBoton = digitalRead(8);
 
    // Si el pulsador está pulsado, se enciende el Led 13 y
    // envía comando HIGH por el puerto serie.
    if (estadoBoton == HIGH && estadoBotonAnt == LOW)
    {
        digitalWrite(13,HIGH);
        Serial.println("HIGH");
        delay(50);
    }
    
    // De lo contrario, Led 13 epagado y envía LOW al puerto serie.
    if (estadoBoton == LOW && estadoBotonAnt == HIGH) {
        digitalWrite(13,LOW);
        Serial.println("LOW");
        delay(50);
    }

        estadoBotonAnt = estadoBoton;
}

Así debería quedar tu código final.

Y a mi no me leen? &^%&^%^&%& editor que siempre me pega los colores.

Hola:

Vaya, vaya, vaya. Había que ponerlo en dos sitios diferentes el

estadoBotonAnt = estadoBoton;

Eso si que no me lo esperaba, solo quitaba en un sitio y ponía en otro.

surbyte, Si te leemos campeón.

Voy a probar el código, luego les comento.

Saludos.

Edito:

¡¡¡Por fin funciona!!!

Muchas gracias a todos.

Por curiosidad.

Si son 4 entradas digitales independientes, parece ser que así me funciona bien hasta cierto punto, pero no me gusta como se muestra.

byte estadoBoton1 = 0; // Guardará el estado del botón HIGH o LOW.
byte estadoBoton2 = 0;
byte estadoBoton3 = 0;
byte estadoBoton4 = 0;
byte estadoBotonAnt1 = 0;
byte estadoBotonAnt2 = 0;
byte estadoBotonAnt3 = 0;
byte estadoBotonAnt4 = 0;
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);

  estadoBoton1 = digitalRead(8);

  // imprime el estado al encender arduino
  if(estadoBoton1 == 0){
    Serial.println("LOW 1");
  }else{
    Serial.println("HIGH 1");
  }
  estadoBotonAnt1 = estadoBoton1;

  if(estadoBoton2 == 0){
    Serial.println("LOW 2");
  }else{
    Serial.println("HIGH 2");
  }
  estadoBotonAnt2 = estadoBoton2;

    if(estadoBoton3 == 0){
    Serial.println("LOW 3");
  }else{
    Serial.println("HIGH 3");
  }
  estadoBotonAnt3 = estadoBoton3;

    if(estadoBoton4 == 0){
    Serial.println("LOW 4");
  }else{
    Serial.println("HIGH 4");
  }
  estadoBotonAnt4 = estadoBoton4;
}

void loop() {

  estadoBoton1 = digitalRead(8);
 
    // Si el pulsador está pulsado, se enciende el Led 13 y
    // envía comando HIGH por el puerto serie.
    if (estadoBoton1 == HIGH && estadoBotonAnt1 == LOW)
    {
        digitalWrite(13,HIGH);
        Serial.println("HIGH 1");
        delay(50);
    }
   
    // De lo contrario, Led 13 epagado y envía LOW al puerto serie.
    if (estadoBoton1 == LOW && estadoBotonAnt1 == HIGH) {
        digitalWrite(13,LOW);
        Serial.println("LOW 1");
        delay(50);
    }

        estadoBotonAnt1 = estadoBoton1;

          estadoBoton2 = digitalRead(7);
 
    // Si el pulsador está pulsado, se enciende el Led 13 y
    // envía comando HIGH por el puerto serie.
    if (estadoBoton2 == HIGH && estadoBotonAnt2 == LOW)
    {
        digitalWrite(12,HIGH);
        Serial.println("HIGH 2");
        delay(50);
    }
   
    // De lo contrario, Led 13 epagado y envía LOW al puerto serie.
    if (estadoBoton2 == LOW && estadoBotonAnt2 == HIGH) {
        digitalWrite(12,LOW);
        Serial.println("LOW 2");
        delay(50);
    }

        estadoBotonAnt2 = estadoBoton2;

          estadoBoton3 = digitalRead(6);
 
    // Si el pulsador está pulsado, se enciende el Led 13 y
    // envía comando HIGH por el puerto serie.
    if (estadoBoton3 == HIGH && estadoBotonAnt3 == LOW)
    {
        digitalWrite(11,HIGH);
        Serial.println("HIGH 3");
        delay(50);
    }
   
    // De lo contrario, Led 13 epagado y envía LOW al puerto serie.
    if (estadoBoton3 == LOW && estadoBotonAnt3 == HIGH) {
        digitalWrite(11,LOW);
        Serial.println("LOW 3");
        delay(50);
    }

        estadoBotonAnt3 = estadoBoton3;

          estadoBoton4 = digitalRead(5);
 
    // Si el pulsador está pulsado, se enciende el Led 13 y
    // envía comando HIGH por el puerto serie.
    if (estadoBoton4 == HIGH && estadoBotonAnt4 == LOW)
    {
        digitalWrite(10,HIGH);
        Serial.println("HIGH 4");
        delay(50);
    }
   
    // De lo contrario, Led 13 epagado y envía LOW al puerto serie.
    if (estadoBoton4 == LOW && estadoBotonAnt4 == HIGH) {
        digitalWrite(10,LOW);
        Serial.println("LOW 4");
        delay(50);
    }

        estadoBotonAnt4 = estadoBoton4;
}

Al encender Arduino he dejado los 4 interruptores de este modo1000. Te lo muestra en forma de escalón una tras otro como indica esta imagen.

He logrado muestre en línea como indica abajo.

Al Resetear o encender Arduino se comporta a veces de forma rara. Por ejemplo, lo dejo en 0010 y me muestra exactamente lo que indica abajo y quiero resolver este problema.

He estado dando vueltas y no consigo con la silusión.

Eso si, la idea es desde que pulse calquier pulsador, solo uno, te muestra también sus 4 estados al mismo tiempo en línea.

Algo se me escapa.

Saludos.

¿Por qué no creas una función que imprima el estado de los cuatro pulsadores, y así la llamas tanto desde setup como cada vez que varíe un pulsador?.
La función sería algo así como:

imprimeEstados(){
  if(estadoBoton1 == 0){
    Serial.print("LOW 1");
  }else{
    Serial.print("HIGH 1");
  }
  if(estadoBoton2 == 0){
    Serial.print(" LOW 2");
  }else{
    Serial.print(" HIGH 2");
  }
  if(estadoBoton3 == 0){
    Serial.print(" LOW 3");
  }else{
    Serial.print(" HIGH 3");
  }
  if(estadoBoton4 == 0){
    Serial.println(" LOW 4");
  }else{
    Serial.println(" HIGH 4");
  }
Serial.println("-------------------");

Hola:

Lo probaré y avisaré. El detalle es más así, con el LOW 2, 3 y 4, lo mismo para el HIGH que se se escapó. A parte de ello, tiene que haber un espacio después del número porque sino salen todos juntos de esta manera.

LOW 1LOW 2LOW 3LOW 4
-------------------------

Debe salir así:
LOW 1 LOW 2 LOW 3 LOW 4
-------------------------

imprimeEstados(){
  if(estadoBoton1 == 0){
    Serial.print("LOW 1");
  }else{
    Serial.print("HIGH 1");
  }
  if(estadoBoton2 == 0){
    Serial.print("LOW 2");
  }else{
    Serial.print("HIGH 2");
  }
  if(estadoBoton3 == 0){
    Serial.print("LOW 3");
  }else{
    Serial.print("HIGH 3");
  }
  if(estadoBoton4 == 0){
    Serial.println("LOW 4");
  }else{
    Serial.println("HIGH 4");
  }
Serial.println("-------------------");

Voy a probar la función, cuando acabe, editaré este post si nadie ha escrito algo nuevo debajo de este.

Saludos y gracias por las ayudas.

y porque no aprendes a usar sprintf y sacas las impresiones como gustes.

  char buffer[40];

sprintf(buffer,"%c %c %c %c", estadoboton1?"HIGH 1":"LOW 1", estadoboton2?"HIGH 2":"LOW 1", 
                              estadoboton3?"HIGH 3":"LOW 3", estadoboton4?"HIGH 4":"LOW 4");
Serial.println(buffer);

Jajaja, surbyte. Te me has vuelto un talibán del sprintf, ¿eh?

Que conste que yo también lo soy, pero preferí no cambiar demasiado el planteamiento de partida. Las opciones "abreviadas" las suelo dejar para después, que fastidia más :wink:
(evidentemente por "fastidiar" me refiero a que cala más la alternativa, no que sea sádico ;)).

Por cierto, supongo que lo correcto serían %s en lugar de %c.

Buenas:

El libro que he comrpado, precisamente para novatos, no dice nada del sprintf, tendré que leer más por ahí.

Por cierto, tampoco dice nada de los %s y %c. ¿Qué significan?

Saludos.

tienes razón... es %s como bien dices.
Gracias por lo de talibán jajaja sin ofenderlos, no quiero volar por los aires.

Metaconta: si no sabes que debes hacer? GOOGLEEE!!
Arduino sprintf esta página no es de arduino. Es de Linuz y por lo tanto tiene todas las bondades de sprintf bien explicdas.
Lo único que debes obviar es el uso de %f ya que no se puede usar manejo de floats en Arduino por una cuestión de tamaÑo.
Ahora ya es hora que lo hagan no?

surbyte:
tienes razón... es %s como bien dices.
Gracias por lo de talibán jajaja sin ofenderlos, no quiero volar por los aires.

Lo último los ofendes más.

Metaconta: si no sabes que debes hacer? GOOGLEEE!!

Tengo que saber su existencia primero, en un libro debía ponerlo.

Arduino sprintf esta página no es de arduino. Es de Linuz y por lo tanto tiene todas las bondades de sprintf bien explicdas.
Lo único que debes obviar es el uso de %f ya que no se puede usar manejo de floats en Arduino por una cuestión de tamaÑo.
Ahora ya es hora que lo hagan no?

Ahora se vuelve loco una y otra vez.

byte estadoBoton1 = 0; // Guardará el estado del botón HIGH o LOW.
byte estadoBoton2 = 0;
byte estadoBoton3 = 0;
byte estadoBoton4 = 0;
byte estadoBotonAnt1 = 0;
byte estadoBotonAnt2 = 0;
byte estadoBotonAnt3 = 0;
byte estadoBotonAnt4 = 0;
char caracter;
String comando;
char buffer[40];

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

  estadoBoton1 = digitalRead(8);

  // imprime el estado al encender arduino
  if(estadoBoton1 == 0){
    Serial.print("LOW 1 ");
  }else{
    Serial.print("HIGH 1 ");
  }
  estadoBotonAnt1 = estadoBoton1;

  if(estadoBoton2 == 0){
    Serial.print("LOW 2 ");
  }else{
    Serial.print("HIGH 2 ");
  }
  estadoBotonAnt2 = estadoBoton2;

    if(estadoBoton3 == 0){
    Serial.print("LOW 3 ");
  }else{
    Serial.print("HIGH 3 ");
  }
  estadoBotonAnt3 = estadoBoton3;

    if(estadoBoton4 == 0){
    Serial.println("LOW 4");
  }else{
    Serial.println("HIGH 4");
  }
  estadoBotonAnt4 = estadoBoton4;

  Serial.println("---------------------------");
}

void loop() {

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

Gracias por la Web.

Que has hecho Metaconta? Yo solo te sugerí sprintf para que las impresiones por Serial salieran como tu quieres nada mas.
Como lo usas es tu responsabilidad.

Usalo en

imprimeEstados() {
      sprintf(buffer,"%6s %6s %6s %6s", estadoBoton1?"HIGH 1":"LOW 1", estadoBoton2?"HIGH 2":"LOW 1", estadoBoton3?"HIGH 3":"LOW 3",  estadoBoton4?"HIGH 4":"LOW 4");

      Serial.println(buffer);
}

Los estados deben cambiar en otra parte del programa.