Управление реле по радиоканалу.

Sonin02
Offline
Зарегистрирован: 25.08.2016

Добрый день. Нужна помощь. Нужно чтобы при нажатии на пульте кнопки, реле замыкалось, а при повторном реле размыкалось. Как это реализовать не знаю.  Пока получилься такой код. 

const int Rel1=10;

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  digitalWrite(Rel1, HIGH);
  pinMode(Rel1, OUTPUT);
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
}

void loop() {
  if (mySwitch.available()) {
    
    int value = mySwitch.getReceivedValue();
    
    if (value == 0) {
      Serial.print("Unknown encoding");
    } else {
      
      Serial.println( mySwitch.getReceivedValue() );
if(mySwitch.getReceivedValue()==7551673){Serial.print(" pir1 komnata "); }
else if(mySwitch.getReceivedValue()==1326849){digitalWrite(Rel1, LOW);} // 1-е реле вкл
else {Serial.print("EROR");}
    }
    mySwitch.resetAvailable();
  }
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Если у вас это https://goo.gl/Dn53EO. то библиотека точно лишняя.

Sonin02
Offline
Зарегистрирован: 25.08.2016

А как тогда?

Sonin02
Offline
Зарегистрирован: 25.08.2016

Сделал то что хотел, но при нажатии на другие кнопки реле срабатывает (коды этих кнопок совершенно другие). Вот что получилось

const int Rel1=8;
uint8_t flagA, flagB;

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  pinMode(Rel1, OUTPUT);
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
}

void loop() {
  if (mySwitch.available()) {
    
    int value = mySwitch.getReceivedValue();
    
    if (value == 0) {
      Serial.print("Unknown encoding");
    } else {
      
      Serial.println( mySwitch.getReceivedValue() );
if(mySwitch.getReceivedValue()==7551673){Serial.print(" pir1 komnata ");}
else if(mySwitch.getReceivedValue()==1326849)flagA = !flagA; // 1-е реле
else {Serial.print("EROR");}
if(flagA)
	{
		digitalWrite(Rel1,1);
		flagA = !flagA;
	}
else 
{
	digitalWrite(Rel1,0);
	flagA = !flagA;
}
  
    }

    mySwitch.resetAvailable();
  }
}

 

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

Так а чего Вы хотели. Оно у Вас должно срабатывать по условию в строке 25, так. А Вы срабатывание вытащили в строки 27-38, которые от условия никак не зависят. Вот она у Вас и срабатывает по любой кнопке.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015
#define Rel1 8

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  pinMode(Rel1, OUTPUT);
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
}

void loop() {
  if (mySwitch.available()) {
    unsigned long value = mySwitch.getReceivedValue();
    Serial.print(value);
    switch (value) {
      case 0:
        Serial.println(" - Unknown encoding");
        break;
      case 7551673:
        Serial.println(" - pir1 komnata ");
        break;
      case 1326849:
        digitalWrite(Rel1, !digitalRead(Rel1));
        break;
      default:
        Serial.println(" - EROR");
    }
    mySwitch.resetAvailable();
  }
}

 

Sonin02
Offline
Зарегистрирован: 25.08.2016

xDriver пишет:

#define Rel1 8

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  pinMode(Rel1, OUTPUT);
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
}

void loop() {
  if (mySwitch.available()) {
    unsigned long value = mySwitch.getReceivedValue();
    Serial.print(value);
    switch (value) {
      case 0:
        Serial.println(" - Unknown encoding");
        break;
      case 7551673:
        Serial.println(" - pir1 komnata ");
        break;
      case 1326849:
        digitalWrite(Rel1, !digitalRead(Rel1));
        break;
      default:
        Serial.println(" - EROR");
    }
    mySwitch.resetAvailable();
  }
}

 

Спасибо большое. Всё работает). 

Pahan
Offline
Зарегистрирован: 03.02.2017

Как при нажатии и удержинии кнопки любое время получить только 1 включение реле,

а при повторном нажатии и удержании кнопки любое время - 1 выключение реле ???

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

1. Побороть дребезг, чтобы левые сигналы не пёрли.

2. Реализовать следующую логику:

ВЕЧНЫЙ ЦИКЛ
   ОбновитьТекущееСостояниеКнопки;
   ЕСЛИ ТекущееСостояниеКнопки==Нажата и ПредыдущееСостояниеКнопки==НеНажата ТО {
       ЕСЛИ СостояниеРеле == Выключено ТО ВключитьРеле ИНАЧЕ ВыключитьРеле
   }
   ПредыдущееСостояниеКнопки= ТекущееСостояниеКнопки;
КОНЦЕ ЦИКЛА
 
Pahan
Offline
Зарегистрирован: 03.02.2017
#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();
int led  = 12;

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

void loop()
{
  if (mySwitch.available())
  {
    unsigned long value = mySwitch.getReceivedValue();
    Serial.print(value);
    switch (value) {
    case 0:
    Serial.println(" - Unknown encoding");
    break;
    case 2276802:
    digitalWrite(led, !digitalRead(led));
    break;
    default:
    Serial.println(" - EROR");
         }
         mySwitch.resetAvailable();
       }
    }

 

Pahan
Offline
Зарегистрирован: 03.02.2017

Евгений П

Что там насчет вечного цикла, а то я две недели, как ардуинщик.

При удержании кнопки на радиопульте с приемника периодически поступает код  ( в моем случае case 2276802) и диод (реле и т.д.) блин мигает постоянно, а нужно, что бы хоть при однократном хоть при длительном нажатии кнопки пульта - реле(диод) включилось При повторном однократном (либо длительном) нажатии этой кнопки пульта -выключилось.

 

 

 

 

 

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

Вечный цикл? Ну, например, функция loop - она вечно вызывается.

Pahan
Offline
Зарегистрирован: 03.02.2017

чет вот бы по доступней кок то?

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

То, что написано между "ВЕЧНЫЙ ЦИКЛ" и "КОНЦЕ ЦИКЛА" нужно выполнять бесконечное количество раз. Например, функция loop постоянно бесконечно вызывается. Так что можно все это запихнуть в неё.

Pahan
Offline
Зарегистрирован: 03.02.2017

Евгений

Вот все вокруг, да около ...  туговато пока для меня это все  В виде куска счетча никаку что-ли?

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

Не, никак. В виде куска скетча спросите вот здесь.

Sonin02
Offline
Зарегистрирован: 25.08.2016

Pahan пишет:

Как при нажатии и удержинии кнопки любое время получить только 1 включение реле,

а при повторном нажатии и удержании кнопки любое время - 1 выключение реле ???

Тоже очень удобная вещь. А то поставил на открывание гаража, бывает жмёшь Реле включается и тут же выключается, иногда выбешивает.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Pahan пишет:

Евгений

Вот все вокруг, да около ...  туговато пока для меня это все  В виде куска счетча никаку что-ли?


Отрежь кусок да полож, хорошо что не требуют заливать в дуню за себя.
Для тс: Вам написали алгаритм при котором длительное нажатие не обрабатывается так как происходит обработка в момент смены состояния кнопки. Можете посде срабатывания реле добавить определенное время в течении которого реле будет невосприимчево к нажатиям