lectura de 8 pin es digitales a binario

Hola, tengo conectado al arduino una entrada digital de 8 bits, cada bit es un pin en arduino
lo que necesito es guardar los valores de todos los pines como una secuencia para despes convertirlo a dec
es decir, si la entrada es asi:
p2 = 0
p3 = 1
p4 = 0
p5 = 1
p6 = 1
p7 = 0
p8 = 1
p9 = 0

este se guarde en una variable int como: 01011010

gracias.

Tienes al menos dos modos de hacerlo:

  1. Estilo Arduino.
  2. Estilo ATMEL o AVR.

Soluciones:

  1. Estilo Arduino.

Como lees 8 pines que supongo estan consecutivos, imaginaré que parten del pin 2 al 9.

const byte pin[]= {2,3,4,5,6,7,8,9}; // lo que te permite elegir cualquier pin
byte estado = 0;
void setup() {

  for (int i=0; i<8; i++) {
        pinMode(pin[i], INPUT); // supongo que los pines estan configurados pull-up o down.
  }
    Serial.begin(9600);
}

void loop() {
  // Lectura de pines
  for (int i=1; i<=8; i++) {
        estado |= digitalRead(pin[i-1]) & (1<<i);
  } 
  Serial.print("Bits =");
  Serial.println(estado);
}
  1. Estilo AVR o ATMEL

Para ello usas registros que apuntan a los puertos.
defines un puerto como entrada y puedes leer con una sola instruacción.
El tema es que para ello debes usar pines que se leean directamente para no tener que hacer operaciones con dos puertos.

No te escribo nada por esa razón. Ademas tal vez te complicaría mas las cosas.

Explicación:
Pero si voy a explicarte algo que de no hacerlo te dejará mal.

        estado |= digitalRead(pin[i]) & (1<<i);

definí estado como del tipo byte, porqué? por que tu me hablaste de 8 bits y eso es lo máximo que un byte permite almacenar.
| es OR o sea suma binaria
& es AND o sea multiplicación binaria
<< es desplazamiento a izquierda tantas veces como el 2do digito lo indique
el truco 1<<i permite que cada vez que i cambie tengas un valor binario que ira cambiando asi

1 = 1<<1
10 = 1<<2
100 = 1<<3
1000 = 1<<4
10000 = 1<<5
100000 = 1<<6
1000000 = 1<<7
10000000 = 1<<8

entonces en todo momento tendrás el valor leído para el pin 2 a 9, sea 0 o 1 AND con la posición binaria
Y siempre esto se suma OR al valor que ya tenía estado.

Me temo surbyte que has dado tu respuesta "de memoria" y has tenido un par de despistes. (Yo también constesto "de memoria" con lo que no descarto estar equivocado).

La operación correcta a realizar es:

        estado |= digitalRead(pin[i]) << i;

La función digitalRead() ya retorna un cero o un uno según esté la entrada a nivel bajo o alto. Por lo que sólo se necesita "desplazar" ese uno o cero a la izquierda según el bit que represente.

No se ha de empezar por uno, sino por cero y así consecutivamente hasta siete. El 1 se obtiene desplazando un 1 cero bits a la izquierda; el 10 se obtiene desplazando un 1 un bit a la izquierda; el 100 se obtiene desplazando un 1 dos bits a la izquierda y así sucesivamente:

       1 = 1<<0 
      10 = 1<<1
     100 = 1<<2 
    1000 = 1<<3
   10000 = 1<<4
  100000 = 1<<5
 1000000 = 1<<6
10000000 = 1<<7

Como la variable estado se ha declarado global mantendrá el valor de la lecturas anteriores, con lo que se "mezclarán" los valores de cada lectura. Es por ello que hay que ponerla a cero justo antes del for.

En resumen, hay que inicializar la variable, el bucle ha de ser de 0 a 7 y la operación a realizar es diferente. Con los cambios quedaría así:

  // Lectura de pines
  estado = 0;                               // "Borramos" el valor anterior
  for (int i=0; i<8; i++) {                 // Bucle de 0 a 7
        estado |= digitalRead(pin[i]) << i; // Leemos un 0 o un 1, lo desplazamos "i" veces a la izquierda y lo "añadimos" a estado
  }

Tuve mis dudas que ahora confirmo.. jaja
Como acabo de volver de vacaciones puedes creer que estoy como en un lapsus mental. Recien no podía recordar como se llamaba la rutina antirebotes (en otra respuesta) y me acaba de caer la ficha en la memoria Bouce. Bueno esto es anectódico.

Tienes razón IgnoranteAbsoluto. Es así como tu indicas.

Gracias a todos con sus respuestas, estuve probando cada unas de las respuestas que me daban pero nunca me dieron los valores esperados,sin embargo tuve una idea, no se que tan adecuada sea, en fin. La idea es la siguiente, con este codigo retornaba en el monitor serial el codigo binario:

void setup() {
   Serial.begin(9600);
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(4,INPUT);
  pinMode(5,INPUT);
  pinMode(6,INPUT);
  pinMode(7,INPUT);
  pinMode(8,INPUT);
  pinMode(9,INPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
}

void loop() { 
  //Calcular un valor usando una funcion matematica y transmitirlo al pc
    delay(20);
    digitalWrite(12,LOW);
    Serial.print(digitalRead(9));
    Serial.print(digitalRead(8));
    Serial.print(digitalRead(7));
    Serial.print(digitalRead(6)); 
    Serial.print(digitalRead(5));
    Serial.print(digitalRead(4));
    Serial.print(digitalRead(3)); 
    Serial.println(digitalRead(2));
    digitalWrite(12,HIGH);
    delay(20);
 
}

entonces el el monitor serial aparece por ejemplo : 01001010
luego recibir ese código en python para procesarlo por que igualmente tengo que generar una gráfica de los valores de 0 a 255

Vaya hombre como que no te da los valores adecuados? puede que este invertido pero es la manera de presentarlos.

Me acaba de dar, el error estaba en una mala configuración de los pines, lo configure de la siguiente manera:
pin 2 <-> DB7 MSB
pin 9 <-> DB0 LSB
Haciendo unas pequeñas modificaciones en el código, este quedo de la siguiente manera.

const byte pin[]= {9,8,7,6,5,4,3,2}; // lo que te permite elegir cualquier pin
byte estado = 0;
void setup() {

  for (int i=0; i<8; i++) {
        pinMode(pin[i], INPUT); // supongo que los pines estan configurados pull-up o down.
  }
    Serial.begin(9600);
}

void loop() {
  // Lectura de pines
  estado = 0;                               // "Borramos" el valor anterior
  for (int i=0; i<8; i++) {                 // Bucle de 0 a 7
        estado |= digitalRead(pin[i])<< i; // Leemos un 0 o un 1, lo desplazamos "i" veces a la izquierda y lo "añadimos" a estado
  }
  Serial.print("Bits =");
  Serial.println(estado);
}

y hice la prueba aumentando en el adc los valores y dio perfecto como en la imagen que adjunto

O invirtiendo el for(int i=8; i>0; i--)

Surbyte, con esta consulta estás gafado. :wink:

for(int i=7; i>=0; i--)

Bueno que trabaje un poco... todo gratis no va
Aunque tienes razón lo hice pensando en MI código en el que restaba 1 y no porque tenga razón que la tienes tu, pero me jugó un desliz la mente pensando en lo que yo habia propuesto, solo presentaba la idea.

// Lectura de pines

for (int i=1; i<=8; i++) {
        estado |= digitalRead(pin[i-1]) & (1<<i);
  }