Преобразовать 4 бита в десятичное число

И снова добрый вечер! На цифровые пины 2, 7, 8, 10 я принимаю состояние 4х битной шины. Мне нужно преобразовать это двоичное число в десятичное. Ну например 0100 - значит 2 и так далее. Конечно можно перебирать пины if-ами. Но может быть кто-то предложит лаконичное решение. Спасибо.

я нагуглил решения для пинов прилежащих одному и тому же регистру

  x = ((PINB&(1<<0))?(1<<0):0)       \
         | ((PINB&(1<<1))?(1<<1):0)    \
         | ((PINB&(1<<2))?(1<<2):0)    \
         | ((PINB&(1<<3))?(1<<3):0);

оно рабочее , но мне , как я понимаю не подойдет, Так пины 2,7 принадлежат регистру PD , а 8,10 регистру PB

Это что за система счисления такая “где 0100, значит 2” ?

да , верно отметили
0010, для меня это сути не меняет но так будет правильнее

bitSet + digitalRead = Profit

Что то типа этого:


const int pinArr[4]={2,7,8,10};

byte checkPins(){
    byte value=0;
    for(int i=3;i>=0;i--){
        value|=digitalRead(pinArr[i])<<i;
    }
    return value;    
}

2 лайка

Спасибо, отлично все подошло, но к сожалению пины отрабатывают не так как нужно. Вероятно,из за подключенных библиотек. Разбираться не стал. Поставлю отдельный МК и передам по UART готовый результат.

читать лучше параллельно

Ну если Вы путаете 0100 и 0010, то, думаю, знаете, где искать проблему (точно не в библиотеках).

Нет, ну почему же! А как же пресловутое “как пройти в библиотеку”?