Lectura de 4 entradas digitales y almacenarla como palabra binaria (SOLUCIONADO)

Vamos a ver si me explico, necesito hacer una lectura de cuatro bits independientes y almacenarlos en una variable como binario, algo como esto

pin1 estado ALTO pin2 estado BAJO pin3 estado ALTO pin4 estado ALTO

Almacenarlo en una variable por ejemplo: LECTURA = 1011

Como podria hacer esto, porque por separado, es decir bit a bit si lo consigo pero todos juntos no.

Esto es lo que he probado y solo me debuelve el valor del pin1

Pero no se si la lectura digital que he puesto es correcta o no.

const int pin1 = 2; // Establece nombre a los pines de entrada const int pin2 = 3; //donde se conectara el monedero, de 2 a 5 const int pin3 = 4; const int pin4 = 5; const int contador = 6; //el pin6 sera el pin de salida para el contador int total = 0; //Establece variable total donde se sumara el valor de //las diferentes monedas

void setup () { Serial.begin (9600);

pinMode(pin1,INPUT); //establece los pines a los que conectaremos pinMode(pin2,INPUT); //el monedero como entrada y el del contador pinMode(pin3,INPUT); // como salida pinMode(pin4,INPUT); pinMode(contador,OUTPUT); digitalWrite (pin1, HIGH); digitalWrite (pin2, ); digitalWrite (pin3, HIGH); digitalWrite (pin4, HIGH); }

void loop () { int valormoneda = digitalRead (pin1),(pin2),(pin3),(pin4); Serial.print (valormoneda); delay (1000);

}

Puedes usar directamente un pind http://www.arduino.cc/en/Reference/PortManipulation

o tambien de esta manera

  Serial.print(digitalRead(pin1), BIN);
  Serial.print(digitalRead(pin2), BIN);
  Serial.print(digitalRead(pin3), BIN);
  Serial.print(digitalRead(pin4), BIN);
  Serial.print ("\n");

Saludos.

Hola shaktale, para guardar el valor de 4 entradas en un número decimal puedes hacer dos cosas, guardarlo en un decimal que exprese en binario el valor de las entradas, o directamente en un entero.

p1=digitalRead(pin1); p2=digitalRead(pin2); p3=digitalRead(pin3); p4=digitalRead(pin4);

//Si p1=H,p2=L,p3=H,p4=L //como High=1 y Low=0

// Obtenemos el valor en decimal Valor=(p1 * 2^0) + (p2 * 2^1) +( p3*2^2)+( p4*2^3) //Valor=1*1+0*2+1*4+1*8=1+4+8=13 // que equivale en binario a //Valor(dec))13=Valor(bin)1101

//Tambien puedes guardarlo en un valor decimal Valor=(p1 * 10^0) + (p2 * 10^1) +( p3*10^2)+( p4*10^3) //Valor=1*1+0*10+1*100+1*1000=1+100+1000=1101

Creo que te valdría así Saludos

Muchas gracias compañeros, no se que opcion me gusta mas, no llevo mucho con arduino y aun no conocia el registro de puertos (gracios Flico) y lo de sacar el valor binarionde manera exponencial es una opcion muy muy bonita y buena de manera de repasar mis oxidadas matematicas, gracias Inizul.

Probare esta tarde y ya os cuento.

Buenas tardes señores.... llevo rato probando las opciones que me habeis expuesto y resulta que tengo varios problemas.

Lo primero el codigo que estoy probando:

void setup () { Serial.begin (9600); //Inicio comunicacion serial digitalWrite (2, HIGH); //Pongo los pines de 2 a 5 el HIGH digitalWrite (3, HIGH); digitalWrite (4, HIGH); digitalWrite (5, HIGH); }

void loop () { boolean p1 = digitalRead(2); //Lee los pines 2 a 5 boolean p2 = digitalRead(3); boolean p3 = digitalRead(4); boolean p4 = digitalRead(5);

int total = (p1 * 2^0) + (p2 * 2^1) + ( p3 * 2^2) + ( p4 * 2^3) ; //Aqui se supone que pasa de binario a decimal y suma cada entrada // para dar un valor decimal, se supone que dejando todo en HIGH // deberia ser 1111 = 15 y lo guardo en la variable valor.

Serial.println (total); // Imprimo el valor en la consola para verificar los valores. delay (500); }

Hasta aqui bien, se supone que el valor de TOTAL deberia ser 15, que es 1111 en binario, pero siempre da como resultado 6, si pongo pines a LOW el resultado cambia( logicamente) pero sigue sin ser coherente(al menos desde mi humilde punto de vista, por ejemplo:

Entrada Valor recibido 1111 - 6 1110 - 4 1101 - 4 1100 - 2 1011 - 8 0111 - 8 0011 - 3

Orden de los pines 5,4,3,2.

Que he hecho mal???

Hola creo que el error viene a que aunque pongas un valor en cada pin, cuando lo pones como entrada lee el valor que tenga la entrada (normalmente cuando defines un pin como entrada con "pinMode(Pin,INPUT)" las pone a 5v (nivel alto) mediante una resistencia interna de Pull-Up, y la lectura será 1. (los pines en modo entrada no son una variable, sino que muestran el estado de la tensión presente en ellos)

Creo que primeramente (en setup) deberías definir los pines como entradas:

pinMode(2,INPUT); pinMode(3,INPUT); pinMode(4,INPUT); pinMode(5,INPUT);

y modificar las entradas 2,3,4,5 conectando un cable a masa (LOW) o bien a 5v (HIGH), y ver entonces el resultado.

Saludos

Solucionado......Hay que ser membrillo :P son cosas de novato, error con los operadores, no se porque di por hecho que ^equivalia la potencia de x pero no es asi, me complique la vida sin necesidad.

Aqui la solucion:

int total = (p1 * 1) + (p2 * 2) + ( p3 * 4) + ( p4 * 8)

A lo Bricomania....Rapido Limpio y Sencillo jajaja

Gracias a todossss