Go Down

Topic: Boton arcade con led (Read 112 times) previous topic - next topic

marcnkm

Apr 22, 2018, 11:19 am Last Edit: May 11, 2018, 01:51 am by surbyte
Hola,

Estoy iniciándome en esto del Arduino, y me está costando mucho.

Quería empezar haciendo un juego de luces. Para ello dispongo de los siguientes botones:
https://shop.edwinrobotics.com/726-thickbox_default/medium-sized-flat-arcade-button-with-led-backlight.jpg

Las conexiones la realizo de la siguiente manera: (no he puesto un diagrama de fritzing porque no encuentro los elementos)
Placa: arduino mega

Entrada led al PIN 2
Salida led a GND

switch:
Common a 5V
Normal Open: al pin 42
Normal Closed: sin conexión

No utilizo ninguna resistencia por ningún lado, y creo que debería poner una antes del led? es así o me equivoco?
Creéis que tengo bien realizadas las conexiones?

Para empezar la idea es tener 1 o 2 luces conectadas al arduino, y cuando pulse el botón se encienda la luz. Y cuando lo dejo de presionar la luz se apague.

Os dejo el código que estoy usando para esta prueba con 1 luz, pero el funcionamiento no es el esperado. (el led siempre esta activo)

El código de la función debounce fue copiado de internet.

Code: [Select]

const int LED = 2;
const int inputPin = 42;
const int debounceDelay = 200;  // milliseconds to wait until stable
int ledState=0;


// debounce returns the stable switch state
boolean debounce(int pin)
{
 boolean state;
 boolean previousState;

 previousState = digitalRead(pin);          // store switch state
 for(int counter=0; counter < debounceDelay; counter++)
 {
     delay(1);                  // wait for 1 millisecond
     state = digitalRead(pin);  // read the pin
     if( state != previousState)
     {
        counter = 0; // reset the counter if the state changes
        previousState = state;  // and save the current state
     }
 }  
 return state;
}


void setup() {
  // put your setup code here, to run once:

pinMode(LED, OUTPUT);
pinMode(inputPin, INPUT);
}

void loop()
{
 if(debounce(inputPin) == true){
   //  call your function to change values here
   ledState = !ledState;
  
   digitalWrite(LED,HIGH);
 }
 else{
  digitalWrite(LED,LOW);
 }
}


Gracias por la ayuda.

ArduMyth

#1
Apr 22, 2018, 12:14 pm Last Edit: Apr 22, 2018, 12:27 pm by ArduMyth
Hola marcnkm. Gracias por poner el código entre TAGS y respetar las normas pese a ser tu primer comentario. No es lo habitual.

Respecto al código:
Lo siento, esta TODO mal

Las variables de los estados del botón (estado previo y actual) deben ser globales y en tu caso son locales dentro de una función. Sé que retornas la actual y es global pero la previa no.
Usas un "timer" con delay. Nótese el entrecomillado.
Cuentas el tiempo del debounce con un bucle for. No tiene sentido tampoco.
Tengo curiosidad. De dónde sacaste esa forma de "¿Debounce"? ¿Salió de alguna web?

Los pines de Arduino dan un amperaje que si sobrepasa lo necesario para un led evidentemente su vida útil se acorta o directamente bye byeee.

Yo con la imagen no puedo saber el Votaje o Amperaje que necesitan esos botones con led porque no los he usado y es una información que si no la buscas tú y la proporcionas al foro, pues... yo no la voy a buscar, pero sí te comento que un led de los que suelen venir en los kits necesitará 5V y una resistencia de 220. (Esto está en cualquier web que consultes usando google)

Ve a los tutoriales que tiene el foro para el uso correcto de un timer usando millis()
https://forum.arduino.cc/index.php?topic=311734.0

Saludos.

Kike_GL

No nos comentar que modelo de Arduino tienes. Mega ?

El código que copiaste esta muy bien tu problema es solo de hardware.

1. Debes poner SIEMPRE un resistencia de 220 ohms en serie con el LED. Es decir anado del LED (pata mas larga) a pin 2, catodo a la resistencia 220 y la otra pata de resistencia a GND.

2. El pulsador debe tener una pata en +5V y la otra en el pin que usaras (42 es solo para Arduino Mega)

3. Debes poner una resistencia de 10K entre el pin 42 y GND.

La funcion de usuario debounce() es para evitar el "efecto rebote" que producen normalmente los contactos metalicos al juntarse.
Saludos, Kike_GL

marcnkm

#3
May 06, 2018, 12:09 pm Last Edit: May 11, 2018, 01:51 am by surbyte
Hola,
Primero de todo gracias por la ayuda.

Si utilizo un Arduino Mega, ya que el proyecto consta de 10 luces y con un Arduino UNO no tenia entradas y salidas suficientes.

Que lio, uno me dice que esta bien y el otro que esta mal el codigo. La verdad que llevo dias intentando provar la funcion pero no doy con ninguna solucion.

Ahora estaba provando con la funcion de "debounce" que tiene arduino en sus tutoriale:
https://www.arduino.cc/en/Tutorial/Debounce

Pero tampoco me acaba de funcionar. Algo tengo que hacer mal, pero no se el que.

Os explico un poco mejor qual es mi idea, para ver si la estoy haciendo bien.

La idea es tener 10 botones arcade con led como los del siguiente enlace:



Al encender el arduino el 1r boton tendra el led activo y los demas apagado. Al pulsar el 1r boton, el led se apagara y se encendera el led del siguiente boton. Y asi succesivamente.

Entiendo que hago bien al querer utilizar la funcion debounce para el rebotes, o estoy equivocado?


Moderador: Enlace e imagen editados

Go Up