Как понять контролеру что нет нужного кода с RF433 передатчика и выполнить действие

SultanRR
Offline
Зарегистрирован: 03.01.2019

Доброго времени )подскажите Как реализовать таймер (что то типо ).

После получения приемником нужного кода(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);
  }
}

 

Morroc
Offline
Зарегистрирован: 24.10.2016

Что функция getreceivedvalue возвращает когда сигнала нет ?

Ну почти правильно вроде, только вытащите проверки counter из под других условий, пусть сами по себе проверяются всегда.

b707
Offline
Зарегистрирован: 26.05.2017

Султан, код, прямо скажем, кривоватый.

Что поправить -

- как уже сказали, условие строки 68 вынести в основной цикл ЛУП, по аналогии с условием строки 77. Условие строки 66 вовсе не нужно - выкинуть.

- проверка пришедшего с пульта кода каждый раз новым запросом mySwitch.getReceivedValue() - это криво и громоздко.  Прочитайте ReceivedValue один раз, положите в переменную, как это сделано в строке 30 - и потом сравнивайте с переменной. Только переменную, конечно же. нужно опсать правильно, чтобы размерности хватало и она не была локальной для пары скобок

SultanRR
Offline
Зарегистрирован: 03.01.2019

Когда нет сигнала . по истечению определенног времени с момента получения последнего сигнала отключить реле4 .Собственно что это такое )) : На реле 4 висит освещение , а код который его должен запускать это код с одного из беспроводных датчиков движения сигнализации .так же  далее еще допишу что бы можно было это реле4 просто кнопкой запускать и этой же кнопкой выключать но с этим все просто  )))

Буду изучать как вынести counter  :))

Morroc
Offline
Зарегистрирован: 24.10.2016

Вот вы запустили таймер и он тикает. Зависит это как то от приема команд ? Вроде нет - значит вытаскиваете эти все таймеры отдельно (не запуск count = millis - эти на месте, а проверки, что время истекло) и пусть в общем цикле самостоятельно проверяются каждый раз, а сейчас у вас это упихано внутрь проверок принятых кодов.