В этом посте мы увидим, как реализовать преобразователь десятичного числа в двоичный, который отображает соответствующее значение с помощью 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/