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
@Kokachi, 👍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 что - либо делала.
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- как быстро loop() работает в Arduino
- Использовать Arduino Nano V3 для программирования другого Arduino (Pro Mini)?
- Как прочитать значение PIN PWM-выхода?
- Как мигать светодиодом и одновременно запускать другой код?
- Подключение Arduino Nano к Raspberry Pi Zero
- Как использовать get_properties для получения RSSI в RF24?
- Как автоматически сбросить модуль NRF24L01
О-о-о ... теперь я понимаю,что пошло не так с моей командой "если", "еще". Спасибо, ваш код сработал. Я не знал, что существует команда (!) для переключения. Я думал, это просто компаратор., @Kokachi
@Kokachi
!
- это не компаратор ... это логическое НЕ, @jsotolaКак jsotola написал свой логический НЕ оператор. Это отрицает ценность операнта, превращая "истину" в `ложь " и наоборот., @chrisl
Теперь я это понимаю. Раньше, когда я просматривал документацию, я видел
`!
в операторе сравнения. По-моему, это было`!=
`, @Kokachi