Problema con los high y low

Buenas,

La verdad es que me estoy rallando un poco con el siguiente comportamiento de arduino. Estoy trabajando con el siguiente codigo:

void setup() {
  pinMode(6, INPUT_PULLUP);
  Serial.begin(9600);
}
int oldState = 0;
int newState = 0;
void loop() {

  if (digitalRead(6) == 0) {
    oldState = 0;
  } else {
    oldState = 1;
  }
  
  if (oldState != newState) {
    if (oldState) {
      Serial.println("HIGH");
    } else {
      Serial.println("LOW");
    }
    newState = oldState;
  }
 
}

Y estoy obteniendo un comportamiento muy raro en serial cuando acciono el pin6, conectandolo con GND.

Cuando tengo el circuito abierto la resistencia pullup, me pone el pin en HIGH, como bien me reporta el serial en la primera linea, pero cuando cierro el circuito con GND, me da el serial instantáneamente muchisimos estados de LOW y HIGH, estando como bien digo con el pin6 a GND, hasta que finalmente se queda en low despues de 10 variaciones.

HIGH

Cierre del circuito
LOW
HIGH
LOW
HIGH
LOW
HIGH
LOW
HIGH
LOW
HIGH
LOW

Alguien sabria decirme por que me ocurre esto?

Un saludo

estoy obteniendo un comportamiento muy raro en serial

No es nada raro, tu código esta haciendo lo que tu le pides, eso es el efecto del rebote en tu pulsador. Agrega un debounce y tu problema se tiene corregir

RIG:
No es nada raro, tu código esta haciendo lo que tu le pides, eso es el efecto del rebote en tu pulsador. Agrega un debounce y tu problema se tiene corregir

Buenas,

Si, la verdad consegui solucionarlo un poco con un delay de 5, supongo que con millis al fin y al cabo es mejor, aunque un delay de 5 tampoco es gran cosa.
Lo que tambien probe fue a usar este otro codigo mucho mas sencillo con un interruptor tambien:

 void setup() {
  pinMode(6, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
      Serial.println(digitalRead(6));
}

Y sin embargo, veia todos los prints de 0 a 1, pero cuando cambiaban de 0 a 1, no veia nada similar a esos rebotes tipo: 0 1 0 1 0 1 0.

Sabrias decirme por que en ese caso no salian esos rebotes?

Un saludo

Sabrias decirme por que en ese caso no salian esos rebotes?

En realidad los rebotes si suceden, lo que pasa es que en el primer código solo imprimes en el monitor cada cambio de estado del boton,por eso alcanzas a ver el 101010 pero en el segundo código estas imprimiendo el estado del boton cada ciclo del loop, por lo tanto son muchísimos datos por segundo, entonces los rebotes se imprimen algo así:

1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
0
0
0
0
0

Yo lo haria de esta manera para imprimir el cambio de estado del boton:

bool oldState = 1;
bool newState = 1;
unsigned long db=60;    // Tiempo antirrebote
unsigned long actual=0;     // para capturar millis()


void setup() {
  pinMode(6, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("HIGH");
}

void loop() {

  newState= digitalRead(6);

  if  (!newState && oldState && millis() - actual >= db) {
        Serial.println("LOW"); 
        actual=millis();
       }

     
  if ( newState && !oldState && millis() - actual >= db) {
       Serial.println("HIGH");
       actual=millis();
       }

        oldState = newState;
  }

pruebalo y juega con el tiempo antirrebote (la variable db) cambiando los valores, con eso puedes saber cuanto tiempo dura rebotando tu pulsador

Perfecto,

Probare asi.

Muchas gracias :smiley: