Lectura fantasma boton

Buenos dias!

Este es mi primer post y llevo tiempo trasteando de manera intermitente con arduino.

Os presento mi problema.
El otro dia me plante hacer una bomba dummy al estilo Counter Strike. He copiado un codigo pre-existente y lo he modificado.

Al arrancar el proyecto, se inicia una secuencia y una cuenta atras.Al mantener pulsado el boton y cuando haga internamente una cuenta de 5 ejecuta otra parte del codigo que la desactiva.

El proyecto esta montado sobre un arduino UNO con 3 LEDS, 1 Speaker, y 1 Boton montado en PULL-DOWN, montado todo sobre una protptype shield v5

El problema es que la entrada del boton da falsos estados, aun cuando esta desconectado y no se por que sucede.

He probado a forzar el estado "LOW" para el boton, pero aun desconectando todos los pins me da falso "HIGH".

#define red 8
#define Speaker 12
#define blue 9
#define Green 10

float times;
float delays = 1000;
float delays2 = 500;
float X;


void setup() {
  Serial.begin(9600);
  pinMode(red, OUTPUT);
  pinMode(Speaker, OUTPUT);
  pinMode(blue, OUTPUT);
  pinMode(Green, OUTPUT);
  pinMode(6, INPUT);
  myfunction();

}



void myfunction() {

  delays2 = delays2/2.0;
  
  digitalWrite(Green, HIGH);
  tone(Speaker, 2000, delays2);
  delay(delays2);
  digitalWrite(Green, LOW);
  delay(delays2);
  digitalWrite(Green, HIGH);
  tone(Speaker, 2000, delays2);
  delay(delays2);
  digitalWrite(Green, LOW);
  delay(delays2);
  digitalWrite(Green, HIGH);
  tone(Speaker, 2000, delays2);
  delay(delays2);
  digitalWrite(Green, LOW);
  delay(delays2);
  digitalWrite(Green, HIGH);
  tone(Speaker, 2000, delays2);
  delay(delays2);
  digitalWrite(Green, LOW);
  delay(delays2);

}


void loop() {
    Serial.println(digitalRead(6));
  delays = delays/1.03;



   
  if (times < 1200){
    times += 1;
    tone(Speaker, 4000, delays);
    digitalWrite(red, HIGH);
    delay(delays);                     
    digitalWrite(red, LOW);
    digitalWrite(Speaker, LOW);   
    delay(delays); 
  }
   
     if (times == 1200){
   tone(Speaker, 500, 3000);
   digitalWrite(blue, HIGH);
   delay(19999999);
   
  }
      
  if (digitalRead (6) == HIGH){
      X +=1;
      digitalWrite(blue, HIGH);
      tone(Speaker, 3600, delays);
      delay(1000);
      digitalWrite(blue, LOW);
      digitalWrite(Speaker, LOW);  
      delay(1000);
  }
  
  if (X == 4 ){
      times = 1230;
      defuse();

 
  } 
 

}


   

      
void defuse() {

      digitalWrite(Green, HIGH);
      tone(Speaker, 2000, 100);
      delay(100);
      digitalWrite(Green, LOW);
      digitalWrite(blue, HIGH);
      tone(Speaker, 1000, 100);
      delay(100);
      digitalWrite(blue, LOW);
      digitalWrite(red, HIGH);
      tone(Speaker, 2000, 100);
      delay(100);
      digitalWrite(red, LOW);
      delay(100);
      digitalWrite(Green, HIGH);
      delay(1999999);
      
}

Muchas gracias!

Las protoboard suelen tener falsos contactos, prueba soldando.
Si sigue fallando prueba en PULLUP.
Prueba volviendo a comprobar la entrada despues de 300-400ms si sigue activa.

Esta sería la forma chapuza pero rápida de hacerlo, te recomiendo que leas sobre el uso de millis en la sección documentación, el delay paraliza todo el código hasta que pasa el tiempo.

if (digitalRead (6) == HIGH) {
  delay(300);
  if (digitalRead (6) == HIGH) {

Gracias krnlpanic
Justo hace un rato estaba invenstigando con el milis :slight_smile:

He probado a meterle el delay en la funcion, y la verdad es que se aguanta mas estable, seguire trasteando por eses 2 lados a ver si el boton recive mucho ruido o es tema del delay que al final proboca que se vuelva un poco loco el codigo.

Lo que mas me sorprende es que aun teniendo todo lo relacionado con el boton desconectado, exista generando de vez en cuando una señal fantasma de "HIGH", porque de hecho cuando trasteaba con el circuito en la protoboard directamente al arduino no me genereaba esta falsa señal.

Seguire investigando a ver como queda la cosa.

Muchas gracias y a ver si conseguimos esclarecer esta señal fantasma.

FunkyNice:
El proyecto esta montado sobre un arduino UNO con 3 LEDS, 1 Speaker, y 1 Boton montado en PULL-DOWN, montado todo sobre una protptype shield v5

El problema es que la entrada del boton da falsos estados, aun cuando esta desconectado y no se por que sucede.

Consulta: Con PULL-DOWN te refieres a que pusiste una resistencia de 10K entre el pin 6 y GND y el pulsador de pin 6 a +5V ?

Lo menciono porque los "falsos estados" se producen cuando los pines están al aire (sin resistencia de 10K).

Desde que tu código inicia te deberia dar puros ceros cada "delay" (aprox 1 seg) sin presionar pulsador y SOLO al presionar bastante rato te saldria 1.

FunkyNice:
Al arrancar el proyecto, se inicia una secuencia y una cuenta atras. Al mantener pulsado el boton y cuando haga internamente una cuenta de 5 ejecuta otra parte del codigo que la desactiva.

Segun tu codigo cuando arranca Arduino

Kike_GL:
Consulta: Con PULL-DOWN te refieres a que pusiste una resistencia de 10K entre el pin 6 y GND y el pulsador de pin 6 a +5V ?

Lo menciono porque los "falsos estados" se producen cuando los pines están al aire (sin resistencia de 10K).

Si he conectado la resistencia de 10K entre el el pin 6 y el GND

Imagen referencia
RG51JMC.png

Tambien he probado con el PULL-UP, con la resistencia entre el pin 6 y +5v. Pero me funciona mejor con el PULL-DOWN.

Kike_GL:

FunkyNice:
Al arrancar el proyecto, se inicia una secuencia y una cuenta atras.Al mantener pulsado el boton y cuando haga internamente una cuenta de 5 ejecuta otra parte del codigo que la desactiva.

Segun tu codigo cuando arranca Arduino

La verdad es que no lo he expresado bien :confused: cuando arranca el arduino se inicia una secuencai de delays, con una variable que hace que en cada loop ese delay sea mas pequeño, al mismo tiempo que realiza una suma de 1 a X, cuando ese numero llega a Z salta a otra parte del codigo que termina con un delay muy largo. Al mantener pulsado el boton, en cada loop suma +1 a una variable, al llegar a 4 hace saltar otra parte del codigo.
Supongo que con el codigo se entiende, pero para proximas consultas voy a tener que empezar a poner bien la descripcion del codigo.

Por cierto, ayer por la tarde estuve recircuitando todo, cambiando todos los componentes, y actualmente no me da fallo, ire probando en los siguientes dias e informando, a parte le voy a pasar el multimetro a los componentes a ver si dan alguna lectura extraña.

RG51JMC.png