Go Down

Topic: ayuda operación con pulsadores (Read 758 times) previous topic - next topic

mrjtwo


que tal a todos estoy tratando de hacer una operacion que es facil en otros entornos de programacion como c++ pero en arduino no he podido, la idea es la siguiente que al tener un valor y oprima el pulsador se sume y si lo vuelvo a presionar vuelva a sumar así consecutivamente hasta un limite y en sentido viceversa restando...

esto es lo que llevo, por favor corrijanme que soy novato:

Code: [Select]
int a;   int b; int z;
int pul1 = 2;   int p1 = 0;
int pul2 = 8;   int p2 = 0;
int s7;   int v7;    int c8;
void setup() {
pinMode(pul1, INPUT);
pinMode(pul2, INPUT);
Serial.begin(9600);
}
void loop() {
c8 = digitalRead(pul1);
v7 = digitalRead(pul2);
if ((v7 == HIGH)&&(z=12)) { 
(a = 39);
(b = a+z);
}
if (v7 == LOW){
(z==0);
}
if ((c8 == HIGH)&&(z=12)) {

(a = 39);
(b = a-z);

if (c8 == LOW){
(z==0);
}

s7 = digitalRead(pul1);
if (s7 == HIGH) {
a = 36;
no(159,b,127);         
}
if (s7 == LOW ) {
a = 36;
no(143,b,0);       
}   
}
void no(byte cmd, byte note, byte velocity){
Serial.println(cmd);
Serial.println(a); <<<<< este valor se debe sumar y restar al presionar los pulsadores
Serial.println(velocity);
delay(1000);
}


gracias espero que puedan ayudar

jorgepl

#1
May 10, 2012, 11:55 am Last Edit: May 10, 2012, 11:58 am by jorgepl Reason: 1
No termino de entender que es lo que quieres hacer. Corrígeme si me equivoco, pero creo que pretendes que:

- Si pulsas pul1 y z es 12, pones a=39 y b=a+z=39+12=51
- Si sueltas (no pulsas) pul1, pones z=0
- Con pul2 haces lo mismo pero restando z (b=a-z=39-12=27)
- Si está pulsado pul1 envías por el puerto serie "159,36,127"
- Si no está pulsado pul1 envías por el puerto serie "143,36,0"

Si es así:
1. En las condiciones tienes que utilizar el operador '==' y en las asignaciones '='
Code: [Select]

if ((v7 == HIGH)&&(z==12)) { 
(a = 39);
(b = a+z);
}
if (v7 == LOW){
(z=0);
}


2. El valor z no lo modificas nunca, solo lo pones a cero cuando el pulsador está en bajo, por lo que nunca cumplirá la condición (z==12) ni entrará en el if.

3. No filtras en ningún sitio los posibles rebotes del pulsador, por lo que te puede dar falsos positivos.

4. Puedes utilizar la variable z como filtro de rebotes (aunque 12 ciclos de programa es, quizá, poco tiempo y tendrías que añadir un delay()). Este código solucionaría los puntos 2 y 3 (con las suposiciones que he hecho, claro), aunque deberías utilizar otra variable para el pulsador pul2:
Code: [Select]

if ((v7 == HIGH))
{
  z++;
  if(z==12)
  {
    a = 39;
    b = a+z;
  }
  delay(10);  // Para filtrar rebotes (pulsación > 10*12 milisegundos)
}
if (v7 == LOW)
{
  z=0;
}


5. ¿Por qué utilizas variables y sumas, si luego las utilizas como constantes?
Dentro del if:
Code: [Select]

if ((v7 == HIGH)&&(z=12)) { 
(a = 39);
(b = a+z);
}

puede sustituir las dos asignaciones directamente por:
Code: [Select]

b=51;

porque siempre que utilizas a (más abajo en la llamada a la función no()) le asignas el valor que quieres utilizar en ese momento y no haces operaciones con ella.

6. Te has dejado de cerrar el paréntesis del if que comprueba si pul2 está en alto.

7. ¿Por qué lees dos veces el valor del pulsador pul1 y primero le das valor a=39 y después a=36? Puedes hacerlo todo dentro del mismo if

8. ¿Para qué le pasas como parámetro a la función no() el valor b si luego no lo utiliza? ¿Si utiliza a, por qué no se lo pasas (aunque no hace falta porque es pública, igual que b)? ¿Para qué utilizas la variable a en la función no() si en la función no() siempre va a valer 36?

9. ¿Por qué pones casi todas las asignaciones de variables entre parentesis?  :smiley-roll-sweat:

Si lo que quieres hacer es otra cosa, creo que tendrías que explicarlo mejor para poder analizar el código.

mrjtwo

bueno vuelvo a poner el codigo que me equivoque en algo

Code: [Select]
int a;   int b; int z;
int pul1 = 2;   int p1 = 0;
int pul2 = 8;   int p2 = 0;
int s7;   int v7;    int c8;
void setup() {
pinMode(pul1, INPUT);
pinMode(pul2, INPUT);
Serial.begin(9600);
}
void loop() {
c8 = digitalRead(pul1);
v7 = digitalRead(pul2);
if ((v7 == HIGH)&&(z=12)) { 
(a = 39);
(b = a+z);
}
if (v7 == LOW){
(z==0);
}
if ((c8 == HIGH)&&(z=12)) {

(a = 39);
(b = a-z);

if (c8 == LOW){
(z==0);
}

s7 = digitalRead(pul1);
if (s7 == HIGH) {
a = 36;
no(159,b,127);         
}
if (s7 == LOW ) {
a = 36;
no(143,b,0);       
}   
}
void no(byte cmd, byte note, byte velocity){
Serial.println(cmd);
Serial.println(b); <<<<< este valor se debe sumar y restar al presionar los pulsadores
Serial.println(velocity);
delay(1000);
}


la idea es que cada vez que oprima s7 el valor de b sea constante y al presionar v7 o c8 se sume o se reste este valor con 12 osea z=12 si a=39

lo que trato de hacer es algo parecido en C++ aqui dejo el ejemplo, ya lo hize con un pic pero no he podido realizarlo en arduino:

void main(void)

{int a=0,b=0, c=0, d=0, e=0, f=0, g=0, h=0, i=0, j=0, k=0, l=0, m=0, n=0;
set_tris_a( 0xff );
set_tris_b( 0xff );
set_tris_e( 0xff );

while(true)
      {

      if(input(PIN_E0)==1)
{a=a+12;
while(input(PIN_E0)==1)
                        {}}
if(input(PIN_E1)==1)
{a=a-12;
while(input(PIN_E1)==1)
                        {}}
      if ((input(PIN_B7)==1)&&(b==0))
         {

            fputc(146,mic);
            fputc(60+a,mic);
            fputc(126,mic);

                       b=5;}
    if ((input(PIN_B7)==0)&&(b==5))
           { fputc(130,mic);
            fputc(60+a,mic);
            fputc(126,mic);

       b=0;  }
  if ((input(PIN_B6)==1)&&(c==0))
         {

            fputc(146,mic);
            fputc(61+a,mic);
            fputc(126,mic);

          c=5;   }
          if ((input(PIN_B6)==0)&&(c==5))
            {fputc(130,mic);
            fputc(61+a,mic);
            fputc(126,mic);

     c=0;    }
  if ((input(PIN_B5)==1)&&(d==0))
         {

            fputc(146,mic);
            fputc(62+a,mic);
            fputc(126,mic);
       d=5;      }
        if ((input(PIN_B5)==0)&&(d==5))
         {
            fputc(130,mic);
            fputc(62+a,mic);
            fputc(126,mic);

      d=0;   }
   if ((input(PIN_B4)==1)&&(e==0))
         {

            fputc(146,mic);
            fputc(63+a,mic);
            fputc(126,mic);
         e=5;    }
          if ((input(PIN_B4)==0)&&(e==5))
         {
            fputc(130,mic);
            fputc(63+a,mic);
            fputc(126,mic);

   e=0;      }
    if ((input(PIN_B3)==1)&&(f==0))
         {

            fputc(146,mic);
            fputc(64+a,mic);
            fputc(126,mic);
         f=5;    }
         if ((input(PIN_B3)==0)&&(f==5))
         {
            fputc(130,mic);
            fputc(64+a,mic);
            fputc(126,mic);

     f=0;      }
    if ((input(PIN_B2)==1)&&(g==0))
         {

            fputc(146,mic);
            fputc(65+a,mic);
            fputc(126,mic);
            g=5;}
            if ((input(PIN_B2)==0)&&(g==5))
         {
            fputc(130,mic);
            fputc(65+a,mic);
            fputc(126,mic);

       g=0;  }
    if ((input(PIN_B1)==1)&&(h==0))
         {

            fputc(146,mic);
            fputc(66+a,mic);
            fputc(126,mic);
           h=5;  }
           if ((input(PIN_B1)==0)&&(h==5))
         {
            fputc(130,mic);
            fputc(66+a,mic);
            fputc(126,mic);
h=0;
         }
    if ((input(PIN_B0)==1)&&(i==0))
         {

            fputc(146,mic);
            fputc(67+a,mic);
            fputc(126,mic);
             i=5;}
             if ((input(PIN_B0)==1)&&(i==5))
         {
            fputc(130,mic);
            fputc(67+a,mic);
            fputc(126,mic);
i=0;
         }
    if ((input(PIN_A0)==1)&&(j==0))
         {

            fputc(146,mic);
            fputc(68+a,mic);
            fputc(126,mic);
             j=5;}
              if ((input(PIN_A0)==0)&&(j==5))
         {
            fputc(130,mic);
            fputc(68+a,mic);
            fputc(126,mic);
j=0;
         }
     if ((input(PIN_A1)==1)&&(k==0))
         {

            fputc(146,mic);
            fputc(69+a,mic);
            fputc(126,mic);
             k=5;}
              if ((input(PIN_A1)==0)&&(k==5))
         {
            fputc(130,mic);
            fputc(69+a,mic);
            fputc(126,mic);
k=1;
         }
    if ((input(PIN_A2)==1)&&(l==0))
         {

            fputc(146,mic);
            fputc(70+a,mic);
            fputc(126,mic);
           l=5;  }
           if ((input(PIN_A2)==0)&&(l==5))
         {
            fputc(130,mic);
            fputc(70+a,mic);
            fputc(126,mic);
l=0;
         }
  if ((input(PIN_A3)==1)&&(m==0))
  {

            fputc(146,mic);
            fputc(71+a,mic);
            fputc(126,mic);
        m=5;    }
        if ((input(PIN_A3)==0)&&(m==5))
  {
            fputc(130,mic);
            fputc(71+a,mic);
            fputc(126,mic);

        m=0;   }
if ((input(PIN_A4)==1)&&(n==0))
         {

            fputc(146,mic);
            fputc(72+a,mic);
            fputc(126,mic);
           n=5; }
           if ((input(PIN_A4)==0)&&(n==5))
         {
            fputc(130,mic);
            fputc(72+a,mic);
            fputc(126,mic);
n=0;
         }
}
}

gracias!

jorgepl

Quote

la idea es que cada vez que oprima s7 el valor de b sea constante y al presionar v7 o c8 se sume o se reste este valor con 12 osea z=12 si a=39


Sigues sin explicarte muy bien: ¿Qué tiene que ver a con b? ¿Cuánto vale b al inicio? ¿Cómo cambia a? ¿Y z, vale 12 sólo cuando a vale 39? ¿Se suma/resta una vez o cada vez que se acciona un pulsador? ¿Y los otros puntos que te he planteado antes?

Lo mejor es que, como han comentado en un post hoy, plantees un diagrama de flujo (un pequeño esquema) de lo que quieres hacer. Eso te ayudará a hacerlo y a los demás nos aclarará como ayudarte:

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

Te dejo un código que hace lo que yo creo que has dicho, pero que seguro que no es lo que quieres:

Code: [Select]

#define VALOR_B_CONSTANTE 39

// Pines de los pulsadores
int pul1 = 2;   // Pulsador 1
int pul2 = 8;   // Pulsador 2
int pul3 = 3;   // Pulsador 3

int b = VALOR_B_CONSTANTE;
int s7;   
int v7;   
int c8;

void setup()
{
  // Entradas
  pinMode(pul1, INPUT);
  pinMode(pul2, INPUT);
  pinMode(pul3, INPUT);

  // Puerto serie
  Serial.begin(9600);
}

void loop()
{
  // Leemos los pulsadores
  c8 = digitalRead(pul1);
  v7 = digitalRead(pul2);
  s7 = digitalRead(pul3);

  if(s7 == HIGH)  // Si pulsamos Pulsador 3 (s7)
  {
    b = VALOR_B_CONSTANTE;
    delay(200);   // Para evitar rebotes
  }
  else
  {
    if(v7 == HIGH)  // Si pulsamos Pulsador 2 (v7)
    {
      b = VALOR_B_CONSTANTE + 12;      // Suma 12 al valor constante
      delay(200);   // Para evitar rebotes
    }
    else if(c8 == HIGH) // Si pulsamos Pulsador 1 (c8)
    {
      b = VALOR_B_CONSTANTE - 12;      // Resta 12 al valor constante
      delay(200);   // Para evitar rebotes
    }
  }
}


PD: Utiliza la etiqueta de código para insertarlo (botón # en la barra superior) cuando escribes un post, eso ayuda a que se pueda ver y entender mejor.

mrjtwo

pues b seria el valor resultante de la suma o resta al presionar los pulsadores

Go Up