В этом посте мы увидим, как реализовать преобразователь десятичного числа в двоичный, который отображает соответствующее значение с помощью 4 светодиодов, но может быть легко расширен до большего количества светодиодов для большего числа.

Концепция: 4-битное двоичное число может представлять десятичное число от 0 до 2⁴, то есть от 0 до 15. Таким образом, используя светодиод N, мы можем представить число от 0 до 2^N -1.

Шаги
1. Установите стандартный код и откройте последовательный порт.
2. Возьмите ввод с последовательного ввода и разберите его на число. (Это необязательно, если вы используете предопределенный метод Serial.parseInt())
3. Проверьте, установлен ли k-й бит числа или нет. В зависимости от этого включите или выключите соответствующий светодиод с помощью digitalWrite.

/*
 * Following program receives a number for Serial input then turns on corresponding LED based on binary conversion of number.
 * It uses 4 led meaning 2^4 -1 value can be represented but can be extended for bigger values as well
 * It assumes 0th index value corresponds to MSB(most significant bit) and last index value to LSB(least significant bit)
 */
int value = 0;
int pin[4] = {5,4,3,2}; // Corresponds to -> {D5, D4, D3, D2} respectively
int totalPins = 4;
int incomingByte = 0; // for reading byte by byte
bool validValue = false;
void setup() {
  Serial.begin(9600); 
  for (int i = 0; i < totalPins; ++i) {
    pinMode(pin[i], OUTPUT);
  }
  // reset all pins
  for (int i = 0; i < totalPins; ++i) {
    digitalWrite(pin[i], LOW);
  }
}
void loop() {
  // read and parse integer
  //Numbers ranges from 48 to 57 in ASCII table
   while (Serial.available() > 0) {
    incomingByte = Serial.read();
    if (incomingByte >= 48 && incomingByte <= 57) {
      value = value * 10 + incomingByte - 48;
      validValue = true;
    }
    else if(validValue){ // execute only if value is valid
      for (int i = 0; i < totalPins; ++i) {
        if (kthBit(value, i)) {
          digitalWrite(pin[i], HIGH);
        }
        else {
          digitalWrite(pin[i], LOW);
        }
      }
      value = 0;
      validValue = false;
      break;
    }
  }
}
// function to find kth bit of a given number e.g. for n = 2 
//(00000010) will give true for k =2 bit and false for k =1 bit
bool kthBit(int n, int k) {
  return (n & (1 << k)) != 0;
}

[1]. Репозиторий: Исходный код
https://github.com/aadarsh-panwar/arduino-examples.git

[2]: Проверить, установлен ли k-й бит или нет
https://www.geeksforgeeks.org/check-whether-k-th-bit-set-not/

[3]: Fritzing: для создания принципиальной схемы
https://fritzing.org/