RF Keyfob простой код кнопки

Я делаю проект, в котором 2-канальный радиочастотный брелок (433 МГц) управляет светодиодом с помощью arduino nano. Что касается аппаратного обеспечения, то все работает, и я протестировал его с помощью примера кода декодера, и он работает нормально. Библиотека, которую я использую, - это RCSwitch.h для приема.

Я немного изменил код примера библиотеки, чтобы он соответствовал моему проекту. В основном я пытаюсь добиться того, чтобы светодиод включался, когда я нажимаю кнопку A на брелоке, и через некоторое время, если я снова нажму кнопку A, светодиод должен погаснуть. Однако с моим текущим кодом происходит то, что нажатие кнопки A заставляет светодиод включаться, а повторное нажатие кнопки A ничего не делает, но если я нажму кнопку B, светодиод погаснет. Так где же я ошибся?

Вот мой код

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();
int LED = LED_BUILTIN;
boolean statusled = LOW;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Приемник при прерывании 0 => то есть вывод #2
}

void loop() {
  if (mySwitch.available()) 
  {
    Serial.print(mySwitch.getReceivedValue());
    unsigned long int num = mySwitch.getReceivedValue();
    Serial.print(num);

    if (num == 16130609){
    mySwitch.disableReceive();
    
      if (statusled == LOW)
      statusled = HIGH;
    }
    else
    {
      statusled = LOW;
    }

    digitalWrite(LED, statusled);
    unsigned long time_now = millis();
    int ck = 500;
    while(millis() <time_now + ck)
    {;}

    
    mySwitch.resetAvailable();
    mySwitch.enableReceive(0);
  }
}

16130609-это значение, которое я получаю от кнопки декодирования A

16130610 - это значение кнопки B

, 👍1


1 ответ


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

1

Посмотрите еще раз на свою логику здесь:

if (num == 16130609){
    mySwitch.disableReceive();
    
    if (statusled == LOW) statusled = HIGH;
}
else
{
    statusled = LOW;
}

Когда вы нажмете A, вы получите num со значением 16130609. В том случае, если вы включите светодиод, если в данный момент он выключен. Но вы никогда не выключаете его там. Вы всегда будете попадать в этот оператор if при нажатии A. Вы не выключаете светодиод там, поэтому он не выключается, когда вы нажимаете A. Когда вы нажимаете B, вы получаете другое значение для num. Таким образом, предложение else будет выполнено, выключив светодиод.

Таким образом, код делает именно то, что вы ему велели.

Решение: Поскольку вы хотите переключить светодиод при нажатии кнопки A, вы должны просто переключить там значение statusled, вместо того чтобы явно устанавливать его. Это будет выглядеть так:

if (num == 16130609){
    mySwitch.disableReceive();
    
    statusled = !statusled;
}

Я удалил предложение else, так как вы не хотите, чтобы кнопка B что - либо делала.

,

О-о-о ... теперь я понимаю,что пошло не так с моей командой "если", "еще". Спасибо, ваш код сработал. Я не знал, что существует команда (!) для переключения. Я думал, это просто компаратор., @Kokachi

@Kokachi! - это не компаратор ... это логическое НЕ, @jsotola

Как jsotola написал свой логический НЕ оператор. Это отрицает ценность операнта, превращая "истину" в `ложь " и наоборот., @chrisl

Теперь я это понимаю. Раньше, когда я просматривал документацию, я видел`! в операторе сравнения. По-моему, это было `!= `, @Kokachi