Lectura de entradas digitales en bloque Arduino Uno.

buenas tardes amigos, soy nuevo en esto de arduino, tengo un pequeño proyecto en mente por lo que recurro a su sapiencia para pudieran ayudarme.

tengo 4 pulsadores que serán las entradas digitales para mi arduino uno (usaré las entradas analogicas como digitales - A0,A1,A2,A3-)

con los pulsadores generaré un código binario de 4 bits. por lo tanto en algunas ocasiones se deberá pulsar dos, tres y hasta los 4 pulsadores al mismo tiempo para generar el código binario.

  • con cada código se activará una o varias de las salidas que previamente serán configuradas en el sketch (2,3,4,5,6,7,8,9)

0000 = SIN ACCION
0001 = Activa salida 2
0010 = Activa salida 3
0011 = activa salida 4
0100 = activa salida 5
0101 = activa salida 6
0110 = activa salida 7
0111 = activa salida 8
1000 = activa salida 9
1001 = activa salidas 2,3
1010 = activa salidas 3,4
etc
etc
etc

espero que me haya podido explicar.

gracias de antemano por su ayuda.

saludos cordiales.

Hi,
Mi consejo es que cambies el titulo a letras miniculas pues cuando las escribes en mayusculas quire decir que estas gritando.Aqui no tienes que gritar para pedir ayauda.Perdona que te llama la atencion. Tambien parate y lees las reglas del forum.

tauro0221:
Hi,
Mi consejo es que cambies el titulo a letras miniculas pues cuando las escribes en mayusculas quire decir que estas gritando.Aqui no tienes que gritar para pedir ayauda.Perdona que te llama la atencion. Tambien parate y lees las reglas del forum.

Hola, Gracias por el consejo, modificaré ahora.

al ser un ¨titulo¨lo puse en mayúsculas al momento de solicitar la ayuda.

que tenga un buen dia.

saludos cordiales

Hi,
Si quires leer un grupo de entrada debes de usar la instruccion DDRC y para leer las entradas usas PINC.
El DDRC condiciona el puerto C para que las entrada A0-A6 sean para leer. Adjunto un sketch para que pruebes para ver si te trabaja.

[code]

//***********************************************
//Si quires leer las entradas  de A0-A6 debes de leer el puerto C 
//************************************************
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  DDRC = DDRC = B0000000; //ejemplo aqui haces que todos los puetos A0-A6 sean input
}
//************************************************
void loop() {

  byte port_c = PINC;//leer los puertos A0-A5
  Serial.print("Port C = ");   Serial.println( port_c,BIN); 
  
  delay (500);
}
 //***********************************************

[/code]

Hola @tauro0221, primeramente muchas gracias por tu disposición a ayudarme.

eh probado el sketch que compartiste, y funciona muy bien. Pude visualizar el codigo binario por el puerto serie.

eh tratado de usar el codigo leido para enceder y/o apagar los led que tengo como salidas, pero no funciona, seguramente estoy haciendo algo mal. quisiera una vez mas recurrir a tus conocimientos para que me pudieras ayudar.

muchas gracias de antemano.

adjunto el Sketch que tengo.

//***********************************************
//Sketch compartido por tauro0221: Si quires leer las entradas  de A0-A6 debes de leer el puerto C
//************************************************
int port_c = 0;

void setup() {
  Serial.begin(9600);
  DDRC = DDRC = B0000000; //ejemplo aqui haces que todos los puetos A0-A6 sean input
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
}
//************************************************
void loop() {

  byte port_c = PINC;//leer los puertos A0-A5
  Serial.print("Port C = ");   Serial.println( port_c,BIN);
  todo_apagado();
  Led_A();
  Led_B();
  delay(500);
}

void todo_apagado(){
  if (port_c == B0000000) {
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
  }
}

void Led_A(){
  if (port_c == B0000001) {
      digitalWrite(2, HIGH);
  }
}


void Led_B(){
  if (port_c == B0000010) {
      digitalWrite(3, HIGH);
  }
}

Hi,
Adjunto el sketch modificado para que lo pruebe y ver si te trabaja.

[code]

//***********************************************
//Sketch compartido por tauro0221: Si quires leer las entradas  de A0-A6 debes de leer el puerto C
//************************************************
int port_c = 0;
void setup() {
  Serial.begin(9600);
  DDRC = DDRC = B0000000; //ejemplo aqui haces que todos los puetos A0-A6 sean input
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
}
//************************************************
void loop() {

  port_c =  PINC; //leer los puertos A0-A5
  Serial.print("Port C = ");   Serial.println( port_c, BIN);
  todo_apagado();
  Led_A();
  Led_B();
  delay(500);
}

void todo_apagado() {
  
  if ( bitRead(port_c, 0) == 0) { 
    //lee LED_A bit 0 si es = 0 
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    Serial.print("Led A registro C bit 0 = ");
    Serial.println(bitRead(PINC, 0));
  }
}
//********************************
void Led_A() {
  if ( bitRead(port_c, 0)==  1) {
    //lee LED_A bit 0 si es = 1 
    digitalWrite(2, HIGH);
    Serial.print("Led A Registro C bit 0 = ");
    Serial.println(bitRead(PINC, 0));
  }
}
//********************************
void Led_B() {
   
  if ( bitRead(port_c, 1) == 1) {
    //lee LED_B bit 1 si es = 1 
    digitalWrite(3, HIGH);
    Serial.print("Led B Registro C bit 1 = ");
    Serial.println(bitRead(port_c, 1));
  }
}

[/code]

Hola @tauro0221.

Nuevamente muchas gracias por tu ayuda.

el Sketch funciona muy bien, eh podido activar los diferentes Leds usando tus ejemplos.

el problema que surge ahora es que al momento de leer dos, tres o los cuatro bits no me funciona.

quisiera una vez mas que me pudieras ayudar.

ésta es una "Tabla" de como es la secuencia que me gustaría realizar.

TABLA DE LEDS
Salidas del Arduino (2 - 9) = (leds A - H)

PUERTO C ACCION
0000 Todos los leds apagados
0001 Led A = ON (demas leds apagados)
0010 Led B = ON (demás leds apagados)
0011 Led C = ON (demás leds apagados)
0100 Led D = ON (demás leds apagados)
0101 Led A,C = ON (demás leds apagados)
0111 Led B,D = ON (demás leds apagados)
1000 Led E,H = ON (demás leds apagados)
1001 Led F,G = ON (demás leds apagados)
1010 Led E,G = ON (demás leds apagados)
1011 Led F,H = ON (demás leds apagados)
etc.
etc.
etc.

Muchas gracias de antemano por tu ayuda.

Saludos cordiales.

Hi,
creo que ya veo posiblemente que esta pasando. El problema es que no usas los bits uno a uno y el programa es para leer los bits uno a uno. Hay que cambiar en la forma de leerlo. Voy a modificar el programa para que lo haga en forma de numeros en vez bits.

Adjunto sketch modificaado. Tratalo para ver si te trabaja .

[code]

//***********************************************
//Sketch compartido por tauro0221: Si quires leer las entradas  de A0-A6 debes de leer el puerto C
//************************************************
int port_c = 0;
void setup() {
  Serial.begin(9600);
  DDRC = DDRC = B0000000; //ejemplo aqui haces que todos los puetos A0-A6 sean input
  pinMode(2, OUTPUT);//A
  pinMode(3, OUTPUT);//B
  pinMode(4, OUTPUT);//C
  pinMode(5, OUTPUT);//D
  pinMode(6, OUTPUT);//E
  pinMode(7, OUTPUT);//F
  pinMode(8, OUTPUT);//G
  pinMode(9, OUTPUT);//H
}
//************************************************
void loop() {

  port_c =  PINC; //leer los puertos A0-A5
  Serial.print("Port C = ");   Serial.println( port_c, BIN);
  turn_on_leds();
  delay(500);
}
//***************************************************
void turn_on_leds() {
  port_c =  PINC;
  if ( port_c == 0)PORTC = B000000; //apaga todos los A0 - A6
  switch (port_c) {
    case 1://led A = ON
      digitalWrite(2, HIGH);
      Serial.println("Case 1");
      break;
    case 2: //led B = ON
      digitalWrite(3, HIGH);
      Serial.println("Case 2");
      break;
    case 3: //LED C = ON
      digitalWrite(4, HIGH);
      Serial.println("Case 3");
    case 4: //LED D = ON
      digitalWrite(5, HIGH);
      break;
    case 5: //LED A,C = ON
      digitalWrite(2, HIGH);
      digitalWrite(4, HIGH);
      Serial.println("Case 5");
      break;
    case 6: //no hagas nada
      break;
    case 7: //LED B,D = ON
      digitalWrite(3, HIGH);
      digitalWrite(5, HIGH);
      Serial.println("Case 7");
      break;
    case 8: //LED E,H = ON
      digitalWrite(6, HIGH);
      digitalWrite(9, HIGH);
      Serial.println("Case 8");
      break;
    case 9: //LED F,G = ON
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);
      Serial.println("Case 9");
      break;
    case 10: //LED E,G = ON
      digitalWrite(6, HIGH);
      digitalWrite(8, HIGH);
      Serial.println("Case 10");
      break;
    case 11: //LED F,H = ON
      digitalWrite(7, HIGH);
      digitalWrite(9, HIGH);
      Serial.println("Case 11");
     break;
    default:
      // statements
      break;
  }
}
//***********************************************************
//PUERTO C      ACCION
//0000        Todos los leds apagados
//0001        Led A = ON (demas leds apagados)
//0010        Led B = ON (demás leds apagados)
//0011        Led C = ON (demás leds apagados)
//0100        Led D = ON (demás leds apagados)
//0101        Led A, C = ON (demás leds apagados)
//0111        Led B, D = ON (demás leds apagados)
//1000        Led E, H = ON (demás leds apagados)
//1001        Led F, G = ON (demás leds apagados)
//1010        Led E, G = ON (demás leds apagados)
//1011        Led F, H = ON (demás leds apagados)

[/code]

Hola @tauro0221.

Una vez más muchas gracias por tu ayuda.

el Sketch funciona muy bien para activar los leds según la "tabla" que compartí, pero no se apagan cuando la lectura en el puerto C es 0000; tampoco se apagan los leds prendidos en la lectura anterior para mostrar la lectura actual.

las lecturas se visualizan correctamente en el puerto serie.

quisiera una vez más, sin ser molesto, que me pudieras ayudar con esta dificultad.

eh intentado agregar un CASO más, por ejemplo, cuando en PORT C = 1111 los leds A,B,C,D se encienden y los demás apagados; puedo visualizar la lectura en el puerto serie pero no se prenden los leds

quisiera que tambien me ayudaras a crear un caso más de tal manera que los siguientes pueda hacerlo por mi cuenta.

Muchas gracias de antemano.

que tengas un buen dia.

Hi,
Si, ya me di cuenta de que no estaba apagado los puertos cuando el registro C = 0. Ya modifique el programa para que cuando sea C= 0 apaque todos pines. Tratalo para ver si ahora trabaja.Puede ser en las forma que estoy usando es correcta pero tratala para ver si esta bien. En si estaba apagando el registro C.

Modifique el programa para que prendan los A,B,C,D. Tratalo para ver si los prenden.

[code]

//***********************************************
//Sketch compartido por tauro0221: Si quires leer
//las entradas de A0-A6 debes de leer el puerto C
//************************************************
int port_c = 0;
void setup() {
  Serial.begin(9600);
  DDRC = B0000000;  //ejemplo aqui haces que todos los puetos A0-A6 sean input
  DDRB = B000011;   //set reg B pins 0-1 output
  DDRD = B11111100; //set reg D pins 2-7 output
  pinMode(2, OUTPUT);//A
  pinMode(3, OUTPUT);//B
  pinMode(4, OUTPUT);//C
  pinMode(5, OUTPUT);//D
  pinMode(6, OUTPUT);//E
  pinMode(7, OUTPUT);//F
  pinMode(8, OUTPUT);//G
  pinMode(9, OUTPUT);//H
}
//************************************************
void loop() {

  port_c =  PINC; //leer los puertos A0-A5
  Serial.print("Port C = ");   Serial.println( port_c, BIN);
  turn_on_leds();
  delay(500);
}
//***************************************************
void turn_on_leds() {
  port_c =  PINC;  //Lee pines A0-A6
  switch (port_c) {
    //apaga todos los pines port B 0-5  pines port D 2-7
    case 0:
      PORTB = DDRB | B000000;   //reg B pins 8-13 = set to low
      PORTD = DDRD | B0000000;  //reg D pins 0-7  = set to low
      Serial.println("Case 0");
      break;
    case 1://led A = ON
      digitalWrite(2, HIGH);
      Serial.println("Case 1");
      break;
    case 2: //led B = ON
      digitalWrite(3, HIGH);
      Serial.println("Case 2");
      break;
    case 3: //LED C = ON
      digitalWrite(4, HIGH);
      Serial.println("Case 3");
    case 4: //LED D = ON
      digitalWrite(5, HIGH);
      break;
    case 5: //LED A,C = ON
      digitalWrite(2, HIGH);
      digitalWrite(4, HIGH);
      Serial.println("Case 5");
      break;
    case 6: //no hagas nada
      break;
    case 7: //LED B,D = ON
      digitalWrite(3, HIGH);
      digitalWrite(5, HIGH);
      Serial.println("Case 7");
      break;
    case 8: //LED E,H = ON
      digitalWrite(6, HIGH);
      digitalWrite(9, HIGH);
      Serial.println("Case 8");
      break;
    case 9: //LED F,G = ON
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);
      Serial.println("Case 9");
      break;
    case 10: //LED E,G = ON
      digitalWrite(6, HIGH);
      digitalWrite(8, HIGH);
      Serial.println("Case 10");
      break;
    case 11: //LED F,H = ON
      digitalWrite(7, HIGH);
      digitalWrite(9, HIGH);
      Serial.println("Case 11");
      break;

    case 15: //LED A,B,C,D = ON
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      Serial.println("Case 15");
      break;
    default:
      // statements
      break;
  }
}
//***********************************************************

[/code]

Hola @tauro0221.

de nuevo más muchas gracias por tu ayuda.

Probé el Sketch que me compartiste, pero al instante se encendieron los leds de salida, asi que tomando tus ejemplos realicé algunos cambios menores que felizmente funcionaron como quería.

tambien entendi como se hace un "nuevo caso", entonces cambié un poco la "tabla" y logre hacer funcionar como quería la secuencia de leds, de aquí en adelante espero lograr todas las demás secuencias que necesito.

estoy muy agradecido por tu ayuda, es bueno saber que hay personas con mucho conocimiento que tienen la voluntad de ayudar y enseñar.

Muchas gracias, que tengas un excelente dia.

comparto el Sketch final que tengo para que quizá le pueda ayudar a alguien más.

//***********************************************
//Sketch compartido y revisado por tauro0221: Si quieres leer las entradas  de A0-A6 debes de leer el puerto C
//************************************************
int port_c = 0;
void setup() {
  Serial.begin(9600);
  DDRC = DDRC = B0000000; //ejemplo aqui haces que todos los puetos A0-A6 sean input
  pinMode(2, OUTPUT);//A
  pinMode(3, OUTPUT);//B
  pinMode(4, OUTPUT);//C
  pinMode(5, OUTPUT);//D
  pinMode(6, OUTPUT);//E
  pinMode(7, OUTPUT);//F
  pinMode(8, OUTPUT);//G
  pinMode(9, OUTPUT);//H
}
//************************************************
void loop() {

  port_c =  PINC; //leer los puertos A0-A5
  Serial.print("Port C = ");   Serial.println( port_c, BIN);
  turn_on_leds();
  delay(500);
}
//***************************************************
void turn_on_leds() {
  port_c =  PINC;
  if ( port_c == 0); //PORTC = B000000; //apaga todos los A0 - A6
  digitalWrite(2, LOW); //A
  digitalWrite(3, LOW); //B
  digitalWrite(4, LOW); //C
  digitalWrite(5, LOW); //D
  digitalWrite(6, LOW); //E
  digitalWrite(7, LOW); //F
  digitalWrite(8, LOW); //G
  digitalWrite(9, LOW); //H
  switch (port_c) {
    case 1://led A = ON
      digitalWrite(2, HIGH);
      Serial.println("Case 1 - A = ON");
      break;
    case 2: //led B = ON
      digitalWrite(3, HIGH);
      Serial.println("Case 2 - B = ON");
      break;
    case 3: //LED E,H = ON
      digitalWrite(6, HIGH);
      digitalWrite(9, HIGH);
      Serial.println("Case 3 - E,H = ON");
      break;
    case 4: //LED C = ON
      digitalWrite(4, HIGH);
      Serial.println("Case 3 - C = ON");
      break;
    case 5: //LED A,C = ON
      digitalWrite(2, HIGH);
      digitalWrite(4, HIGH);
      Serial.println("Case 5 - A,C = ON");
      break;
    case 6: // LED F,H = ON
      digitalWrite(7, HIGH);
      digitalWrite(9, HIGH);
      Serial.println("Case 5 - F,H = ON");
      break;
    case 7: //No hace nada
      Serial.println("Case 7 - SIN ACCION");
      break;
    case 8: //LED D = ON
      digitalWrite(5, HIGH);
      Serial.println("Case 8 - D = ON");
      break;
    case 9: //LED F,G = ON
      digitalWrite(7, HIGH);
      digitalWrite(8, HIGH);
      Serial.println("Case 9 - F,G = ON");
      break;
    case 10: //LED B,D = ON
      digitalWrite(3, HIGH);
      digitalWrite(5, HIGH);
      Serial.println("Case 10 - B,D = ON");
      break;
    case 11: //No hace nada
      Serial.println("Case 11 - SIN ACCION");
     break;
    case 12: //LED E,G = ON
      digitalWrite(6, HIGH);
      digitalWrite(8, HIGH);
      Serial.println("Case 12 - E,G = ON");
     break;
    default:
      // statements
      break;
  }
}
//***********************************************************
//PUERTO C   
//BINARIO     DECIMAL       ACCION
// 8421
//-------     -------   -------------------------
// 0000        0         Todos los leds apagados
// 0001        1         Led A = ON (demas leds apagados)
// 0010        2         Led B = ON (demás leds apagados)
// 0011        3         Led E,H = ON (demás leds apagados)
// 0100        4         Led C = ON (demás leds apagados)    
// 0101        5         Led A,C = ON (demás leds apagados)
// 0110        6         Led F,H = ON (demás leds apagados)
// 0111        7         NO HACE NADA (todos leds apagados
// 1000        8         Led D = ON (demás leds apagados)
// 1001        9         Led F,G = ON (demás leds apagados)
// 1010       10         Led B,D = ON (demás leds apagados)
// 1011       11         NO HACE NADA (todos leds apagados)
// 1100       12         Led E,G = ON (demás leds apagados)

Hi,
Muchas gracia por tu comentarios y estoy a tus ordenes.Me da mucho gusto que ya estas encaminado en tu projecto.