Como leer las entradas digitales (22 al 53) de un mega 2560

Buenas a todos.

Estoy empezando con esta plataforma y quiero adaptar una placa ARDUINO MEGA 2560 a un antiguo proyecto de sensores que tengo a medias, el problema me viene que necesito las 31 entradas digitales, concretamente quiero usar las del 22 al 53 y comparar si en alguna de ellas tengo una variacion de estado alto (HIGH) a estado bajo (LOW) y me active una salida, en este caso estoy probando con la 13 que tiene el led incorporado en la placa, lo he intentado y no acaba de ir o no acabo de entender como funcionan. Si alguien me puede ayudar aqui dejo el codigo que he echo pero no acaba de funcionar.

Gracias por adelantado por la ayuda, :slight_smile:

//COMPROBACION DE ENTRADAS
int ledPin = 13; // LED conectado al pin 13
int inPin = {22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53};
//Entradas digital de los pines 22 al 53
int START = 12; //Entrada digital pin 12 Pulsador START
int cnt_cont = 0; //Variable contador y se inicia en 0
int val_cont = 0; //Variable para guardar la lectura de entrada
int val_temporal = 0; //Variable temporal
int val_START = 0; //Variable temporal
void setup()
{
pinMode(ledPin, OUTPUT); //Establece el pin 13 como salida
pinMode(START, INPUT); //Establece el pin 12 como entrada, boton START
pinMode(inPin[cnt_cont], INPUT); //Establece los pines 22 al 53 como entrada
}

void loop()
{
val_START = digitalRead(START); //Lee el pin de STAR entrada
if (val_START == HIGH)
{
digitalWrite(ledPin, LOW);
while (cnt_cont < 33)
{
val_temporal = digitalRead(inPin[(cnt_cont+22)]); //Lee el pin de entrada indicado por el (cnt_cont+22)
if (val_temporal == LOW) //Si la variable temporal esta en estado LOW “0”, incrementamos
{ //el valor de val_continuidad en uno
val_cont++;
}
cnt_cont++;
}
}
if (val_cont != 0) //Comprobamos que todas las entradas esten a HIGH “1” con la variable
{ //En caso contrario encendemos el led
digitalWrite(ledPin, HIGH); //Carga el valor de la entrada al led
delay(250); //Retardo para ver el resultado
}
cnt_cont = 0; //Inicializamos el contador
val_cont = 0; //Inicializamos la variable de control
digitalWrite(ledPin, LOW); //Apagamos el led 13
}

Saludos, tienes camino que recorrer y debe comenzar leyendo las normas del foro. Los codigo deben estar en el tag para codigo que es representado por una hoja con los signos menor y mayor que < >.

La lectura de los pines del Mega se hace como cualquier pin de las tarjetas menores, UNO, NANO, MICRO,

el codigo quedaria como:

//COMPROBACION DE ENTRADAS
int max_entradas = 32;
int ledPin = 13;                                                        // LED conectado al pin 13
int inPin[max_entradas] = {22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53};
                                                                           //Entradas digital de los pines 22 al 53
int START = 12;                                                       //Entrada digital pin 12 Pulsador START
int cnt_cont = 0;                                                      //Variable contador y se inicia en 0
int val_cont = 0;                                                       //Variable para guardar la lectura de entrada
int val_temporal = 0;                                                  //Variable temporal
int val_START = 0;                                                     //Variable temporal

void setup(){
 pinMode(ledPin, OUTPUT);                                         //Establece el pin 13 como salida
 pinMode(START, INPUT);                                           //Establece el pin 12 como entrada, boton START
 for(int i = 0; i < max_entradas, i++){
 	pinMode(inPin[cnt_cont], INPUT);                                //Establece los pines 22 al 53 como entrada
 }
}

void loop(){
	val_START = digitalRead(START);                                 //Lee el pin de STAR entrada
	if (val_START == HIGH){
	    digitalWrite(ledPin, LOW);
		for(int i = 0; i < max_entradas; i++){
			val_temporal = digitalRead(inPin[(i]);
			if(val_temporal==LOW)val_cont++;
		}
 	}
 	if (val_cont > 0){                                                        //Comprobamos que todas las entradas esten a HIGH "1" con la variable
                                                                          //En caso contrario encendemos el led 
 		digitalWrite(ledPin, HIGH);                                          //Carga el valor de la  entrada al led
   		delay(250);                                                             //Retardo para ver el resultado
 	}
 	cnt_cont = 0;                                                            //Inicializamos el contador
 	val_cont = 0;                                                             //Inicializamos la variable de control
 	digitalWrite(ledPin, LOW);                                             //Apagamos el led 13
}

Recuerda usar resistencias pull down si no lo estas haciendo ya,para que las entradas no queden al aire cuando no tienen señal.

Buenas y gracias.

Pero tengo una duda y un error, en esta linea del programa.

int inPin[max_entradas] = {22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53};

Me da un error y no acabo de entenderlo, soy novato en este tema y no acabo de verlo. El error es:

sketch_feb15a:4: error: array bound is not an integer constant sketch_feb15a.ino: In function 'void setup()': sketch_feb15a:15: error: expected ;' before ')' token sketch_feb15a:16: error: 'inPin' was not declared in this scope sketch_feb15a.ino: In function 'void loop()': sketch_feb15a:25: error: 'inPin' was not declared in this scope sketch_feb15a:25: error: expected)' before ']' token sketch_feb15a:25: error: expected `]' before ';' token

Teoricamente por lo poco que llevo con este tema estaria mal declarada o no lo entiendo ya que si elimino el interior de corchetes no da error pero me indica que max_entradas no esta declarada

Siento los del codigo pero no me cargaba bien.... :(

Muchas gracias por la ayuda

prueba substituyendo:
int max_entradas = 32;
por:
const int max_entradas = 32;
Aqui tambien hay un fallo:
for(int i = 0; i < max_entradas, i++){
cambia por:
for(int i = 0; i < max_entradas; i++){

Discrepo en la forma de declarar los pins como entrada. Yo no usaría un array solo para eso. Lo encuentro una forma de malgastar memoria. Yo lo haría así:

int max_entradas = 32;
int ledPin = 13;                                                        // LED conectado al pin 13
int START = 12;                                                       //Entrada digital pin 12 Pulsador START
int inPin[32] = {22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53};
int cnt_cont = 0;                                                      //Variable contador y se inicia en 0
int val_cont = 0;                                                       //Variable para guardar la lectura de entrada
int val_temporal = 0;                                                  //Variable temporal
int val_START = 0;                                                     //Variable temporal

void setup(){
 pinMode(ledPin, OUTPUT);                                         //Establece el pin 13 como salida
 pinMode(START, INPUT);                                           //Establece el pin 12 como entrada, boton START
 for(int i = 22; i < 53; i++){
 	pinMode(i, INPUT);                                //Establece los pines 22 al 53 como entrada
 }
}

void loop(){
	val_START = digitalRead(START);                                 //Lee el pin de STAR entrada
	if (val_START == HIGH){
	    digitalWrite(ledPin, LOW);
		for(int i = 0; i < max_entradas; i++){
			val_temporal = digitalRead(inPin[i]);
			if(val_temporal==LOW)val_cont++;
		}
 	}
 	if (val_cont > 0){                                                        //Comprobamos que todas las entradas esten a HIGH "1" con la variable
                                                                          //En caso contrario encendemos el led 
 		digitalWrite(ledPin, HIGH);                                          //Carga el valor de la  entrada al led
   		delay(250);                                                             //Retardo para ver el resultado
 	}
 	cnt_cont = 0;                                                            //Inicializamos el contador
 	val_cont = 0;                                                             //Inicializamos la variable de control
 	digitalWrite(ledPin, LOW);                                             //Apagamos el led 13
}

Con el bucle for, defines todas las entradas como input, sin gastar memoria en un array.

Edito: veo que necesitas el array mas adelante… De todas formas con el for que te proponian, creo que no se inicializaban, ya que cnt_cont, no cambia nunca dentro del bucle.

Reestablezco el array, aunque yo he tenido malas experiencias usando variables externas en los for.

cosas como esta hay veces que no me han funcionado:

for(int i = 0; i < max_entradas, i++)

No sé por qué, pero una vez probé un for así, y no me funcionaba. En vez de max_entradas, tenía que usar un número.

Ya lo dijo jose que necesitas utilizar el pullUp resistor
y max_saeta menciono que necesitas un for() para declarar todas las entradas, pero es así como debes hacerlo:

prueba con esto en el setup()

void setup()
{
 pinMode(ledPin, OUTPUT);                                         //Establece el pin 13 como salida
 pinMode(START, INPUT);                                           //Establece el pin 12 como entrada, boton START
for(byte i = 0; i <= 31; i++)  
 {pinMode(inPin[i +22], INPUT_PULLUP);}                                //Establece los pines 22 al 53 como entrada
}

Yo he usado este método de array muchas veces y me funciona correctamente. Lo uso cuando los pines de salida no son consecutivos. ejemplo:

const byte salidas[5] ={2,4,5,6,10};

De esta manera no tengo que declarar una por una y ahorro espacio de programa con un for. La forma de ehrja (INPUT_PULLUP) la uso tambien.

for(int i = 0; i < max_entradas, i++) // El problema aqui fue error de tipeado donde coloque , va ;

En este sketch lo deje lo mas simple posible para que funcionara y pudiese entenderlo porque hay otras maneras de hacerlo y mas eficientes.

Modamio, corrige lo que te dice jose

Buenas noches.

Ante todo daros las gracias a todos.

Todas las soluciones han sido validas y aunque resulte ironico me ha funcionado fusionando todas vuestras ideas y he podido ver como se podia hacer.

Encuentro que la placa Mega 2560 es inestable en el momento que no usas resistencias pullup y aunque no alimentes esa in/out da lecturas raras, cuando termine la idea ya la pondre haber si me dejan acabarla.

SOBRETODO MUCHISIMAS GRACIAS A TODOS.

Por eso te recomendaron activar las pull_up internas.