Как заставить процедуры запускаться удаленно

Я устанавливаю свет в модель поезда, и мне нужно активировать несколько прототипов процедур освещения. Лампы подключаются следующим образом: Верхняя часть фары — контакт 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.

, 👍1


2 ответа


1

возможно массив и цикл? (у меня нет банкомата 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); // необязательная задержка между огнями?
    }                            
}
,

0

Я хотел бы просто обратиться к процедуре переадресации, которая включала бы контакты 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);
,