Go Down

Topic: 1 Pulsador 2 Led´s (Read 8208 times) previous topic - next topic

Nataly

Sep 20, 2012, 08:11 am Last Edit: Sep 22, 2012, 07:58 am by Nataly Reason: 1
Hola Amigos de Arduino habla Hispana, recién me acaban de regalar una placa Arduino UNO r3 y estoy muy contenta realizando pequeñas pruebas con ella.

Tengo una duda y es la siguiente:

En base a la información básica de referencia, me dispuse a realizar un experimento sencillo utilizando 2 led´s, 2 resistencias de 220 ohmios para protegerlos en los pines digitales 10 y 11 y un mini pulsador con su debida resistencia pull-down de 10k ohmios conectada al pin 5.

Mi objetivo es:

* Usar un solo pulsador para controlar 2 led´s
* Al presionarlo la primera vez que encienda y apague el Led 1.
* Al presionarlo por segunda vez que encienda y apague el Led 2.
* Que se repita nuevamente el proceso.

Usando VirtualBreadBoard estoy representando mi escenario en forma grafica:



El código que he intentado programar es el siguiente:

Code: [Select]
int led1=10,led2=11,pulse=5;

void setup()
{
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(pulse,INPUT);
}

int x=0;

void loop()
{
switch(x)
{
case 1:
if (digitalRead(pulse) == HIGH){digitalWrite(led1,HIGH);} else {digitalWrite(led1,LOW);}
break;
case 2:
if (digitalRead(pulse) == HIGH){digitalWrite(led2,HIGH);} else {digitalWrite(led2,LOW);}
break;
}
}


La variable x tiene un valor 0, únicamente de referencia.

Mis dudas son las siguientes:

* Como hacer que la variable x cambie de valor 1,2,1,2,1,2... cada vez que se repita la función loop() ?

He intentado de varias formas, colocando x++, colocando condicionales como if (x=2){x=0;}
En algo estoy fallando y agradecería un poco de ayuda.

Humildemente agradecida.

Nataly.
You can do it, If you want!

fermg

Yo la verdad que soy bastante nuevo con lo del arduino pero lo que quieres hacer yo lo haría de la siguiente manera:

despues del

void loop()
{
if (digitalRead(pulse)==HIGH)
{
x++; // asi le sumamos 1 a la variable x.
delay(5);
if ( x > 2) // si x es mayor de 2 x igual a 1.
{
x=1;// aqui lo que hacemos es si x va a ser mayor de 2 pasamos de nuevo el valor a 1 yo lo pondria en cero para poder apagar los 2 led
      // por completo
}
}

luego lo que haces es poner los casos que quieras con el swicht.

Nataly

Gracias Amigo fermg por responder.

Hice el arreglo basado en tu ayuda de la siguiente manera:

Code: [Select]
int led1=10,led2=11,pulse=5;

void setup()
{
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(pulse,INPUT);
}

int x=0;

void loop()
{
if (digitalRead(pulse)==HIGH){x++;}
delay(5);
if ( x > 2){x=0;}

switch(x)
{
case 1:
if (digitalRead(pulse) == HIGH){digitalWrite(led1,HIGH);} else {digitalWrite(led1,LOW);}
break;
case 2:
if (digitalRead(pulse) == HIGH){digitalWrite(led2,HIGH);} else {digitalWrite(led2,LOW);}
break;
}
}


Si bien cada vez que presiono el pulsador hay una interacción, los resultados en los led´s son:

* A veces encienden los 2 led´s.
* A veces no enciende ninguno.
* A veces enciende el led 1.
* A veces enciende el led 2.
* A veces enciende 1 led y el otro led enciende y apaga.

Por ahí va la cosa, pero algo le falta.

Gracias de igual manera.

Nataly.

You can do it, If you want!

eried

¿Cual es tu idea?

pulsas -> led1 on, led2 off
pulsas -> led1 off, led2 off
pulsas -> led1 off, led2 on
pulsas -> led1 off, led2 off
pulsas -> led1 on, led2 off
...

Así?

Te falta tambien alguna forma como evitar que al pulsar pase varias veces por esa sección del código (recuerda que el código se ejecuta rápidamente y quizas no alcanzas soltar el botón)
My website: http://ried.cl

fermg

Hola a todos, pero quieres dejar encida la luz solo cuando tengas pulsado el boton o durante un tiempo determinado

Por ejemplo, cuando pulso el boton enciendo y cuando suelto se apague, o que cuando pulse se encienda el led 5000 milisegundos y se apague, por lo que entiendo por tu codigo es la primera la de cuando este pulsado se encianda y se apague cuando se suelte no?.

tambien te digo que tu has puesto el if(x>2) {x=0;} y el caso 0, no lo contempla el swicht pero no se si eso tendra algún problema.

El antirrebote lo puedes hacer con el codigo antideboucing como a comenta el compi Eried o yo lo que hago es un delay(50) justo despues de entrar en el if(.......).

ejemplo:

if(digitalRead(pulse)==HIGH)
{
  delay(50); // una vez que entra en el if hace una espera, y luego cuenta, haz la prueba
  x++;
}


un saludo a todos.

Fermg.

Nataly

Primero que nada, Gracias a ambos por el interés de ayudarme.

Ok, lo que quiero hacer es que cuando cargue el programa:
1 ambos led´s esten apagados
2 cuando presione el pulsador, se encienda y quede encendido el led1 y el led2 se mantenga apagado.
3 cuando vuelva a presionar el pulsador, se apague el led1, se encienda el led2 y se quede encendido.
4 cuando vuelva a presionar el interruptor se repita desde el paso 2.

Creo que lo que sucede, es que como se ejecuta muy rápído el código, los valores de la variable x pasan de 0, 1 a 2 muy rápido y por eso el descontrol como dice el amigo eried, voy a probar lo que dices fermg. El anti rebote a ver.
You can do it, If you want!

#6
Sep 20, 2012, 08:19 pm Last Edit: Sep 20, 2012, 08:29 pm by JRodrigo Reason: 1
Este seria tu código modificando algunas de las cosas que le faltan, creo que hace lo que quieres pero no lo he probado simplemente lo he compilado para ver que no tuviera errores.

Quote
int led1=10,led2=11,pulse=5;

void setup()
{
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(pulse,INPUT);
}

int x=3;
boolean y= true;

void loop()
{
 
if (digitalRead(pulse)==HIGH && y==false){
    x++;
    y = true;
  } else if (digitalRead(pulse)!=HIGH) {
    y = false;
  }


if ( x > 3){x=0;}

switch(x)
{
case 0:
  digitalWrite(led1,HIGH);
break;
case 1:
  digitalWrite(led1,LOW);
break;
case 2:
  digitalWrite(led2,HIGH);
break;
case 3:
  digitalWrite(led2,LOW);
break;

}
}


En negrita te puesto lo que he añadido, especialmente he puesto la variable y que seria para evitar en cada loop del programa te sume x++, por eso hacían lo que querían las LED's, faltaría añadir algo más de código para evitar rebotes en el botón.

Si no entiendes alguna de las otras partes preguntar no hace daño  ;)

Edito:
Creo que el switch case no era lo que querías  :smiley-roll-sweat:, pero para hacer la función de al soltar se apague utiliza nuevamente la variable y.

Un saludo!

eried

Para aprender, yo creo que es necesario que hagas algunas funciones simples:

Code: [Select]
#define LED1 10
#define LED2 11
#define BOTON 5

void setup()
{
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  pinMode(BOTON,INPUT);
  estadoLeds(LOW,LOW);
}

boolean s = HIGH;
void loop()
{
  esperaBoton();
  estadoLeds(s,!s);
  s=!s;
}

void esperaBoton()
{
  do {  }while(digitalRead(BOTON)==LOW); // Espera hasta que presionen
  do {  }while(digitalRead(BOTON)==HIGH); // Hasta que lo suelten
}

void estadoLeds(boolean led1, boolean led2)
{
  digitalWrite(LED1,led1);
  digitalWrite(LED2,led2);
}


Y ahora para recordarlo, lo haces para 3 leds :D
My website: http://ried.cl

Nataly

jaja, muchas gracias por la ayuda, esto en verdad me enseña a comprender mejor las cosas y el funcionamiento de las entradas y salidas de arduino desde diferentes puntos de vista, Así que muy agradecida y feliz!!
You can do it, If you want!

pacoooh

Hola nataly!!!

prueba este código, compila bien pero no lo he probado, animo...

Code: [Select]

enum _estadoBoton  // Creamos un tipo nuevo
{
  noPulsado=0,
  pulsado=1,
};
enum _opcionesBoton
{
  ledsApagados=0,
  led1Encendido=1,
  led2Encendido=2,
};


struct teclado{// creamos una estructura para recoger datos de la variables
               // y sus funciones
 
  int pinBoton;
  int pinLed1;
  int pinLed2;
  _estadoBoton estadoBoton;  // cremos una variable de tipo _estadoBoton
  _opcionesBoton opcionBoton;// cremos una variable de tipo _opcionesBoton

  void compruevaEstadoBoton(){
    if (digitalRead(pinBoton)==HIGH && estadoBoton==noPulsado){
      estadoBoton=pulsado;
      sumaOpcion();
      actuaOpcion(opcionBoton);

    }
    else
      if (digitalRead(pinBoton)==LOW){
      estadoBoton=noPulsado;

    }
  }

  void sumaOpcion(){
    if (opcionBoton==ledsApagados){
      opcionBoton=led1Encendido;
    }
    if (opcionBoton==led1Encendido){
      opcionBoton=led2Encendido;
    }
    if (opcionBoton==led2Encendido){
      opcionBoton=ledsApagados;
    }


  }

  void actuaOpcion(_opcionesBoton opcion){
    if (opcion==ledsApagados){
      digitalWrite(pinLed2,LOW);
    }
    if (opcion==led1Encendido){
      digitalWrite(pinLed1,HIGH);
    }
    if (opcion==led2Encendido){
      digitalWrite(pinLed1,LOW);
      digitalWrite(pinLed2,LOW);
    }

  }
}
botones[1];// incrementando el valor obtendremos mas botones


void setup(){
  botones[1].pinBoton=5;// definimos los valores dentro de la estructura de datos
  botones[1].pinLed1=10;// del boton 1
  botones[1].pinLed2=11;
// si quisieramos mas botones:
/*
botones[0].pinBoton=4;
botones[0].pinLed1=9;
botones[0].pinLed2=8;
*/
// definimos los pines
  pinMode(botones[1].pinBoton,INPUT);
  pinMode(botones[1].pinLed1,OUTPUT);
  pinMode(botones[1].pinLed2,OUTPUT);

/*pinMode(botones[0].pinBoton,INPUT);
  pinMode(botones[0].pinLed1,OUTPUT);
  pinMode(botones[0].pinLed2,OUTPUT);*/

}


void loop(){
  // llamo a la función para controlar el estado del boton 1
  botones[1].compruevaEstadoBoton();
   // llamo a la funcion para controlar el estado del boton 0
//botones[0].compruevaEstadoBoton();

}




Nataly

Ese ultimo código compila bien, pero si se asignan los valores de los pines correspondientes a las variables pinBoton, pinLed1 y pinLed2 al compilarlo me da error y no se por qué.
You can do it, If you want!

fermg

Hola te importaría pobrar este codigo? ya se que es mucho más simple y poco sofisticado que el de los demas pero compilar compila y a mi me a funcionado no se si es lo que quieres pero tienes la base para hacerlo. puedes cambiar los if por swicht como hiciste tu, espero haberte ayudado yo tampoco se mucho más de esto, pero bueno entre todos seguro que lo hacemos.

Code: [Select]


int boton = 5;     
int led1 = 10;   
int led2 = 11;   
int estado = 0; 
int x = 1;       

void setup() {
  // initialize the LED pin as an output:
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(boton, INPUT);     
}

void loop(){
  // read the state of the pushbutton value:
  estado = digitalRead(boton); // miramos como esta el estado del boton

    if(estado == HIGH)        // si está alto entra en el bucle
  {
    delay(50);                          //para que no cuente varias veces un delay
    x++; //le suma 1 a x.
    if(x > 2) // aqui si x es mayor de 2
    {
      x = 1; // x igual a 1.
    }
  }

  if (x == 1) // si x es igual a 1 enciende el led1 y el led2 apagado
  {
    digitalWrite(led1, HIGH);
    digitalWrite(led2, LOW);
  }
  if ( x == 2) // si x es igual a 2 enciende el led2 y el led1 apagado
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
  }
}


un saludo a todos y gracias por compartir vuestros conocimientos

un saldo Fermg.

Nataly

Ese codigo Fermg, lo compilé con mi arduino, pero al probarlo en la plca, cada vez que presiono el interruptor, ambos led´s parpadean muy rapido, cambiando de posición pero lo hacen muy rápido.
El código que hace realmente lo que buscaba en el experimento es el siguiente:

Code: [Select]
int led1=10,led2=11,pulse=5;

void setup()
{
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(pulse,INPUT);
}

int x=3;
boolean y= true;

void loop()
{
  if (digitalRead(pulse)==HIGH && y==false){x++;y = true;}
  else if (digitalRead(pulse)!=HIGH) {y = false;}

if ( x > 3){x=0;}

switch(x)
{
case 0:
  digitalWrite(led1,HIGH);
break;
case 1:
  digitalWrite(led1,LOW);
break;
case 2:
   digitalWrite(led2,HIGH);
break;
case 3:
   digitalWrite(led2,LOW);
break;
}
}


De igual forma Fermg, infinitas gracias por estar pendiente. Ahorita estoy en practicas con la conexión Arduino - Processing. Te invito a que leas el post y compartas tus ideas, a ver que podemos lograr hacer.

http://arduino.cc/forum/index.php/topic,123909.0.html

Muchos besos.

Nataly.
You can do it, If you want!

Go Up