Как заставить процедуры запускаться удаленно
Я устанавливаю свет в модель поезда, и мне нужно активировать несколько прототипов процедур освещения. Лампы подключаются следующим образом: Верхняя часть фары — контакт 1 Нижняя часть фары — контакт 2 Передний правый маркер — контакт 3 Передний левый маркер — контакт 4 Задний правый маркер — контакт 5 Задний левый маркер — контакт 6 Задняя левая фара — контакт 7 Задняя правая фара — контакт 8 Передний правый фонарь в кювете — контакт 9 Передний левый фонарь в кювете — контакт 10
Я хотел бы просто обратиться к процедуре прямого хода, которая включала бы контакты 1, 2, 3, 4, 5, 6, 9 и 10. Это конфигурация освещения, когда локомотив переключается на передачу вперед. Для реверса будут активированы контакты 3, 4, 5, 6, 7 и 8. Будут и другие, но это основные процедуры. Есть ли способ настроить переменную, которая называет все эти контакты одновременно? Или есть какой-то другой способ назвать процедуру прямого или обратного освещения одним коротким именем, например «Процедура 2»? Я использую Arduino IDE.
@William Fuhrmann , 👍1
2 ответа
возможно массив и цикл? (у меня нет банкомата Arduino IDE, извините за опечатки)
int lights[] = {1, 2, 3, 4, 5, 9, 10};
int count = 7;//потому что в массиве 7 элементов
//
main(){
for (int i = 0; i < count; i++){
digitalWrite(lights[i], HIGH);
delay(1000);
}
}
EDIT: по-прежнему нет IDE, но здесь немного больше глубины.
forward(true) = светится вперед
forward(false) = свет вперед выключен
reverse(true) = включены фонари заднего хода
reverse(false) = фонари заднего хода выключены
void forward(bool state){
int lights[] = {1, 2, 3, 4, 5, 6, 9, 10};
int count = sizeof(lights) / sizeof(lights[0]);
for (int i = 0; i < count; i++){
switch (state){
case true: // включаем
digitalWrite(lights[i], HIGH);
break;
case false: //выключить
digitalWrite(lights[i], LOW);
break;
}
// задержка (1000); // необязательная задержка между огнями?
}
}
void reverse(bool state){
int lights[] = {3, 4, 5, 6, 7, 8};
int count = sizeof(lights) / sizeof(lights[0]);
for (int i = 0; i < count; i++){
switch (state){
case true: // включаем
digitalWrite(lights[i], HIGH);
break;
case false: //выключить
digitalWrite(lights[i], LOW);
break;
}
// задержка (1000); // необязательная задержка между огнями?
}
}
Я хотел бы просто обратиться к процедуре переадресации, которая включала бы контакты 1, 2, 3, 4, 5, 6, 9 и 10.
А как насчет контактов 7 и 8? Вы не сказали, что с ними делать в форвардная процедура. Должны ли они быть отключены? Должны ли они оставаться в в каком состоянии они были раньше? Я знаю, для тебя это очевидно, но это не помешает быть конкретным, в интересах тех, кому не хватает необходимый фон. Не имея полной спецификации, нам остается делать предположения.
kei в своем ответе предположил, что любой неупомянутый вами пин должен быть остался один, в каком бы состоянии он ни был раньше. В этом ответе я вместо этого предположим, что вы хотите всегда управлять 10 контактами, поворачивая каждый из них либо включен, либо выключен.
С учетом этого предположения очевидное решение состоит в том, чтобы для каждого
процедура, массив из 10 «состояний» (либо HIGH
, либо LOW
) и цикл
через массив, устанавливающий каждый контакт в соответствующее состояние:
for (int i = 0; i < LED_COUNT; i++)
digitalWrite(led_pins[i], pattern[i]);
Здесь pattern[i]
— это состояние, связанное с led_pin[i]
в этом
конкретная процедура. Теперь, поскольку все эти выводы идут подряд, вы не
нужен массив led_pins
, и вы можете заменить led_pins[i]
на
i + FIRST_LED_PIN
(т. е. i+1
).
Таким образом, вы можете реализовать столько процедур, сколько хотите, каждую определяется как простой массив из 10 чисел. я бы добавил сингл function для активации любой процедуры. Эта функция будет восприниматься как аргумент указатель на шаблон освещения, который вы хотите применить:
const uint8_t FIRST_LED_PIN = 1;
const int LED_COUNT = 10;
const uint8_t formward_pattern[LED_COUNT] = {
HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH, HIGH
};
const uint8_t reverse_pattern[LED_COUNT] = {
LOW, LOW, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW, LOW
};
void set_led_pattern(const uint8_t *pattern)
{
for (int i = 0; i < LED_COUNT; i++)
digitalWrite(i + FIRST_LED_PIN, pattern[i]);
}
Установив это, вы можете установить схему освещения для переднего процедура путем выдачи единственного оператора:
set_led_pattern(formward_pattern);
и для обратной процедуры:
set_led_pattern(reverse_pattern);
- Как я могу заставить условные операторы работать с логическим значением (true/false), чтобы включать и выключать синие светодиоды
- Как объявить массив переменного размера (глобально)
- Как получить тип данных переменной?
- Питание светодиодной ленты - Сколько ампер?
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Преобразование long в массив символов и обратно
- Светодиод L продолжает гореть