умное кодирование возможно?

Есть ли способ почистить этот код... или сделать умный код?

В этом примере я использую 6 реле, в окончательном коде их будет 10.

Кроме того, теперь я использую 5 переключателей, а их будет 8, каждый со своим светодиодом. Теперь я указал только 1 лид.

Код считывается с кнопки, и несколько реле получают сигнал. Также будут продолжаться застегнутые на пуговицы. Я добавлю больше случаев позже. Но мне было интересно, возможно ли/проще/просто другой способ записи высокого/низкого уровня на реле и светодиоды.

Можно ли каким-то образом объединить НИЗКИЕ и ВЫСОКИЕ значения в одном случае?

int relay1 = A5;
int relay2 = A4;
int relay3 = A3;
int relay4 = A2;
int relay5 = A1;
int relay6 = A0;

int led1 = 3;

int sw1 = 5;
int sw2 = 6;
int sw3 = 7;
int sw4 = 8;
int sw5 = 9;

int sw1Status, sw2Status, sw3Status, sw4Status, sw5Status;
int order = 1; // по умолчанию все реле отключены.

void setup() {
  Serial.begin(9600);

  pinMode(led1, OUTPUT);

  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT);
  pinMode(relay5, OUTPUT);
  pinMode(relay6, OUTPUT);
  // подтяжка ввода, поэтому состояние кнопок по умолчанию — ВЫСОКОЕ.
  pinMode(sw1, INPUT_PULLUP);
  pinMode(sw2, INPUT_PULLUP);
  pinMode(sw3, INPUT_PULLUP);
  pinMode(sw4, INPUT_PULLUP);
  pinMode(sw5, INPUT_PULLUP);

}

void loop() {

  // читаем статус кнопок
  sw1Status = digitalRead(sw1);
  sw2Status = digitalRead(sw2);
  sw3Status = digitalRead(sw3);
  sw4Status = digitalRead(sw4);
  sw5Status = digitalRead(sw5);

  if (sw1Status == LOW) { // если нажата кнопка 1
    order = 2; // переходим к случаю 2
  }
  if (sw2Status == LOW) {
    order = 3;
  }
  if (sw3Status == LOW) {
    order = 4;
  }
  if (sw4Status == LOW) {
    order = 5;
  }
  if (sw5Status == LOW) { // кнопка 4 переключается
    if (order != 7) { // если порядок не равен 5, включить реле 1 & 4
      order = 6;
    }
    else { // иначе переходим к варианту 1, который выключит все реле
      order = 1;
    }
  }

  switch (order) {
    case 1: // если порядок равен 1
      digitalWrite(relay1, LOW);
      digitalWrite(relay2, LOW);
      digitalWrite(relay3, LOW);
      digitalWrite(relay4, LOW);
      digitalWrite(relay5, LOW);
      digitalWrite(relay6, LOW);
      digitalWrite(led1, LOW); 
      break;

    case 2: // если порядок равен 2
      digitalWrite(relay1, HIGH);
      digitalWrite(relay2, LOW);
      digitalWrite(relay3, HIGH);
      digitalWrite(relay4, LOW);
      digitalWrite(relay5, HIGH);
      digitalWrite(relay6, LOW);
      digitalWrite(led1, HIGH);       
      break;

    case 3: // если порядок равен 3
      digitalWrite(relay1, LOW);
      digitalWrite(relay2, HIGH);
      digitalWrite(relay3, LOW);
      digitalWrite(relay4, HIGH);
      digitalWrite(relay5, LOW);
      digitalWrite(relay6, HIGH);
      digitalWrite(led1, LOW);      
      break;

    case 4: // если порядок равен 4
      digitalWrite(relay1, HIGH);
      digitalWrite(relay2, HIGH);
      digitalWrite(relay3, HIGH);
      digitalWrite(relay4, LOW);
      digitalWrite(relay5, LOW);
      digitalWrite(relay6, LOW);
      digitalWrite(led1, LOW);      
      break;

    case 5: // если порядок равен 5
      digitalWrite(relay1, LOW);
      digitalWrite(relay2, LOW);
      digitalWrite(relay3, LOW);
      digitalWrite(relay4, HIGH);
      digitalWrite(relay5, HIGH);
      digitalWrite(relay6, HIGH);
      digitalWrite(led1, LOW);     
      break;

    case 6: // если порядок равен 5
      digitalWrite(relay1, LOW);
      digitalWrite(relay2, LOW);
      digitalWrite(relay3, HIGH);
      digitalWrite(relay4, HIGH);
      digitalWrite(relay5, LOW);
      digitalWrite(relay6, LOW);
      digitalWrite(led1, LOW);     
      break;

    default: // если ни один из вышеперечисленных случаев не действителен, переходим к случаю 1
      order = 1;
      break;
  }
}

, 👍0

Обсуждение

Что? Я действительно не понимаю, что вы пытаетесь спросить., @chrisl

хаха..ой извините! Что я пытаюсь спросить... этот код в порядке? Или можно упростить? например. Можно ли комбинировать LOW: digitalWrite(relay1 relay2 relay3, LOW);, @Niles

используйте массивы для хранения переменных ... также используйте массивы для хранения значений реле case, @jsotola


2 ответа


1

Если все обрабатываются одинаково и у них нет индивидуальных имен, вам нужны массивы и циклы for.

const byte relayPins[] = { A5, A4, A3, A2, A1, A0};
const byte ledPin = 3;
const byte swPins[] = {5, 6, 7, 8, 9};

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  for (const byte relayPin: relayPins) pinMode(relayPin, OUTPUT);
  for (const byte swPin: swPins) pinMode(swPin, INPUT_PULLUP);
}

Сегодня даже Arduino C++ понимает синтаксис foreach.

Кстати: для окончательного подсчета контактов вам понадобится другое/дополнительное оборудование. Либо Мега, либо регистры сдвига, либо расширители портов.

,

Я также понял, что у меня закончились контакты на моих платах UNO, поэтому мой код еще не завершен. Что касается массивов, это совершенно новое для меня и кажется мне чем-то волшебным. Не могли бы вы привести пример того, как это использовать. Как бы это выглядело, если бы; например, кнопка 1 нажата ... и реле 1, 3 и 5 ВЫСОКИЙ, а 2,4 и 6 НИЗКИЙ, @Niles

Самая простая книга по C или C++ должна охватывать массивы в целом. Если ваши имена похожи на relay1, вы можете вместо этого использовать relayPins[0], чтобы иметь дело с ними по отдельности. Кстати: ваш вопрос был о «умном кодировании» :), @DataFiddler


0

Arduino Uno имеет 3 порта. Вы можете читать и записывать порты как 1 байт.

Все коммутаторы подключены к одному порту, и вы можете считывать их все одновременно. Например, используя D7-D3 для чтения переключателей:

switches = (PIND & 0b11111000) >>3; // читаем D7 в D0, маскируем D2-1-0, перемещаем данные на 5 младших битов

Тогда у вас может быть случай (переключатели): для возможных случаев от 0 до 31.

Со всеми реле на одном порту вы можете изменить их все сразу. Например, используя D14–D19 для реле:

PORTC = 0b00110011; // Dxx, Dxx, D19,18,17,16,15,14 или A5,A4,A3,A2,A1,A0

чтобы включить реле 1,2,5,6 и выключить 3,4.

Светодиод по-прежнему будет работать сам по себе.

,