работа реле по переменно не мешая друг другу

artemon25
Offline
Зарегистрирован: 25.12.2015

Добрый всем вечер может ктото подсказать мне по скетчу

#include <RCSwitch.h>
 
RCSwitch mySwitch = RCSwitch();
int relay6 = 6;
int relayPin = 7; //Реле будет тут
int relayChn = 8;
int relayOn = 9;
 
void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // приемник на pin 2 (DATA) 
  pinMode(relayPin, OUTPUT);
  pinMode(relayChn, OUTPUT);
  pinMode(relayOn, OUTPUT);
  pinMode(relay6, OUTPUT);
  digitalWrite(relayPin, HIGH);
  digitalWrite(relayChn, HIGH);
  digitalWrite(relayOn, HIGH);
  digitalWrite(relay6, HIGH);
}
 
void loop() {
  if (mySwitch.available()) {
    
    int value = mySwitch.getReceivedValue();
    
    if (value == 0) {
      Serial.print("error code"); // Ошибка приемка кода
    } else {
      Serial.print("code good"); // Принял код
      Serial.print( mySwitch.getReceivedValue() );
 
    }
    if (mySwitch.getReceivedValue() == 5312960) {   // 6133332 - код Включения1
      digitalWrite(relayPin, HIGH);
      digitalWrite(relayChn, HIGH);
      digitalWrite(relayPin, LOW);
      digitalWrite(relayChn, LOW);
    }
 
    if (mySwitch.getReceivedValue() == 5312816) {   // 6133332 - код Включения3
      digitalWrite(relayOn, HIGH);
      digitalWrite(relay6, HIGH);
      digitalWrite(relayOn, LOW);
      digitalWrite(relay6, LOW);
    }  
 
   
      
    if (mySwitch.getReceivedValue() ==   5312780) {   // 6133392 - код выключения1
      digitalWrite(relayPin, LOW);
       digitalWrite(relayChn, LOW);
      digitalWrite(relayPin, HIGH);
       digitalWrite(relayChn, HIGH);
    }   
 
     if (mySwitch.getReceivedValue() == 5312771) {   // 6133392 - код выключения3
      digitalWrite(relayOn, LOW);
      digitalWrite(relay6, LOW);
      digitalWrite(relayOn, HIGH);
      digitalWrite(relay6, HIGH);
     }
  } 
    mySwitch.resetAvailable();
  
}
 
у меня это работает от радиопульта попарно тоесть одну кнопку нажимаю включается два реле другую нажимаю эти два реле выключаются третья кнопка включает вторую пару реле и соответсвенно четвёртая выключает а вопрос нужно чтобы если какие либо два реле включены то другие два не включаются и наоборот . тоесть я так понимаю что в тело void loop() { надо добавить функцию 
     else {
    
    digitalWrite(relay6, HIGH);      пин6
    digitalWrite(relayPin, HIGH);    пин7
    digitalWrite(relayChn, LOW);   пин8
    digitalWrite(relayOn, LOW);     пин9
}
 
но где иммено его добавить а то я его в конце вставляю он работает не так как как я хочу 
если кому не лень пропишите в моём скетче куда и как втавить то что работает как надо
Заранее всем спасибо за внимание и за отве
Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

вот это работать не будет:

if (mySwitch.getReceivedValue() == 5312960) {   // 6133332 - код Включения1
      digitalWrite(relayPin, HIGH);
      digitalWrite(relayChn, HIGH);
      digitalWrite(relayPin, LOW);
      digitalWrite(relayChn, LOW);
    }

Какой смысл включать реле, чтобы через микросекунду его выключить? Оно даже отработать не успеет.

 

int value = mySwitch.getReceivedValue();

Тут тоже ошибка - максимальный размер int равен 32767, а у тебя 5312960.

 

нужно чтобы если какие либо два реле включены то другие два не включаются и наоборот

То есть чтобы что-то включилось, они все должны быть выключены?

#include <RCSwitch.h>
#define RELAY1    6
#define RELAY2    7
#define RELAY3    8
#define RELAY4    9
#define CODE_ON1  5312960    // первая кнопка включает первую пару реле
#define CODE_ON2  5312816    // третья кнопка включает вторую пару реле
#define CODE_OFF1 5312780    // вторая кнопка выключает первую пару реле
#define CODE_OFF2 5312771    // четвертая кнопка выключает вторую пару реле
#define ON        LOW        // это для инверсного реле. Поставить HIGH для обычного
#define OFF       HIGH       // это для инверсного реле. Поставить LOW для обычного

RCSwitch mySwitch = RCSwitch();

void setup() 
{
  Serial.begin(9600);
  mySwitch.enableReceive(0);   // приемник на pin 2 (DATA) 
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  pinMode(RELAY4, OUTPUT);
  relayChange(ON, ON, ON, ON); // принудительно выключаем реле с 1 по 4
  relayInfo();                 // выводим текущее состояние реле
}


void loop() 
{
  if (mySwitch.available()) 
  {
    unsigned long value = mySwitch.getReceivedValue();

    if (value == 0) 
    {
      Serial.println("error code"); // Ошибка приемка кода
    } 
    else 
    {
      Serial.println("code good");  // Принял код
      Serial.println( mySwitch.getReceivedValue() );
    }

    switch(value)                  // смотрим что пришло с пульта
    {
    case CODE_ON1:
    {
      if(digitalRead(RELAY3) == OFF && digitalRead(RELAY4) == OFF) // если 3 и 4 выключены,
        relayChange(ON, ON, OFF, OFF);                            // то включаем реле 1 и 2
      break;
    }

    case CODE_ON2:
    {
      if(digitalRead(RELAY1) == OFF && digitalRead(RELAY2) == OFF)
        relayChange(OFF, OFF, ON, ON);
      break;
    }

    case CODE_OFF1:
    {
      boolean r3 = digitalRead(RELAY3);
      boolean r4 = digitalRead(RELAY4);
      relayChange(OFF, OFF, r3, r4);  // выключаем реле 1 и 2, не изменяя состояние 3 и 4
      break;
    }

    case CODE_OFF2:
    {
      boolean r1 = digitalRead(RELAY3);
      boolean r2 = digitalRead(RELAY4);
      relayChange(r1, r2, OFF, OFF);
      break;
    }

    default:
      Serial.println("unknown code");
    }    
  relayInfo();                 // выводим состояние реле
  }
  mySwitch.resetAvailable();
}


void relayChange(boolean state1, boolean state2, boolean state3, boolean state4)
{
  digitalWrite(RELAY1, state1);
  digitalWrite(RELAY2, state2);
  digitalWrite(RELAY3, state3);
  digitalWrite(RELAY4, state4);
}


void relayInfo()
{
  Serial.print("Relay1: "); Serial.println(digitalRead(RELAY1) ? "OFF" : "ON");
  Serial.print("Relay2: "); Serial.println(digitalRead(RELAY2) ? "OFF" : "ON");
  Serial.print("Relay3: "); Serial.println(digitalRead(RELAY3) ? "OFF" : "ON");
  Serial.print("Relay4: "); Serial.println(digitalRead(RELAY4) ? "OFF" : "ON");
  Serial.println();
}

 

artemon25
Offline
Зарегистрирован: 25.12.2015

спасибо конечно за коментарий но начнем с того что этот скетч работает и работает отлично если включать реле с пульта когда захочешь и выключать и по коментарию

Тут тоже ошибка - максимальный размер int равен 32767, а у тебя 5312960.

могу сказать что цифры 5312960 это код который дает радиопульт и он тоже работает и нареканий нет при включение в сеть ардуино все реле выключены а затем если надо я могу включить реле попарно и выключить также а мне надо допустим при включение все реле так же выключены затем я включил одну пару реле а вторую не смог включить пока не выключу первую пару поэтому мне в мой скетч что надо добавить а что и куда честно говоря разобраться не могу. вот скетч который у меня работает просто

#include <RCSwitch.h>

 
RCSwitch mySwitch = RCSwitch();
int relay6 = 6;
int relayPin = 7; //Реле будет тут
int relayChn = 8;
int relayOn = 9;
 
void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // приемник на pin 2 (DATA) 
  pinMode(relayPin, OUTPUT);
  pinMode(relayChn, OUTPUT);
  pinMode(relayOn, OUTPUT);
  pinMode(relay6, OUTPUT);
  digitalWrite(relayPin, HIGH);
  digitalWrite(relayChn, HIGH);
  digitalWrite(relayOn, HIGH);
  digitalWrite(relay6, HIGH);
}
 
void loop() {
  if (mySwitch.available()) {
    
    int value = mySwitch.getReceivedValue();
    
    if (value == 0) {
      Serial.print("error code"); // Ошибка приемка кода
    } else {
      Serial.print("code good"); // Принял код
      Serial.print( mySwitch.getReceivedValue() );
 
    }
    if (mySwitch.getReceivedValue() == 5312960) {   включаю одну пару
      digitalWrite(relayPin, HIGH);
      digitalWrite(relayChn, HIGH);
      digitalWrite(relayPin, LOW);
      digitalWrite(relayChn, LOW);
    }
 
    if (mySwitch.getReceivedValue() == 5312816) {    включаю вторую пару
      digitalWrite(relayOn, HIGH);
      digitalWrite(relay6, HIGH);
      digitalWrite(relayOn, LOW);
      digitalWrite(relay6, LOW);
    }  
 
   
      
    if (mySwitch.getReceivedValue() ==   5312780) {    выключаю первую пару
      digitalWrite(relayPin, LOW);
       digitalWrite(relayChn, LOW);
      digitalWrite(relayPin, HIGH);
       digitalWrite(relayChn, HIGH);
    }   
 
     if (mySwitch.getReceivedValue() == 5312771) {    выключаю вторую пару  
      digitalWrite(relayOn, LOW);
      digitalWrite(relay6, LOW);
      digitalWrite(relayOn, HIGH);
      digitalWrite(relay6, HIGH);
     }
  } 
    mySwitch.resetAvailable();
  
}
что надо добавить для реализации моих потребностей
 
DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

По ходу, у вас реле включаются по низкому уровню, поэтому код можно подсократить:

  if (mySwitch.getReceivedValue() == 5312960) {   включаю одну пару
      digitalWrite(relayPin, HIGH); // выкинуть
      digitalWrite(relayChn, HIGH); // выкинуть
      digitalWrite(relayPin, LOW);
      digitalWrite(relayChn, LOW);
    }
 

и т.п., т.е. первые пары digitalWrite в каждом блоке if можно выкинуть - они бессмысленны.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

По поводу задачи: если я правильно понял, то есть четыре кнопки, по паре на каждую пару реле: одна кнопка включает свою пару реле, вторая - выключает. И надо сделать так, чтобы вторая пара реле не включалась, есть включена первая, и наоборот, так? Если так, то псевдокод, для понимания логики:

enum {RELAY_ON = LOW, RELAY_OFF = HIGH}; // чтобы настроить уровень включения реле
void SwitchRelays(bool bOn, byte pin1, byte pin2)
{
 digitalWrite(pin1, bOn ? RELAY_ON : RELAY_OFF);
digitalWrite(pin2, bOn ? RELAY_ON : RELAY_OFF);
}

bool bRelayGroup1IsOn = false;
bool bRelayGroup2IsOn = false;

void loop()
{
  unsigned long receivedValue = mySwitch.getReceivedValue();
  switch(receivedValue)
  {
case 5312960: {
if(!bRelayGroup2IsOn) {
bRelayGroup1IsOn  = true;
SwitchRelays(true,1,2); // включаем первую группу реле, если не включена вторая
}

} 
break;

case 11111: {
SwitchRelays(false,1,2); // выключаем первую группу реле
bRelayGroup1IsOn   = false;
}
break;
case 2222: {
if(!bRelayGroup1IsOn ) {
SwitchRelays(true,3,4); // включаем вторую группу реле, если не включена первая
bRelayGroup2IsOn = true;
}
}
break;

case 333: {
SwitchRelays(false,3,4); // выключаем вторую группу реле
bRelayGroup2IsOn = false;
}
break;
  case 0:
break;
default:
break;
  }
}

Принцип, надеюсь, понятен. Писал навскидку, грязно, некрасиво :)

artemon25
Offline
Зарегистрирован: 25.12.2015

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

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

artemon25 пишет:
Спасибо за подсказку к сожалению сейчас не могу проверить завтра проверю и отпишусь По поводу что принцип понятен если честно не понятен но постараюсь разобраться а к вам просьба если есть возможность написать точный скетч со всеми моими кодами для радио управления. Заранее спасибо за подсказки и за помощь

А чем мой скетч не нравится?

artemon25
Offline
Зарегистрирован: 25.12.2015

мне всем нравится но он не окончен где объявить какие пины задействованны под реле как OUTPUT нужны 6789 объявить что радиоприёмник находится на пине 2 наверное надо подключить библиотеку #include <RCSwitch.h> ну и наконец прописать мои коды с пульта

я подумал что может быть должно быть так 

#include <RCSwitch.h>
 
RCSwitch mySwitch = RCSwitch();
int relay6 = 6;
int relay7 = 7; //Реле будет тут
int relay8 = 8;
int relay9 = 9;
 
void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // приемник на pin 2 (DATA) 
  pinMode(relay6, OUTPUT);
  pinMode(relay7, OUTPUT);
  pinMode(relay8, OUTPUT);
  pinMode(relay9, OUTPUT);
  digitalWrite(relay6, HIGH);
  digitalWrite(relay7, HIGH);
  digitalWrite(relay8, HIGH);
  digitalWrite(relay9, HIGH);
}
 
enum {RELAY_ON = LOW, RELAY_OFF = HIGH}; // чтобы настроить уровень включения реле
void SwitchRelays(bool bOn, byte pin1, byte pin2)
{
 digitalWrite(pin1, bOn ? RELAY_ON : RELAY_OFF);
digitalWrite(pin2, bOn ? RELAY_ON : RELAY_OFF);
}
 
bool bRelayGroup1IsOn = false;
bool bRelayGroup2IsOn = false;
 
void loop()
 
{
  unsigned long receivedValue = mySwitch.getReceivedValue();
  switch(receivedValue)
  {
case 5312960: {
if(!bRelayGroup2IsOn) {
bRelayGroup1IsOn  = true;
SwitchRelays(true,1,2); // включаем первую группу реле, если не включена вторая
}
 
break;
 
case 5312780: {
SwitchRelays(false,1,2); // выключаем первую группу реле
bRelayGroup1IsOn   = false;
}
break;
case 5312816: {
if(!bRelayGroup1IsOn ) {
SwitchRelays(true,3,4); // включаем вторую группу реле, если не включена первая
bRelayGroup2IsOn = true;
}
}
break;
 
case 5312771: {
SwitchRelays(false,3,4); // выключаем вторую группу реле
bRelayGroup2IsOn = false;
}
break;
  case 0:
break;
default:
break;
  }
}
но это не работает вообще где надо чтото поправлять выходит ошибка на этой строке
 
 unsigned long receivedValue = mySwitch.getReceivedValue();
 
и пишет ошибку
 
expected initializer before 'unsigned'
expected unqualified-id before 'switch'
expected initializer before 'unsigned'
 
что делать честно говоря никак не разберусь пробовал много что менять добавлять но результат ноль
если можно поправьте что не так

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

artemon25 пишет:
мне всем нравится но он не окончен где объявить какие пины задействованны под реле как OUTPUT нужны 6789 объявить что радиоприёмник находится на пине 2 наверное надо подключить библиотеку #include <RCSwitch.h> ну и наконец прописать мои коды с пульта

Так ведь все уже прописано:

#include <RCSwitch.h>
#define RELAY1    6
#define RELAY2    7
#define RELAY3    8
#define RELAY4    9
#define CODE_ON1  5312960    // первая кнопка включает первую пару реле
#define CODE_ON2  5312816    // третья кнопка включает вторую пару реле
#define CODE_OFF1 5312780    // вторая кнопка выключает первую пару реле
#define CODE_OFF2 5312771    // четвертая кнопка выключает вторую пару реле
#define ON        HIGH
#define OFF       LOW

RCSwitch mySwitch = RCSwitch();

Если у тебя реле инверсные, то в строках 10-11 поменять местами HIGH и LOW.

artemon25
Offline
Зарегистрирован: 25.12.2015

я втавляю как наисано у тебя а что делать мне с ошибкой которая выходит на

 unsigned long receivedValue = mySwitch.getReceivedValue(); и пишет ошибку

sketch_mar04b:30: error: expected initializer before 'unsigned'
sketch_mar04b:31: error: expected unqualified-id before 'switch'
expected initializer before 'unsigned'
 
Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

в моем скетче (см. пост #1) нет строки unsigned long receivedValue = mySwitch.getReceivedValue();

artemon25
Offline
Зарегистрирован: 25.12.2015
 
вот скетч который вы мне дали
 
 
01 enum {RELAY_ON = LOW, RELAY_OFF = HIGH}; // чтобы настроить уровень включения реле
02 void SwitchRelays(bool bOn, byte pin1, byte pin2)
03 {
04  digitalWrite(pin1, bOn ? RELAY_ON : RELAY_OFF);
05 digitalWrite(pin2, bOn ? RELAY_ON : RELAY_OFF);
06 }
07  
08 bool bRelayGroup1IsOn = false;
09 bool bRelayGroup2IsOn = false;
10  
11 void loop()
12 {
13   unsigned long receivedValue = mySwitch.getReceivedValue();
14   switch(receivedValue)
15   {
16 case 5312960: {
17 if(!bRelayGroup2IsOn) {
18 bRelayGroup1IsOn  = true;
19 SwitchRelays(true,1,2); // включаем первую группу реле, если не включена вторая
20 }
21  
22 }
23 break;
24  
25 case 11111: {
26 SwitchRelays(false,1,2); // выключаем первую группу реле
27 bRelayGroup1IsOn   = false;
28 }
29 break;
30 case 2222: {
31 if(!bRelayGroup1IsOn ) {
32 SwitchRelays(true,3,4); // включаем вторую группу реле, если не включена первая
33 bRelayGroup2IsOn = true;
34 }
35 }
36 break;
37  
38 case 333: {
39 SwitchRelays(false,3,4); // выключаем вторую группу реле
40 bRelayGroup2IsOn = false;
41 }
42 break;
43   case 0:
44 break;
45 default:
46 break;
47   }
48 }

на 13 строке дает мне ошибку

 
Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

будьте внимательны, этот скетч давал DIYMan, а по его скетчу все вопросу к нему :)

artemon25
Offline
Зарегистрирован: 25.12.2015

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

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

вы оочень невнимательны, два поста назад было сказано: в моем скетче (см. пост #1)...

Клапауцийxxx, вернись!!! Моя ушла в монастырь...

artemon25
Offline
Зарегистрирован: 25.12.2015

да действительно я лохонулся этот пост у меня был а скетч скрыт а я и не увидел что он скрыт извини что мозги делал сейчас проверю и отпишусь

artemon25
Offline
Зарегистрирован: 25.12.2015

всё похоже работает единственное при выключение второй пары реле при условии что первая пара не ключена при нажатие кнопки выключение вторая пара выключается а первая сама по себе включается где надо исправить?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

ага, ошибочка там была (копипаст - зло).

    case CODE_OFF2:
    {
      boolean r1 = digitalRead(RELAY1);
      boolean r2 = digitalRead(RELAY2);
      relayChange(r1, r2, OFF, OFF);
      break;
    }

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Tomasina пишет:

Клапауцийxxx, вернись!!! Моя ушла в монастырь...

а, смысл? - объяснять челу с повреждённым логическим мышлением, что у него что то не то с головой?

artemon25
Offline
Зарегистрирован: 25.12.2015

всё отлично работает благодарю что не отказались в помощи могу чисто символическую сумму перечислить на телефон или как то по другому в знак благодарности и извиняюсь за непонятки которые возникли во время переписки

artemon25
Offline
Зарегистрирован: 25.12.2015

Клапауций 322 пишет:

Tomasina пишет:

Клапауцийxxx, вернись!!! Моя ушла в монастырь...

а, смысл? - объяснять челу с повреждённым логическим мышлением, что у него что то не то с головой?

я конечно понимаю  что есть люди которые во всём разбираются но и у меня с головой всё в порядке и слава богу с мышлением всё ОК а вам если лишний раз объяснять тяжело то не надо и других оскарблять.

на этом сайте я только т не знал как им пользоваться где что скрыто и где как обозначенны посты, а вообще всем спасибо за ответы

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

artemon25 пишет:

я конечно понимаю  что есть люди которые во всём разбираются но и у меня с головой всё в порядке и слава богу с мышлением всё ОК а вам если лишний раз объяснять тяжело то не надо и других оскарблять.

ну, не знаю, как ты смог в одном предложении совместить столько логических противоречий:
 
- не существует людей, которые во всём разбираются.
- факт сусчествоания бога не доказан, славить нечто за то, чего у тебя нет - странно.
- я тебя не оскорблял, а констатировал факт.
SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

artemon25 пишет:

SU-27-16 пишет:

artemon25  , не наезд ! вовсе !!
не просил - не плати  - моя бы обиделась ! скажи "спасибо"
это не ветка - "Ищу исполнителя"
...твоё мнение-решение - главнее , конечно :)-

спасибо что указали на то что на этой ветке услуги без денег этого конечно я не знал

не указывал моя ничего ( нет прав ) - а ты понял правильно !

как спросишь - так и ответят !!!!!
другие темы не читал чё ли ?

artemon25
Offline
Зарегистрирован: 25.12.2015

SU-27-16 пишет:

artemon25 пишет:

SU-27-16 пишет:

artemon25  , не наезд ! вовсе !!
не просил - не плати  - моя бы обиделась ! скажи "спасибо"
это не ветка - "Ищу исполнителя"
...твоё мнение-решение - главнее , конечно :)-

спасибо что указали на то что на этой ветке услуги без денег этого конечно я не знал

не указывал моя ничего ( нет прав ) - а ты понял правильно !

как спросишь - так и ответят !!!!!
другие темы не читал чё ли ?

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

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

artemon25  , читай и изучай ДатаШиты....
...здесь - читай и отмечай