Asunto. Contenido de una variable. Supongo !!!

Hola!. Soy nuevo, un saludos a todos.

Tengo un problema que no logro resolver.

int NumeroRele[] = { 1, 2, 3, 4, 5, 6, 7, 8}; // el numero de reles

case '1': PinON(key); // cuando pulso un numero lo envio

void PinON(int key) {

digitalWrite(NumeroRele[key], LOW);

Pero el resultado del numero es 20041. Mirando en Serial.println(NumeroRele[key]);

Un saludos y gracias por anticipado.

Por favor r360, dime como alguien pueda resonder esa pregunta.

Ve directo a leer las Normas del FORO y cuando las comprendas completa la información que falta. Edita ese título y escribe otro que sea mas indicativo de tu consulta. Todo lo que hacemos en este foro es ayudar asi que poner AYUDA en el título es reiterativo.

A pesar de que a mi criterio esta mal presentada la duda, no puedes usar el pin 1 si luego usas el monitor Serie. Pines 0 y 1 estan reservados para el monitor Serie.

Hola, perdona, llevo esta semana aprendiendo, pensaba que a entendedor, poco código bastaba.

Saludos

#include <Keypad.h>
//
const byte ROWS = 4;
const byte COLS = 4;
//
char keys[ROWS][COLS] = {
{‘0’, ‘1’, ‘2’, ‘3’},
{‘4’, ‘5’, ‘6’, ‘7’},
{‘8’, ‘9’, ‘A’, ‘B’},
{‘C’, ‘D’, ‘E’, ‘F’}
};
//
byte rowPins[ROWS] = { 38 , 39, 40, 41 };
byte colPins[COLS] = { 42, 43, 44, 45 };
//
int pinMNR = { 2, 3, 4, 5, 6, 7, 8, 9};
int NumeroRele = { 1, 2, 3, 4, 5, 6, 7, 8};
//
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
//
void setup() {
Serial.begin(9600);
keypad.addEventListener(keypadEvent);
}
//
void loop() {
keypad.getKey();
}
//
void keypadEvent(KeypadEvent eKey) {
switch (keypad.getState()) {
case PRESSED:
switch (eKey) {
case ‘A’: break;
case ‘B’: break;
case ‘C’: break;
case ‘D’: break;
case ‘#’: break;
case ‘*’: break;
default:
AdminNumberKey(eKey);
}
}
}
//
void AdminNumberKey(char key) {
switch (keypad.getState()) {
case PRESSED:
switch (key) {
case ‘A’: Serial.print(“ACCION?”);
break;
case ‘C’: Serial.print(“CERRAR?”);
break;
case ‘1’: PinON(key);
break;
case ‘2’: PinON(key);
break;
case ‘3’: PinON(key);
break;
case ‘4’: PinON(key);
break;
case ‘5’: PinON(key);
break;
case ‘6’: PinON(key);
break;
case ‘7’: PinON(key);
break;
case ‘8’: PinON(key);
break;
case ‘9’: PinON(key);
break;
default:;
}
}
}
//
void PinON(int key) {
int v=(key+1);
Serial.println(NumeroRele[v]);
}
//

Lee las normas, usa tags o etiquetas. Esta es para insertar códigos </> Selecciona todo el código y luego click ahi. Es fácil y luce difierente luego.

Ahora si, veo el error. No era lo que te puse antes.
Varios errores.

  1. Definiste tu teclado como caracteres ASCII, que al presionarlos interpretan un caracter por cada tecla.
    switch(key) deriva a cada case pero lo hace con un caracter. Un caracter ‘1’ no es un 1 decimal.
    Entonces cuando preguntas por PinON(‘1’) la interpretación es cualquier cosa.

Debes restarle a cada caracter numérico el ‘0’ y tendrás lo que buscas
Es decir…

 void AdminNumberKey(char key) {
  switch (keypad.getState()) {
    case PRESSED:
      switch (key) {
        case 'A': Serial.print("ACCION?");
          break;
        case 'C': Serial.print("CERRAR?");
          break;
        case '1': PinON(key-'0');
          break;
        case '2': PinON(key-'0');
......... continua el código

luego otro error en PinON
tu rutina

void PinON(int key) {
  int v=(key+1);
  Serial.println(NumeroRele[v]);
}

y el vector

int NumeroRele[] = { 1, 2, 3, 4, 5, 6, 7, 8};

pero el vector NumeroRele va desde 0 a 7
La posicion
NumeroRele[0]= 1
NumeroRele[1]= 2
NumeroRele[2]= 3
NumeroRele[3]= 4
NumeroRele[4]= 5
NumeroRele[5]= 6
NumeroRele[6]= 7
NumeroRele[7]= 8

ahora que ocurre cuando presiones ‘6’ enviaras corregido ‘6’-‘0’ = 6
pero tu PinON
calcula v = key+1 = 7 o sea que busca NumeroRele[7] para tecla 6?
pero que pasa si presionas 7 buscara NumeroRele[8] y si presionas 8 y 9 buscara NumeroRel[9] y [10]
Estos 3 valores no existen y darán cualquier cosas.

Asi que ya ves los dos errores.

A trabajar.

LEE LAS NORMAS!! por favor

Gracias por tu atención.

Al final encontré el método. int NumeroRele[] = { 2, 3, 4, 5, 6, 7, 8, 9}; empiezo por pin 2 resto int v = (key-1); y de esta manera al pulsar 1 me da el 2. De este modo tengo los relés ordenados por los pin,s. Un saludo y gracias por tu tiempo.

No pagaste el precio aún, que era editar tus post, sin etiquetas, jajaja

Lo siento, no se que son las etiquetas.

Creo que lo que no sabes es leer.

Lee las normas, usa tags o etiquetas. Esta es para insertar códigos </> Selecciona todo el código y luego click ahi. Es fácil y luce difierente luego.

te marqué cual es la etiqueta, pero también te dije, todo está explicando en las normas del foro.

Ve lee las normas del foro y entenderás todo lo que te estoy pidiendo.