Несколько кнопок для управления реле
Уважаемые,
У меня возникла проблема, которую я не мог решить какое-то время. Я попробовал приведенный ниже код, но он не сработал. Будет 4 кнопки, управляющие 4 реле, но таким образом, что первая кнопка будет включать реле 1 и 3, если нажать кнопку 2, то включится только реле 2, если нажать кнопку 3, реле 1,2 и 3 включатся, если кнопка 4 должна переключать реле 1 и 4. еще одно: мне нужно иметь возможность перейти от любой кнопки к любой другой, и соответствующие реле будут активированы, а остальные сработают.
#include <Bounce2.h>
const int BUTTON_COUNT = 4;
const int16_t DEBOUNCE_DELAY = 50;
const uint8_t buttonPins[BUTTON_COUNT] = {28, 29, 30, 31};
const uint8_t ledPins[BUTTON_COUNT] = {34, 35, 36, 37};
Bounce buttons[BUTTON_COUNT];
uint8_t ledStates[BUTTON_COUNT];
void setup() {
for (int i = 0; i < BUTTON_COUNT; i++) {
buttons[i].attach(buttonPins[i], INPUT);
buttons[i].interval(DEBOUNCE_DELAY);
pinMode(ledPins[i], OUTPUT);
ledStates[i] = HIGH;
digitalWrite(ledPins[i], ledStates[i]);
}
}
void loop() {
// Обновить дебаунсеры.
for (int i = 0; i < BUTTON_COUNT; i++)
buttons[i].update();
// При нажатии первой кнопки "лабан":
if (buttons[0].rose()) {
// Загорается первый светодиод.
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[3], LOW);
// и отключаем все остальные.
for (int i = 0; i < BUTTON_COUNT; i++) {
ledStates[0] = HIGH;
ledStates[2] = HIGH;
digitalWrite(ledPins[i], ledStates[i]);
}
}
// Когда первая кнопка отпущена:
if (buttons[0].fell()) {
// выключаем реле.
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[3], HIGH);
}
// При нажатии первой кнопки "Газировка":
if (buttons[1].rose()) {
// Загорается первый светодиод.
digitalWrite(ledPins[2], LOW);
// и отключаем все остальные.
for (int i = 0; i < BUTTON_COUNT; i++) {
ledStates[0] = HIGH;
ledStates[1] = HIGH;
ledStates[3] = HIGH;
digitalWrite(ledPins[i], ledStates[i]);
}
}
// Когда первая кнопка отпущена:
if (buttons[1].fell()) {
// выключаем первый светодиод.
digitalWrite(ledPins[2], HIGH);
}
// При нажатии первой кнопки "labanUP":
if (buttons[2].rose()) {
// Загорается первый светодиод.
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[2], LOW);
digitalWrite(ledPins[3], LOW);
// и отключаем все остальные.
for (int i = 0; i < BUTTON_COUNT; i++) {
ledStates[0] = HIGH;
digitalWrite(ledPins[i], ledStates[i]);
}
}
// Когда первая кнопка отпущена:
if (buttons[0].fell()) {
// выключаем первый светодиод.
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[2], HIGH);
digitalWrite(ledPins[3], HIGH);
}
// При нажатии кнопки циркуляции:
if (buttons[3].rose()) {
// Переключить его состояние.
ledStates[3] = !ledStates[3];
digitalWrite(ledPins[3], ledStates[3]);
digitalWrite(ledPins[0], ledStates[0]);
}
}
@medo, 👍0
1 ответ
Нижеприведенный код представляет собой простой пример того, что вы описали. Каждая кнопка включает определенные для нее реле и выключает другие реле. кроме кнопки 4, которая переключает реле 1 и 4.
int relay1 = 2;
int relay2 = 3;
int relay3 = 4;
int relay4 = 5;
int sw1 = 6;
int sw2 = 7;
int sw3 = 8;
int sw4 = 9;
int sw1Status, sw2Status, sw3Status, sw4Status;
int order = 1; // по умолчанию все реле отключены.
void setup() {
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
pinMode(relay4, OUTPUT);
// подтяжка ввода, поэтому состояние кнопок по умолчанию — ВЫСОКОЕ.
pinMode(sw1, INPUT_PULLUP);
pinMode(sw2, INPUT_PULLUP);
pinMode(sw3, INPUT_PULLUP);
pinMode(sw4, INPUT_PULLUP);
}
void loop() {
// читаем статус кнопок
sw1Status = digitalRead(sw1);
sw2Status = digitalRead(sw2);
sw3Status = digitalRead(sw3);
sw4Status = digitalRead(sw4);
if (sw1Status == LOW) { // если нажата кнопка 1
order = 2; // переходим к случаю 2
}
if (sw2Status == LOW) {
order = 3;
}
if (sw3Status == LOW) {
order = 4;
}
if (sw4Status == LOW) { // кнопка 4 переключается
if (order != 5) { // если порядок не равен 5, включить реле 1 & 4
order = 5;
}
else { // иначе переходим к варианту 1, который выключит все реле
order = 1;
}
}
switch (order) {
case 1: // если порядок равен 1
digitalWrite(relay1, LOW);
digitalWrite(relay2, LOW);
digitalWrite(relay3, LOW);
digitalWrite(relay4, LOW);
break;
case 2: // если порядок равен 2
digitalWrite(relay1, HIGH);
digitalWrite(relay2, LOW);
digitalWrite(relay3, HIGH);
digitalWrite(relay4, LOW);
break;
case 3: // если порядок равен 3
digitalWrite(relay1, LOW);
digitalWrite(relay2, HIGH);
digitalWrite(relay3, LOW);
digitalWrite(relay4, LOW);
break;
case 4: // если порядок равен 4
digitalWrite(relay1, HIGH);
digitalWrite(relay2, HIGH);
digitalWrite(relay3, HIGH);
digitalWrite(relay4, LOW);
break;
case 5: // если порядок равен 5
digitalWrite(relay1, HIGH);
digitalWrite(relay2, LOW);
digitalWrite(relay3, LOW);
digitalWrite(relay4, HIGH);
break;
default: // если ни один из вышеперечисленных случаев не действителен, переходим к случаю 1
order = 1;
break;
}
}
Наличие аккуратного формата кода и использование простого стиля кодирования (если возможно) облегчит отладку/редактирование/улучшение кода.
Не забудьте устранить дребезг кнопок.
- Как инициализировать цифровой выходной контакт как LOW
- Наилучший метод проектирования схемы с 20 кнопками
- Возникла проблема с переобъявлением символа другого типа
- Кнопочное управление несколькими реле
- Ищу ссылку на двухполюсное однопозиционное реле (DPST) для Arduino.
- Выходное напряжение цифрового вывода падает при управлении реле
- Управляющие реле с ИК-подсветкой и кнопкой
- Вопрос новичка - Biltong Box Project
Большое спасибо, но, к сожалению, это не сработало так, как мы ожидали. Я подумал, что это могут быть мои соединения, поэтому я использовал симулятор с двигателями постоянного тока вместо реле, и это было то же самое :( " https://www.tinkercad.com/things/k1VCQrax95J-copy-of-arduino-simulator-or/editel?tenant=circuits?sharecode=o-fW6ONb4zlq8c6y1JUVCaG0y66HdNzOcTwLNEqftGE= ", @medo
@medo Не следует подключать кнопки к положительной линии, мы уже использовали INPUT_PULLUP. удалите резистор и просто подключите кнопку непосредственно к отрицательной линии., @ElectronSurf
Высоко ценим @newbie. Как вы думаете, какие изменения нужно внести, если я заменю кнопки сенсорными датчиками «ТТП 223»? есть идеи об изменениях в коде? так как датчик имеет 3 линии; земля, vcc и сигнал, @medo
Датчики скважины @medo также имеют высокий/низкий выход, в случае использования датчика вместо кнопки вы должны определить состояние датчика и применить его в коде:
sw1Status, sw2Status ...
. также вы должны заменитьINPUT_PULLUP
наINPUT
., @ElectronSurf