Несколько кнопок для управления реле

Уважаемые,

У меня возникла проблема, которую я не мог решить какое-то время. Я попробовал приведенный ниже код, но он не сработал. Будет 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]);
     }
    }

, 👍0


1 ответ


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;
  }
}

Наличие аккуратного формата кода и использование простого стиля кодирования (если возможно) облегчит отладку/редактирование/улучшение кода.

Не забудьте устранить дребезг кнопок.

,

Большое спасибо, но, к сожалению, это не сработало так, как мы ожидали. Я подумал, что это могут быть мои соединения, поэтому я использовал симулятор с двигателями постоянного тока вместо реле, и это было то же самое :( " 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