умное кодирование возможно?
Есть ли способ почистить этот код... или сделать умный код?
В этом примере я использую 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;
}
}
@Niles, 👍0
Обсуждение2 ответа
Если все обрабатываются одинаково и у них нет индивидуальных имен, вам нужны массивы и циклы 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
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.
Светодиод по-прежнему будет работать сам по себе.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Что? Я действительно не понимаю, что вы пытаетесь спросить., @chrisl
хаха..ой извините! Что я пытаюсь спросить... этот код в порядке? Или можно упростить? например. Можно ли комбинировать LOW: digitalWrite(relay1 relay2 relay3, LOW);, @Niles
используйте массивы для хранения переменных ... также используйте массивы для хранения значений реле
case
, @jsotola