Как понять контролеру что нет нужного кода с 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 - эти на месте, а проверки, что время истекло) и пусть в общем цикле самостоятельно проверяются каждый раз, а сейчас у вас это упихано внутрь проверок принятых кодов.