Найти тему
Stepan.Burmistrov

Arduino, Битовые операции, UART, Практика с Tinkercad 🛠💡

Arduino, Битовые операции, UART🛠💡

Arduino позволяет не только взаимодействовать с различными датчиками и устройствами, но и проводить битовые операции, используемые во многих языках программирования, позволяя более гибко управлять данными и сокращать используемую память, а также уменьшать объем передаваемых данных

📜 Операция битовый сдвиг

Операция битового сдвига (<< или >>) позволяет сдвинуть биты переменной влево или вправо, заполняя пустующие позиции нулями.
Например, если у нас есть байт
00000101 и мы применяем операцию сдвига влево на один бит (<< 1), то получим 00001010.

🌟 Практика

🌟 Считывание данных и передача через Serial

byte a = 0; // Объявление переменной

void setup()
{
for (int i=2; i<=9; i++) pinMode(i, INPUT_PULLUP); // Настройка пинов на ввод
Serial.begin(9600); // Инициализация последовательного порта
}

void loop()
{
a = 0; // Обнуление переменной
for (int i=0; i<=7; i++){
byte t = !digitalRead(9-i); // Чтение пина и инвертирование (включено - 1, выключено - 0)
a = a | (t << i); // Операция ИЛИ и битовый сдвиг для добавления бита в переменную
}
Serial.write(a); // Отправка данных
delay(10);
}

В этом примере, 8 кнопок записывают свои состояния в 8 битов, которые передаются по UART всего в одном байте, а 8 светодиодов меняют свои состояния в соответствии с полученными данными, разделяя полученный байт обратно на биты.

Код приемника:

byte a = 0;

void setup()
{
for (int i=2; i<=9; i++) pinMode(i, OUTPUT); // Настройка пинов на вывод
Serial.begin(9600);
}

void loop()
{
if (Serial.available()){
byte t = Serial.read(); // Чтение байта
for (int i=0; i<=7; i++){
byte b = (t >> i) % 2; // Битовый сдвиг и определение значения бита
digitalWrite(9-i, b); // Установка значения пина
}
}
}

✨ Tinkercad Схема

https://www.tinkercad.com/things/2hWiVc3hWgx

В Tinkercad вы можете создать схему, протестировать и визуализировать данный процесс, объединив теорию и практику, и увидеть, как работают битовые операции в Arduino!