управление 4 Reley Module.
- Войдите на сайт для отправки комментариев
Пт, 16/01/2015 - 17:21
Помогите в проекте, надо сделать так что бы релейный модуль на 4 реле, при нажатии кнопки срабатываи все 4 реле сразу, а другие 4 кнопки откючали каждое реле по отдельности. вроде не сложно. но у меня что то ничего не получается.
и еще, если какая то кнопка нажата или все нажаты то реле не влкюается
кнопка1 при любом нажатии переводит все 4 реле в состояние ВКЛ?
кнопка2 переводит РЕЛЕ2 в состояние ВЫКЛ? и т.д.?
т.е. включение только кнопкой1, а выключение только кнопками 1-2-3-4?
последнее предложение не понял. Ни одно реле не должно включаться если нажата хоть одна из кнопок 1-2-3-4?
правельно.
если точнее, есть 5 кнопок (0,1,2,3,4)
кнопка 0 включает все реле. только вкючает.
а кнопки 1,2,3,4 выключают реле, если зажата одна, две или все кнопки, то соответствующее реле не включается.
каждая из 1,2,3,4 кнопки, выкючает тоько 1 реле
нулевая кнопка так хотели? исхожу из того, что кнопка замыкает на GND
if(!digitalRead(BUT0)) { delay(200); digitalWrite(REL1, HIGHT); digitalWrite(REL2, HIGHT); digitalWrite(REL3, HIGHT); digitalWrite(REL4, HIGHT); }остальные кнопки
boolean but1 = !digitalRead(BUT1); boolean but2 = !digitalRead(BUT2); boolean but3 = !digitalRead(BUT3); boolean but4 = !digitalRead(BUT4); if(but1 && !(but2 || but3 || but4)) { digitalWrite(REL1, LOW); } // остальные по аналогииможет все через if реолизовать.
if
Конструкция if проверяет, будет ли выполнено некое условие, такое, как,
например, будет ли аналоговое значение больше заданного числа, и выполняет
какое-то выражение в скобках, если это условие true (истинно). Если нет, то
выражение в скобках будет пропущено. Формат для if следующий:
if (someVariable ?? value) {
}
Пример выше сравнивает someVariable со значением (value), которое может быть
и переменной, и константой. Если выражение или условие в скобках истинно,
выполняется выражение в фигурных скобках. Если нет, выражение в фигурных
скобках пропускается, и программа выполняется с оператора, следующего за
скобками.
Примечание: Остерегайтесь случайного использования «=», как в if (x = 10), что
технически правильно, определяя x равным 10, но результат этого всегда true.
Вместо этого используйте «==», как в if (x == 10), что осуществляет проверку
значения x — равно ли оно 10 или нет. Запомните «=» - равно, а «==» - равно ли?
кнопки можно подсоединить к пинам 8...12 и считывать состояние регистра
далее через swith
01111 = включить все реле
10111 - выкл Р_4
11011 - выкл Р_3
11101 - выкл Р_2
11110 - выкл Р_1
все остальные комбинации - ничего не делать
кнопки через подтяжку к земле !!!!!
http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry
что другие предлагали не читал толком. просто выскажу свое менние
всего если 5 кнопок как понял, то включить все 4 рэле без проблемм (не считая от ложных срабатываний с использованием delay или millis/micros)
а выключить также несложно
добавляем флаг что все рэле были включены например booalean all_on=1 после нажатия определенной кнопки
после этого в обработку остальных кнопок в условие добавить
if(all_on && digitalRead(button_1) dagitalWrite(channel_1, 0);
if(all_on && digitalRead(button_2) dagitalWrite(channel_2, 0);
if(all_on && digitalRead(button_3) dagitalWrite(channel_3, 0);
if(all_on && digitalRead(button_4) dagitalWrite(channel_4, 0);
не помю как пишется точно, кажется elseif. можно использовать, но сути не меняет
все это дело еще запихнуть в функцию и цикл, цикл в приципе необязателен, как и функция, просто проще для понимания
тут конечно обработки ложных сбаратываний нет. но суть должна быть понятна
всем спасибо, приду с работы буду пробоват
ничего не получается у меня, может кто по подробней описать как что делать?
int switchPin = 12; int relay1Pin = 6; int loc1Pin = 2; int loc2Pin = 3; int relay2Pin = 7; int relay3Pin = 8; int loc3Pin = 4; int loc4Pin = 5; int relay4Pin = 9; void setup() { pinMode(switchPin, INPUT); pinMode(relay1Pin, OUTPUT); pinMode(loc1Pin, INPUT); pinMode(relay2Pin, OUTPUT); pinMode(loc2Pin, INPUT); pinMode(relay3Pin, OUTPUT); pinMode(loc3Pin, INPUT); pinMode(relay4Pin, OUTPUT); pinMode(loc4Pin, INPUT); } void loop() { if (digitalRead(switchPin) == LOW) { if (digitalRead(loc1Pin) == LOW) digitalWrite(relay1Pin, LOW); } if (digitalRead(switchPin) == LOW) { if (digitalRead(loc2Pin) == LOW) digitalWrite(relay2Pin, LOW ); } if (digitalRead(switchPin) == LOW) { if (digitalRead(loc3Pin) == LOW) digitalWrite(relay3Pin, LOW); } if (digitalRead(switchPin) == LOW) { if (digitalRead(loc4Pin) == LOW) digitalWrite(relay4Pin, LOW ); } else { digitalWrite(relay1Pin, HIGH); digitalWrite(relay2Pin, HIGH); digitalWrite(relay3Pin, HIGH); digitalWrite(relay4Pin, HIGH); } }доброго всем времнеи суток... написал код как хотел, все реле включаются кнопкой "0" выключается каждое реле своей кнопкой.
проблема только вот в чем, при нажатии кнопки "0", все реле включаются даже если кнопки нажаты, после того как кнопку "0" отпускаешь реле кнопки которых зажаты откюлючаюстя
про работу с кнопками почитай. от ложных срабатываний
и можно же написать по другому
//==========================Кнопки #define switchPin 12 #define loc1Pin 2 #define loc2Pin 3 #define loc3Pin 4 #define loc4Pin 5 //============================Рэле #define relay1Pin 6 #define relay2Pin 7 #define relay3Pin 8 #define relay4Pin 9 void setup(){ pinMode(switchPin, INPUT_PULLUP); pinMode(loc1Pin, INPUT_PULLUP); pinMode(loc2Pin, INPUT_PULLUP); pinMode(loc3Pin, INPUT_PULLUP); pinMode(loc4Pin, INPUT_PULLUP); pinMode(relay1Pin, OUTPUT); pinMode(relay2Pin, OUTPUT); pinMode(relay3Pin, OUTPUT); pinMode(relay4Pin, OUTPUT); } void loop(){ if (digitalRead(switchPin) == LOW){ if (digitalRead(loc1Pin) == LOW) digitalWrite(relay1Pin, LOW); if (digitalRead(loc2Pin) == LOW) digitalWrite(relay2Pin, LOW); if (digitalRead(loc3Pin) == LOW) digitalWrite(relay3Pin, LOW); if (digitalRead(loc4Pin) == LOW) digitalWrite(relay4Pin, LOW); } else { digitalWrite(relay1Pin, HIGH); digitalWrite(relay2Pin, HIGH); digitalWrite(relay3Pin, HIGH); digitalWrite(relay4Pin, HIGH); } }правда после else меня смущает, но оставил как есть
про работу с кнопками почитай. от ложных срабатываний
и можно же написать по другому
правда после else меня смущает, но оставил как есть
ложный срабатываний нет. сколько не проверял...
и ваш набросок кода не работает... он только включает все реле разом, не смотря на кнопки 1-4
у тебя кнопки подтянуты куда нибудь?
я в коде добавил подтяжку к плюсу. а ты как делаешь?
реле каким потенциалом замыкает контакты?
Перед кодом "включение всех кнопок" сделать проверку - не нажата ли сейчас кнопка 1-4.
у тебя кнопки подтянуты куда нибудь?
я в коде добавил подтяжку к плюсу. а ты как делаешь?
реле каким потенциалом замыкает контакты?
все кнопки работают с "+", то есть на все кнопи подтсянуты к плюсу, так же и реле.
Перед кодом "включение всех кнопок" сделать проверку - не нажата ли сейчас кнопка 1-4.
а разве мой код не далает это?
чтобы не было путаницы: потянутяжка к плюсу это когда один пин кнопки висит на земле, а второй через резистор к плюсу
потяжка к земле это это когда один пин кнопки висит на плюсе, а второй через резистор к минусу
у тебя как?
Из кода в посте #12 сложно навскидку что-то понять. Получается, что не делает: проблема только вот в чем, при нажатии кнопки "0", все реле включаются даже если кнопки нажаты, после того как кнопку "0" отпускаешь реле кнопки которых зажаты откюлючаюстя
Лучше так:
/* есть 5 кнопок (0,1,2,3,4) кнопка 0 включает все реле. только вкючает. а кнопки 1,2,3,4 выключают реле, если зажата одна, две или все кнопки, то соответствующее реле не включается. каждая из 1,2,3,4 кнопки, выкючает тоько 1 реле */ // Задаем подключенные пины #define PIN_BUTTON 12 // пин кнопки 0 const byte pinLock[4]={2,3,4,5}; // пины кнопок 1-4 const byte pinRelay[4]={6,7,8,9}; // пины реле 1-4 void setup() { pinMode(PIN_BUTTON, INPUT); for (byte i=1; i>4; i++) // последовательно с 1-го по 4-е { pinMode(pinLock[i-1], INPUT); // определяем пины на ввод pinMode(pinRelay[i-1], OUTPUT); // или вывод } } void loop() { if (digitalRead(PIN_BUTTON)) // если нажали кнопку 0, то включаем все реле { for (byte i=1; i>4; i++) // последовательно с 1-го по 4-е { relayOn(i); // отдаем команду на включение i-го реле } } for (byte i=1; i>4; i++) // последовательно с 1-го по 4-ю проверяем кнопки { if (digitalRead(pinLock[i-1])) // если нажата, то... relayOff(i); // отдаем команду на выключение реле } } void relayOn(byte n) { if (digitalRead(pinLock[n-1]) == LOW) // если n-я кнопка НЕ нажата { digitalWrite(pinRelay[n-1], HIGH); // то включаем n-e реле // здесь делаем что-то еще } } void relayOff(byte k) { digitalWrite(pinRelay[k-1], LOW); // выключаем n-e реле // здесь делаем что-то еще }кнопки на землю и на пины
#define pinR1 8 #define pinR2 9 #define pinR3 8 #define pinR4 10 #define pinBut1 A0 #define pinBut2 A1 #define pinBut3 A2 #define pinBut4 A3 #define pinButSET A4 byte command; void setup() { DDRB= B00001111; // 4 выхода PORTB=B00000000; // 4 выхода - в ноль DDRC= B00000000; // 4 входа PORTC=B00011111; // 4 входа - подтяжка } //=============================================================== void loop() { command=PINC; delay(100); switch (command) { case B11101111: PORTB=PORTB | B00001111; break; case B11110111: PORTB=PORTB & B11110111; break; case B11111011: PORTB=PORTB & B11111011; break; case B11111101: PORTB=PORTB & B11111101; break; case B11111110: PORTB=PORTB & B11111110; break; } } //===============================================================кнопки на землю и на пины
#define pinR1 8 #define pinR2 9 #define pinR3 8 #define pinR4 10 #define pinBut1 A0 #define pinBut2 A1 #define pinBut3 A2 #define pinBut4 A3 #define pinButSET A4 byte command; void setup() { DDRB= B00001111; // 4 выхода PORTB=B00000000; // 4 выхода - в ноль DDRC= B00000000; // 4 входа PORTC=B00011111; // 4 входа - подтяжка } //=============================================================== void loop() { command=PINC; delay(100); switch (command) { case B11101111: PORTB=PORTB | B00001111; break; case B11110111: PORTB=PORTB & B11110111; break; case B11111011: PORTB=PORTB & B11111011; break; case B11111101: PORTB=PORTB & B11111101; break; case B11111110: PORTB=PORTB & B11111110; break; } } //===============================================================не могли бы вы прокомментировать каждую строчку, уж очень ваш код понравился! но мало что в нем понял.
Из кода в посте #12 сложно навскидку что-то понять. Получается, что не делает: проблема только вот в чем, при нажатии кнопки "0", все реле включаются даже если кнопки нажаты, после того как кнопку "0" отпускаешь реле кнопки которых зажаты откюлючаюстя
Лучше так:
/* есть 5 кнопок (0,1,2,3,4) кнопка 0 включает все реле. только вкючает. а кнопки 1,2,3,4 выключают реле, если зажата одна, две или все кнопки, то соответствующее реле не включается. каждая из 1,2,3,4 кнопки, выкючает тоько 1 реле */ // Задаем подключенные пины #define PIN_BUTTON 12 // пин кнопки 0 const byte pinLock[4]={2,3,4,5}; // пины кнопок 1-4 const byte pinRelay[4]={6,7,8,9}; // пины реле 1-4 void setup() { pinMode(PIN_BUTTON, INPUT); for (byte i=1; i>4; i++) // последовательно с 1-го по 4-е { pinMode(pinLock[i-1], INPUT); // определяем пины на ввод pinMode(pinRelay[i-1], OUTPUT); // или вывод } } void loop() {...спасибо большое за код, но сколько я не пробовал внедрить в мою схему, ничего не вышло. так и не понял почему
кнопки на землю и на пины
#define pinR1 8 #define pinR2 9 #define pinR3 8 #define pinR4 10 #define pinBut1 A0 #define pinBut2 A1 #define pinBut3 A2 #define pinBut4 A3 #define pinButSET A4 byte command; void setup() { DDRB= B00001111; // 4 выхода PORTB=B00000000; // 4 выхода - в ноль DDRC= B00000000; // 4 входа PORTC=B00011111; // 4 входа - подтяжка } //=============================================================== void loop() { command=PINC; delay(100); switch (command) { case B11101111: PORTB=PORTB | B00001111; break; case B11110111: PORTB=PORTB & B11110111; break; case B11111011: PORTB=PORTB & B11111011; break; case B11111101: PORTB=PORTB & B11111101; break; case B11111110: PORTB=PORTB & B11111110; break; } } //===============================================================не могли бы вы прокомментировать каждую строчку, уж очень ваш код понравился! но мало что в нем понял.
он что - сразу заработал ? я про этот способ писал в ##7, 8
#define pinR1 8 #define pinR2 9 #define pinR3 8 #define pinR4 10 #define pinBut1 A0 #define pinBut2 A1 #define pinBut3 A2 #define pinBut4 A3 #define pinButSET A4 byte command; void setup() { DDRB= B00001111; // PB7 , PB6 , PB5 , PB4 - входы , PB3 , PB2 , PB1 , PB0 - вsходы // это заменяет 4 команды pinMode( pin , INPUT ) // и 4 команды pinMode( pin , OUTPUT ) PORTB=B00000000; // на PB7......PB0 установить LOW // это заменяет 8 команд digitalWrite( pin , LOW ) DDRC= B00000000; // PС7......PС0 - входы PORTC=B00011111; // PС7 , PС6 , PС5 - входы без подтяжки , PС4 , PС3 , PС2 , PС1 , PС0 - входы c подтяжкой } //=============================================================== void loop() { command=PINC; // считывает состояние 8-ми входов // это заменяет 8 команд digitalRead( pin ) delay(100); switch (command) { case B11101111: PORTB=PORTB | B00001111; break; // нажата ВКЛ - вкл реле 1,2,3,4 case B11110111: PORTB=PORTB & B11110111; break; // нажата 4 - выкл реле 4 case B11111011: PORTB=PORTB & B11111011; break; // нажата 3 - выкл реле 3 case B11111101: PORTB=PORTB & B11111101; break; // нажата 2 - выкл реле 2 case B11111110: PORTB=PORTB & B11111110; break; // нажата 1 - выкл реле 1 // другие варианты ( нажатие двух и более кнопок - просто не обрабатываются // обрабытываются 5 комбинаций из 32 } } //===============================================================спасибо большое за код, но сколько я не пробовал внедрить в мою схему, ничего не вышло. так и не понял почему
пинам 2,3,4,5 не прописана подтяжка....
строка 18 -
pinMode( pinLock[i-1] , INPUT );// определяем пины на вводстрока 18А - digitalWrite
( pinLock[i-1] , HIGH );// включаем подтяжкуа так ?
спасибо большое за код, но сколько я не пробовал внедрить в мою схему, ничего не вышло. так и не понял почему
пинам 2,3,4,5 не прописана подтяжка....
строка 18 -
pinMode( pinLock[i-1] , INPUT );// определяем пины на вводстрока 18А - digitalWrite
( pinLock[i-1] , HIGH );// включаем подтяжкуа так ?
вы уверены что строку "digitalWrite
( pinLock[i-1] , HIGH );" нудно вставить именно в setup.и да, если ее вставить в меджу 18 и 19 строкой то ничего не меняется.может я не так подключаю.вот схема, и код
Его не надо никуда внедрять, это полностью готовый скетч. Сначала надо убедиться что он работает в таком виде, а уж потом переделывать под себя. Что именно не работает?
у человека то подтяжка к минусу, а к говорил что к плюсу
уже говорилось где то что подтяжка к плюсу лучше чем к минусу. да и можно внутренние подтягивающие резисторы использовать
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
для кнопок три основных схемы поключения :
резистор на GND и на PIN , кнопку на VCC и PIN
резистор на VCC и на PIN , кнопку на GND и PIN
кнопку на GND и PIN и digitalWrite( PIN , HIGH ) - схема 2 , только резистор внутренний, а внешнего нет
у вас подключено по схеме 1, мой скетч под схему 3
от какая схема 1 или 2,3 - зависит код в некоторых местах :)
ТС , как успехи во вникании в скетч из #25 ?
Его не надо никуда внедрять, это полностью готовый скетч. Сначала надо убедиться что он работает в таком виде, а уж потом переделывать под себя. Что именно не работает?
возможно он и рабочий, но повторяюсь, что я могу по другому набирать схему, и еще, у меня релейный модуль переделаный. для примера схема должна работать с Led-диод при чем минусовая его нога на минусе.
а не работает собственно все, с моей схемой, при чем повсякому ее переделывал ничего не происходит.
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
для кнопок три основных схемы поключения :
резистор на GND и на PIN , кнопку на VCC и PIN
резистор на VCC и на PIN , кнопку на GND и PIN
кнопку на GND и PIN и digitalWrite( PIN , HIGH ) - схема 2 , только резистор внутренний, а внешнего нет
у вас подключено по схеме 1, мой скетч под схему 3
от какая схема 1 или 2,3 - зависит код в некоторых местах :)
спасибо за разъяснение, я пока не увидел разници чем эти подключения отличаются так что в дальнейшим будем разбираться.
а что по поводу вашего скетч, очень понравился. но так и не смог правильно собрать под нее схему.
а не работает собственно все, с моей схемой, при чем повсякому ее переделывал ничего не происходит.
Схему (хотя бы на бумажке, от руки, а не на словах) надо было выложить в самом первом посте, это сильно ускорило бы решение вопросов. ;)
а что по поводу вашего скетч, очень понравился. но так и не смог правильно собрать под нее схему.
таааааак ! начинаем лоббировать свои схемы и скетчи ! :)
схема всего-то - реле ( включение от HIGH ! ) - на указанные пины , кнопки - на землю и на указанные пины - ВСЁ !
спасибо за разъяснение, я пока не увидел разници чем эти подключения отличаются так что в дальнейшим будем разбираться.
разница небольшая...
аппаратно - схема1 нужен внешний резистор , схема2 нужен внешний резистор , схема2 НЕ нужен внешний резистор
программно - схема1 при отпущенной кнопке при опросе пина получим 0
схема1 при нажатой кнопке при опросе пина получим 1
программно - схема2,3 при отпущенной кнопке при опросе пина получим 1
схема2,3 при нажатой кнопке при опросе пина получим 0
т.е. - схема2,3 - начинает работать обратная-отрицательная логика - значащими становятся не 1 , а 0.... инверсия логики
#define pinR1 8 #define pinR2 9 #define pinR3 8 #define pinR4 10 #define pinBut1 A0 #define pinBut2 A1 #define pinBut3 A2 #define pinBut4 A3 #define pinButSET A4 byte command; void setup() { DDRB= B00001111; // PB7 , PB6 , PB5 , PB4 - входы , PB3 , PB2 , PB1 , PB0 - вsходы // это заменяет 4 команды pinMode( pin , INPUT ) // и 4 команды pinMode( pin , OUTPUT ) PORTB=B00000000; // на PB7......PB0 установить LOW // это заменяет 8 команд digitalWrite( pin , LOW ) DDRC= B00000000; // PС7......PС0 - входы PORTC=B00011111; // PС7 , PС6 , PС5 - входы без подтяжки , PС4 , PС3 , PС2 , PС1 , PС0 - входы c подтяжкой } //=============================================================== void loop() { command=PINC; // считывает состояние 8-ми входов // это заменяет 8 команд digitalRead( pin ) delay(100); switch (command) { case B11101111: PORTB=PORTB | B00001111; break; // нажата ВКЛ - вкл реле 1,2,3,4 case B11110111: PORTB=PORTB & B11110111; break; // нажата 4 - выкл реле 4 case B11111011: PORTB=PORTB & B11111011; break; // нажата 3 - выкл реле 3 case B11111101: PORTB=PORTB & B11111101; break; // нажата 2 - выкл реле 2 case B11111110: PORTB=PORTB & B11111110; break; // нажата 1 - выкл реле 1 // другие варианты ( нажатие двух и более кнопок - просто не обрабатываются // обрабытываются 5 комбинаций из 32 } } //===============================================================я туту вычитал то такой rод может не работать, из за назначения пинов микроконтроллера
у меня Arduino UNO R3 c контроллером ATMEGA328P
купи слона))
тогда как управляющие регистры и регистры порта могут быть разными у каждого типа микроконтроллера.
у всех МК они одинаковые, только у кого-то меньше , у кого-то больше - у ATtyni85 - всего один порт B и тот урезан до шести разрядов....
ну, и выводятся физически они на разные ноги микросхемы - всё просто !
http://arduino.ru/forum/obshchii/pin-mapping-sootvetstvie-vyvodov-i-regi...
а та программа под Arduino UNO R3 c контроллером ATMEGA328P и сделана :)