Как понять контролеру что нет нужного кода с RF433 передатчика и выполнить действие
- Войдите на сайт для отправки комментариев
Чт, 04/06/2020 - 02:20
Доброго времени )подскажите Как реализовать таймер (что то типо ).
После получения приемником нужного кода(7345968) запустить реле4 , в случае отсутствия сигнала(7345968) в течении какого то времени отключить реле4 через допустим 10 сек
То есть как в самом конце кода реализована работа с кнопкой (пин4) так же с RF сигналом .
unsigned long counttime, counttime2; #include <RCSwitch.h> #define RELE1 7 #define RELE2 8 #define RELE4 11 #define RELE3 12 boolean RELELED = false ; RCSwitch mySwitch = RCSwitch(); void setup() { Serial.begin(115200); pinMode (RELE1, OUTPUT); pinMode (RELE2, OUTPUT); pinMode (RELE3, OUTPUT); pinMode (RELE4, OUTPUT); pinMode (4, INPUT_PULLUP); digitalWrite(RELE1, HIGH); digitalWrite(RELE2, HIGH); digitalWrite(RELE3, HIGH); digitalWrite(RELE4, HIGH); mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2 } void loop() { if (mySwitch.available()) { int value = mySwitch.getReceivedValue(); delay (100); if (value == 0) { Serial.print("Unknown encoding"); // выводим в порт } else { Serial.print("Received "); Serial.println( mySwitch.getReceivedValue() ); //код сигнала rc } if (mySwitch.getReceivedValue()==7346112) { digitalWrite(RELE1, LOW); digitalWrite(RELE2, HIGH); delay (400); digitalWrite(RELE1, HIGH); digitalWrite(RELE2, HIGH); } if (mySwitch.getReceivedValue()==7345932) { digitalWrite(RELE1, HIGH); digitalWrite(RELE2, LOW); delay (400); digitalWrite(RELE1, HIGH); digitalWrite(RELE2, HIGH); } if (mySwitch.getReceivedValue()==7345923) //кнопка на rc { RELELED = !RELELED; digitalWrite(RELE4, RELELED); } if (mySwitch.getReceivedValue()==7345968) { digitalWrite(RELE4, LOW); counttime = millis(); } if(mySwitch.getReceivedValue()!=7345968) { } if (millis() - counttime > 10000) {digitalWrite(RELE4, HIGH); } mySwitch.resetAvailable(); // сброс кода сигнала с rc } if(digitalRead(4) == 1) // датчик окрытия двери и запуск реле {digitalWrite(RELE3, LOW); counttime2 = millis(); } if(digitalRead(4) == 0) { } if (millis() - counttime2 > 4000) {digitalWrite(RELE3, HIGH); } }
Что функция getreceivedvalue возвращает когда сигнала нет ?
Ну почти правильно вроде, только вытащите проверки counter из под других условий, пусть сами по себе проверяются всегда.
Султан, код, прямо скажем, кривоватый.
Что поправить -
- как уже сказали, условие строки 68 вынести в основной цикл ЛУП, по аналогии с условием строки 77. Условие строки 66 вовсе не нужно - выкинуть.
- проверка пришедшего с пульта кода каждый раз новым запросом mySwitch.getReceivedValue() - это криво и громоздко. Прочитайте ReceivedValue один раз, положите в переменную, как это сделано в строке 30 - и потом сравнивайте с переменной. Только переменную, конечно же. нужно опсать правильно, чтобы размерности хватало и она не была локальной для пары скобок
Когда нет сигнала . по истечению определенног времени с момента получения последнего сигнала отключить реле4 .Собственно что это такое )) : На реле 4 висит освещение , а код который его должен запускать это код с одного из беспроводных датчиков движения сигнализации .так же далее еще допишу что бы можно было это реле4 просто кнопкой запускать и этой же кнопкой выключать но с этим все просто )))
Буду изучать как вынести counter :))
Вот вы запустили таймер и он тикает. Зависит это как то от приема команд ? Вроде нет - значит вытаскиваете эти все таймеры отдельно (не запуск count = millis - эти на месте, а проверки, что время истекло) и пусть в общем цикле самостоятельно проверяются каждый раз, а сейчас у вас это упихано внутрь проверок принятых кодов.