Guardar el numero del pin en una variable

Hola buenas soy nuevo en esto del foro y tengo una pequeña experiencia programando,
una vez la presentacion.
Me gustaria poder guardar en una variable el numero del pin digital INPUT "1,7,13,etc", cual recibio la señal
No quiero guardar el estado del boton (LOW o HIGH),
sino el numero del pin INPUT
El proyecto es para un piano
y necesito saber cual boton fue oprimido, ya que cada una tiene una nota diferente
por eso poder discernir cual boton fue oprimido
si alguien sabe este pequeño enigma y como se llega ese resultado se lo agradeceria mucho

Tampoco es que sea un enigma lo que no se es si es la mejor forma de enfocar el problema . ¿y si pulsas dos o mas teclas para un acorde?. En fin no se lo que tienes en mente. Extrictamente lo que consultas lo puedes conseguir de esta forma:

int pin_pulsado;

void setup() {
  // ponga su código de configuración aquí, para que se ejecute una vez:
  
  Serial.begin (9600);
  for (int x = 2; x < 14; x++) { // Saltamos pines 0 y 1 porque son de comunicaciones
    pinMode (x, INPUT_PULLUP); // todas las teclas PIN  ==> Pulsador ==> GND
  }
}

void loop() {  
  // ponga su código principal aquí, para que se ejecute repetidamente:
  
  pin_pulsado = 100;
  for (int x = 2; x < 14; x++) { // Saltamos pines 0 y 1 porque son de comunicaciones
    if (digitalRead (x) == LOW) {
      pin_pulsado = x;
    }  
  }
  if (pin_pulsado != 100) {
    Serial.print("Tecla pulsada ");
    Serial.println(pin_pulsado);
  }
}

Saludos.

1 Like

Hola @leouno,

Puede utilizar el "proceso" de manipulación de puertos, (PortManipulation), ref: Arduino Reference - Arduino Reference,
para su proyecto.
De esta manera, además de identificar qué pin se activó, puede verificar si se activó más de un pin al mismo tiempo.
Vea un ejemplo simple de manipulación de puertos.

byte pinsD = 0;   // Work variable
byte pinsB = 0;   // Work variable
byte pinsC = 0;   // Work variable
//-----------------------------------------------------------
void setup() {
  Serial.begin(115200);
  for (int x = 2; x < 20; x++) {  //Set all as INPUT and turn on internal PULL_UP resistor
    pinMode (x, INPUT_PULLUP);
  }
}
//-----------------------------------------------------------
void loop() {
  pinsD = PIND;                       // Read D inpput register
  pinsB = PINB;                       // Read B inpput register
  pinsC = PINC;                       // Read C inpput register

  Serial.print("Pins  7 to  0  ");Serial.println(pinsD,BIN);    // Print binary form
  Serial.print("Pins 13 to  8  ");Serial.println(pinsB,BIN);    // Print binary form
  Serial.print("Pins A5 to A0  ");Serial.println(pinsC,BIN);    // Print binary form
  Serial.print("\n");
  
  if(bitRead(pinsB,2) == LOW)
  {
    Serial.println ("Port 10 as pressed ");
  }
  delay(1000);
}
1 Like

@leouno Independientemente de cuál método uses para acceder a los pines, siempre vas a tener que leer el estado de los mismos para identificar cual tiene cambios, luego actuarás en consecuencia (por ejemplo almacenando el nro. de pin en una variable como tu planteas).

Saludos

1 Like

Hi @leouno

Una forma muy sencilla de identificar si se presionó una tecla en un pin.

//-----------------------------------------------------------
void setup() {
  Serial.begin(115200);
  for (int x = 2; x < 20; x++) {  //Set all as INPUT and turn on internal PULL_UP resistor
    pinMode (x, INPUT_PULLUP);
  }
}
//-----------------------------------------------------------
void loop() {

//Pins  7 to  0  is PIND   
//Pins 13 to  8  is PINB   
//Pins A5 to A0  is PINC   

  if(bitRead(PINB,2) == LOW)
  {
    Serial.println ("Port 10 as pressed ");
  }
  delay(100);
}
1 Like

me fui muy util, tarde un poco en entender el codigo pero esta bien conciso. Se de las limitaciones que tiene por lo que decis de los acordes pero es para ir boceteando. Saludos

Gracias por la aclaracion, lo voy a tener encuenta.Saludos

Gracias, por tomarse el tiempo

Buenas:

Hay gente que para declarar ponen int en los pines. Fuí uno de ellos. Por ejemplo.

int pinsD = 1;   
int pinsB = 2;   
int pinsC = 3;   

Para ahorrar memoria, pues ponerlo en byte ya que los puertos de usa pocos, un byte es 256 puertos y Arduino no los incluye. Por ejemplo.

byte pinsD = 1;   
byte pinsB = 2;   
byte pinsC = 3;   

¿Van ha modificar por código los pines? Si no es así, por seguridad se deja cada pin en constante para que su valor no varíe por accidente si no haces bien los códigos.

const byte pinsD = 1;   
const byte pinsB = 2;   
const byte pinsC = 3;

Datos a tener en cuenta.

Felices fiestas 2021.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.