работа реле по переменно не мешая друг другу
- Войдите на сайт для отправки комментариев
Ср, 02/03/2016 - 21:39
Добрый всем вечер может ктото подсказать мне по скетчу
#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
}
но где иммено его добавить а то я его в конце вставляю он работает не так как как я хочу
если кому не лень пропишите в моём скетче куда и как втавить то что работает как надо
Заранее всем спасибо за внимание и за отве
вот это работать не будет:
if (mySwitch.getReceivedValue() == 5312960) { // 6133332 - код Включения1 digitalWrite(relayPin, HIGH); digitalWrite(relayChn, HIGH); digitalWrite(relayPin, LOW); digitalWrite(relayChn, LOW); }Какой смысл включать реле, чтобы через микросекунду его выключить? Оно даже отработать не успеет.
Тут тоже ошибка - максимальный размер 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(); }спасибо конечно за коментарий но начнем с того что этот скетч работает и работает отлично если включать реле с пульта когда захочешь и выключать и по коментарию
Тут тоже ошибка - максимальный размер int равен 32767, а у тебя 5312960.
могу сказать что цифры 5312960 это код который дает радиопульт и он тоже работает и нареканий нет при включение в сеть ардуино все реле выключены а затем если надо я могу включить реле попарно и выключить также а мне надо допустим при включение все реле так же выключены затем я включил одну пару реле а вторую не смог включить пока не выключу первую пару поэтому мне в мой скетч что надо добавить а что и куда честно говоря разобраться не могу. вот скетч который у меня работает просто
#include <RCSwitch.h>
По ходу, у вас реле включаются по низкому уровню, поэтому код можно подсократить:
if (mySwitch.getReceivedValue() == 5312960) { включаю одну пару digitalWrite(relayPin, HIGH); // выкинуть digitalWrite(relayChn, HIGH); // выкинуть digitalWrite(relayPin, LOW); digitalWrite(relayChn, LOW); }и т.п., т.е. первые пары digitalWrite в каждом блоке if можно выкинуть - они бессмысленны.
По поводу задачи: если я правильно понял, то есть четыре кнопки, по паре на каждую пару реле: одна кнопка включает свою пару реле, вторая - выключает. И надо сделать так, чтобы вторая пара реле не включалась, есть включена первая, и наоборот, так? Если так, то псевдокод, для понимания логики:
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; } }Принцип, надеюсь, понятен. Писал навскидку, грязно, некрасиво :)
Спасибо за подсказку к сожалению сейчас не могу проверить завтра проверю и отпишусь
По поводу что принцип понятен если честно не понятен но постараюсь разобраться а к вам просьба если есть возможность написать точный скетч со всеми моими кодами для радио управления. Заранее спасибо за подсказки и за помощь
А чем мой скетч не нравится?
мне всем нравится но он не окончен где объявить какие пины задействованны под реле как OUTPUT нужны 6789 объявить что радиоприёмник находится на пине 2 наверное надо подключить библиотеку #include <RCSwitch.h> ну и наконец прописать мои коды с пульта
я подумал что может быть должно быть так
Так ведь все уже прописано:
Если у тебя реле инверсные, то в строках 10-11 поменять местами HIGH и LOW.
я втавляю как наисано у тебя а что делать мне с ошибкой которая выходит на
unsigned long receivedValue = mySwitch.getReceivedValue(); и пишет ошибку
в моем скетче (см. пост #1) нет строки unsigned long receivedValue = mySwitch.getReceivedValue();
01enum{RELAY_ON = LOW, RELAY_OFF = HIGH};// чтобы настроить уровень включения реле02voidSwitchRelays(boolbOn,bytepin1,bytepin2)03{04digitalWrite(pin1, bOn ? RELAY_ON : RELAY_OFF);05digitalWrite(pin2, bOn ? RELAY_ON : RELAY_OFF);06}0708boolbRelayGroup1IsOn =false;09boolbRelayGroup2IsOn =false;1011voidloop()12{13unsignedlongreceivedValue = mySwitch.getReceivedValue();14switch(receivedValue)15{16case5312960: {17if(!bRelayGroup2IsOn) {18bRelayGroup1IsOn =true;19SwitchRelays(true,1,2);// включаем первую группу реле, если не включена вторая20}2122}23break;2425case11111: {26SwitchRelays(false,1,2);// выключаем первую группу реле27bRelayGroup1IsOn =false;28}29break;30case2222: {31if(!bRelayGroup1IsOn ) {32SwitchRelays(true,3,4);// включаем вторую группу реле, если не включена первая33bRelayGroup2IsOn =true;34}35}36break;3738case333: {39SwitchRelays(false,3,4);// выключаем вторую группу реле40bRelayGroup2IsOn =false;41}42break;43case0:44break;45default:46break;47}48}на 13 строке дает мне ошибку
будьте внимательны, этот скетч давал DIYMan, а по его скетчу все вопросу к нему :)
прошу прощения сразу на нескольких форусах лазию и ошибся но тогда я вообще не понял какой именно ваш скетч который вы предлогаете продублируйте пожайлуста
вы оочень невнимательны, два поста назад было сказано: в моем скетче (см. пост #1)...
Клапауцийxxx, вернись!!! Моя ушла в монастырь...
да действительно я лохонулся этот пост у меня был а скетч скрыт а я и не увидел что он скрыт извини что мозги делал сейчас проверю и отпишусь
всё похоже работает единственное при выключение второй пары реле при условии что первая пара не ключена при нажатие кнопки выключение вторая пара выключается а первая сама по себе включается где надо исправить?
ага, ошибочка там была (копипаст - зло).
case CODE_OFF2: { boolean r1 = digitalRead(RELAY1); boolean r2 = digitalRead(RELAY2); relayChange(r1, r2, OFF, OFF); break; }Клапауцийxxx, вернись!!! Моя ушла в монастырь...
а, смысл? - объяснять челу с повреждённым логическим мышлением, что у него что то не то с головой?
всё отлично работает благодарю что не отказались в помощи могу чисто символическую сумму перечислить на телефон или как то по другому в знак благодарности и извиняюсь за непонятки которые возникли во время переписки
Клапауцийxxx, вернись!!! Моя ушла в монастырь...
а, смысл? - объяснять челу с повреждённым логическим мышлением, что у него что то не то с головой?
я конечно понимаю что есть люди которые во всём разбираются но и у меня с головой всё в порядке и слава богу с мышлением всё ОК а вам если лишний раз объяснять тяжело то не надо и других оскарблять.
на этом сайте я только т не знал как им пользоваться где что скрыто и где как обозначенны посты, а вообще всем спасибо за ответы
я конечно понимаю что есть люди которые во всём разбираются но и у меня с головой всё в порядке и слава богу с мышлением всё ОК а вам если лишний раз объяснять тяжело то не надо и других оскарблять.
artemon25 , не наезд ! вовсе !!
не просил - не плати - моя бы обиделась ! скажи "спасибо"
это не ветка - "Ищу исполнителя"
...твоё мнение-решение - главнее , конечно :)-
спасибо что указали на то что на этой ветке услуги без денег этого конечно я не знал
не указывал моя ничего ( нет прав ) - а ты понял правильно !
как спросишь - так и ответят !!!!!
другие темы не читал чё ли ?
artemon25 , не наезд ! вовсе !!
не просил - не плати - моя бы обиделась ! скажи "спасибо"
это не ветка - "Ищу исполнителя"
...твоё мнение-решение - главнее , конечно :)-
спасибо что указали на то что на этой ветке услуги без денег этого конечно я не знал
не указывал моя ничего ( нет прав ) - а ты понял правильно !
как спросишь - так и ответят !!!!!
другие темы не читал чё ли ?
много чего перечитал и скажу прямо я начинающий и поэтому сейчас пытаюсь научиться сразу многому ну как говориться будем грызть гранит науки
artemon25 , читай и изучай ДатаШиты....
...здесь - читай и отмечай