Помогите с библиотекой RC switch

ПавеJI
Offline
Зарегистрирован: 01.05.2018

Всем доброго времени суток, подскажите, есть здесь те кто имел дело с библиотекой RC switch? В общем, нужно мне чтобы ардуино с приемником 433 Мгц выполняло действие по команде с пульта-брелка 433Мгц (здесь это пуск светодиода на 13 пине, в окончательном скетче будет другая). Если написать скетч, чтобы по команде одной кнопки это действие запускалось, а по команде другой кнопки прекращалось, то все получается легко и просто. Мне же нужно чтобы действие запускалось и останавливалось по команде только одной кнопки, для этого я использовал флажки, но нормально скетч не работает. Пытался разобраться в описании библиотеки, но че-то ничего не нашел. 5200552 - это код кнопки.

 

#include <RCSwitch.h> 

boolean butt_flagA = 0; 

boolean buttA; 

unsigned long last_press; 

RCSwitch mySwitch = RCSwitch(); 

void setup() { 

mySwitch.enableReceive(0); // Receiver on inerrupt 0 => that is pin #2 

pinMode(13, OUTPUT); 

} 

void loop() { 

if (mySwitch.available()){ 
int value = mySwitch.getReceivedValue(); 
if ( mySwitch.getReceivedValue() == 5200552) { 
buttA = 1; 
} 

if (buttA == 1 && butt_flagA == 0 && millis() - last_press > 200) { 
butt_flagA = 1; 
digitalWrite(13, HIGH); 
last_press = millis(); 
} 

if (buttA == 1 && butt_flagA == 1 && millis() - last_press > 200) { 
butt_flagA = 0; 
digitalWrite(13, false); 
last_press = millis(); 
} 
} 
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
ПавеJI
Offline
Зарегистрирован: 01.05.2018

Всем доброго времени суток, подскажите, есть здесь те кто имел дело с библиотекой RC switch? В общем, нужно мне чтобы ардуино с приемником 433 Мгц выполняло действие по команде с пульта-брелка 433Мгц (здесь это пуск светодиода на 13 пине, в окончательном скетче будет другая). Если написать скетч, чтобы по команде одной кнопки это действие запускалось, а по команде другой кнопки прекращалось, то все получается легко и просто. Мне же нужно чтобы действие запускалось и останавливалось по команде только одной кнопки, для этого я использовал флажки, но нормально скетч не работает. Пытался разобраться в описании библиотеки, но че-то ничего не нашел. 5200552 - это код кнопки.

 

#include <RCSwitch.h> 



boolean butt_flagA = 0; 



boolean buttA; 



unsigned long last_press; 



RCSwitch mySwitch = RCSwitch(); 



void setup() { 



mySwitch.enableReceive(0); // Receiver on inerrupt 0 => that is pin #2 



pinMode(13, OUTPUT); 



} 



void loop() { 



if (mySwitch.available()){ 

int value = mySwitch.getReceivedValue(); 

if ( mySwitch.getReceivedValue() == 5200552) { 

buttA = 1; 

} 



if (buttA == 1 && butt_flagA == 0 && millis() - last_press > 200) { 

butt_flagA = 1; 

digitalWrite(13, HIGH); 

last_press = millis(); 

} 



if (buttA == 1 && butt_flagA == 1 && millis() - last_press > 200) { 

butt_flagA = 0; 

digitalWrite(13, false); 

last_press = millis(); 

} 

} 

}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Для начала посмотрите в лупе, вообще, что-нибудь принимается?

в setup добавить
Serial.begin(9600); 

void loop() {
if (mySwitch.available()){
int value = mySwitch.getReceivedValue();
Serial.println(value); 
	} 
delay(1000);
)

 

ПавеJI
Offline
Зарегистрирован: 01.05.2018

В мониторе порта начинает появляться число 23208 с периодичностью где-то раз в 1 секунду.

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

А теперь:

Кнопки понажимать, соответствия составить и записать, цифирьки и будут ваши команды

sadman41
Offline
Зарегистрирован: 19.10.2016

У меня вопрос - почему светодиод должен загораться, если по коду следует, что ему полагается моргать?

ПавеJI
Offline
Зарегистрирован: 01.05.2018

Вот тут значит глюк, по замыслу, по нажатию на кнопку светодтод должен просто загореться, по следующему нажатию погаснуть, ну и т.д. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ардуина не может работать по замыслу, она работает по алгоритму. Сейчас он таков, что butt_flagA перекидывается в true/false пока не станет buttA неравным единице. А он никогда таковым не становится - из кода все совершенно очевидно. Никакого глюка нет - как написано, так и работает.

ПавеJI
Offline
Зарегистрирован: 01.05.2018

Спасибо за наводку, нифига не ясно так сразу (опыт всего 1 месяц), постараюсь допереть что нужно переписать, чтоб работало как мне нужно

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ПавеJI пишет:

Спасибо за наводку, нифига не ясно так сразу (опыт всего 1 месяц), постараюсь допереть что нужно переписать, чтоб работало как мне нужно

А вот так?:

#include <RCSwitch.h> 
int led = LOW;
RCSwitch mySwitch = RCSwitch(); 

void setup() {
mySwitch.enableReceive(0); // Receiver on inerrupt 0 => that is pin #2 
pinMode(13, OUTPUT); 
digitalWrite(13,led);
}

void loop() {
if (mySwitch.available()){ 
unsigned int value = mySwitch.getReceivedValue(); 
if ( value == 23208) { 
led = !led;
digitalWrite(13,led);
   }}
   delay(2000);
   } 

 

bwn
Offline
Зарегистрирован: 25.08.2014

ПавеJI пишет:

Спасибо за наводку, нифига не ясно так сразу (опыт всего 1 месяц), постараюсь допереть что нужно переписать, чтоб работало как мне нужно

А теперь на коньячок, loop, он по кругу ходит.