2017-05-12 8 views
0

라즈베리 파이의 GPIO 입력을 int로 변환하려고합니다. 그래서 5 개의 디지털 입력이 있고 입력을 읽고 싶습니다. 일단 값을 얻으면 배열에 저장합니다. 다음으로 배열의 내용을 int 값으로 변환하는 것입니다.이진 신호를 int로 변환

그래서 여기 내 코드입니다 : 첫 번째 입력이 1 또는 0 인 경우 조건을보고하는 경우

int a = digitalRead(PIN_16); 
int b = digitalRead(PIN_18); 
int c = digitalRead(PIN_22); 
int d = digitalRead(PIN_24); 
int e = digitalRead(PIN_26); 

int array[5]; 

array[0]=a; 
array[1]=b; 
array[2]=c; 
array[3]=d; 
array[4]=e; 

내가 뭐지 것 숫자을 배열의 내용을 변환하기 위해 1 I 1, 다른 경우, 0 등등 ....

내 질문에 더 우아한 방법이 있다면 지금입니다. 수의 적절한 위치에

+1

숫자는 무엇을해야 하는가? (예를 들어, pin16이 높으면 숫자는 무엇이되어야합니까?) – Lanting

+0

각기 다른 값으로 2를 곱하고 (또는 다른 값으로 왼쪽으로 시프트 한 다음) 함께 합치십시오 (또는 비트별로 또는 함께) . 예를 들어'value = (a << 0) | (b << 1) | (c << 2) | (d << 3) | (e << 4); –

답변

2

그냥 "변화"비트 :

unsigned int number = 0; 
for (int i=0; i<5; i++) 
{ 
    number |= a[i] << i; 
} 

이는 경우 digitalRead에서 작동이 0 또는 1 만 반환합니다.

unsigned int number = 0; 
for (int i=0; i<5; i++) 
{ 
    number |= (a[i] != 0) << i; // (a[i] != 0) will have a value of `1` for any non-zero `a[i]` 
} 

또는 더 관용적 트릭 :

number |= !!a[i] << i; 

이 더블 논리적 부정 인 경우에는 우리가 대신 제로에 대해 그것을 확인해야합니다 0 또는 non-zero 값을 반환합니다. 첫 번째 것은 0이 아닌 값을 0으로 바꾸고, 두 번째는 01으로 바꿉니다.

+0

이것은 핀이 하이 일 때'digitalRead'가 1을 반환하는 경우에만 작동합니다. 나는'digitalRead'가 이미 bitset을 반환하고'digitalRead (PIN1 | PIN2 | PIN5);와 같은 함수를 호출 할 수있는 구현을 보았고,'return ~ 0; 핀이 높습니다. – Lanting

+0

@ Lanting 예, 그건 제 가정이었습니다. 이 문제를 해결하기 위해 더 많은 것을 추가 할 것입니다. –

+0

@EugeneSh. 귀하의 기능이 라스베리에서 아주 잘 작동 해 주셔서 감사합니다. 정보 만 있으면 : wiringpi.h의 digitalread() 함수는 0 또는 1을 반환합니다. – user3794592

0

당신은 비트 연산으로 작업을 수행 할 수 있습니다

result = array[4]<<4 | array[3]<<3 | array[2]<<2 | array[1]<<1 | array[0]