Это правильный способ использования радиочастотной связи?

У меня есть Супергетеродинный приемник 433 МГц и ручной пульт дистанционного управления с аналогичной частотой, я использую Библиотека RC-Switch, и я не смог найти лучшего способа, чем использовать "цифры", которые я получаю следующим образом:

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Приемник по прерыванию 0 => это контакт №2
  pinMode(13, OUTPUT);
}

void loop() {
  if (mySwitch.getReceivedValue() == 7264305) {
    digitalWrite(13, LOW);
  }
  if (mySwitch.getReceivedValue() == 7264308) {
    digitalWrite(13, HIGH);
  }
  if (mySwitch.getReceivedValue() == 7264306) {
    mySwitch.resetAvailable();
  }
}

Есть ли какой-либо другой (лучший?) способ, чем просто использовать "цифры" просто так, или все используют свои удаленные команды, как я?

, 👍1

Обсуждение

все данные - это просто числа ... ваши передаваемые данные имеют длину 24 бита ... например, десятичное 7264305 преобразуется в 24-битное двоичное 011011101101100000110001, которое может быть описано в шестнадцатеричном виде как 6ED831 .... некоторые битов являются состояниями переключателя, а остальные, вероятно, являются заранее определенным заполнителем, который можно использовать для проверки достоверности передачи, или они могут быть адресом передатчика., @jsotola

для полученных значений «7264305», «7264306» и «7264308» последние 4 бита полученных данных равны «0001», «0010» и «0100» соответственно., @jsotola


1 ответ


Лучший ответ:

1

Кредиты для этого ответа в основном для jsotola (см. его комментарии выше). Но я хочу показать альтернативу операторам if и способ получить последние 4 бита:

  1. Если вы хотите проверить младшие биты, используйте ((mySwitch.getReceivedValue() & 0xFFFFF0)
  2. ЧТОБЫ проверить четыре младших бита (данные, с которыми вы хотите действовать), используйте ((mySwitch.getReceivedValue() & 0xF)
  3. Используйте оператор switch вместо оператора if; также теоретически (я не знаю, что код mySwitch.getReceivedValue() не нужно выполнять несколько раз.

Итак, вы получите что-то вроде этого:

void loop() 
{
  unsigned long receivedValue = mySwitch.getReceivedValue(); // Вызов функции только один раз

  if ((receivedValue & 0xFFFF0) == 0x6ED830)
  {
    // Действие процесса
    switch (receivedValue & 0xF)
    {
    case 0x5:
      digitalWrite(13, LOW);
      break;

    case 0x8:
      digitalWrite(13, HIGH);
      break;

    case 0x6:
      mySwitch.resetAvailable();
      break;

    default: // Все остальные значения
      break; // Игнорировать
  }
}
,