Повторное обращение к функции

Teh-nick

✩✩✩✩✩✩✩
9 Ноя 2023
14
1
Здравствуйте!
Мне нужно управлять реле, по различным командам выключить на 5 секунд, затем включить. Всю эту процедуру я заварачиваю в функцию с использованием millis(). В нужном месте кода я обращаюсь к этой функции, например из веб-морды setting. Но я обращусь к этой функции разово. Реле выключится, а обратно не включится, потому, что больше не кто не вызовет эту функцию и не проверит истек ли таймер.
Вижу решение: функцию нужно создать с параметром активации. В нужном месте вызывать функцию с включенным параметром, а в loop () постоянно вызывать эту функцию с выключенным параметром.
Это решение выглядит громоздким. Существует ли более правильный подход?
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
501
149
Существует ли более правильный подход?
О правильности можно вести долгие споры.
Есть подход - выносить работу с функциональным блоком в отдельную функцию.

C++:
#define REL_WAIT    1    // можно вместо define использовать enum
#define REL_START    2
#define REL_STEP_1    3

int flagRelay = REL_WAIT // Текущий Режим реле

void loop() {
    sett.tick(); // Settings Устанавливает flagRelay = REL_START при опр. условиях
    relay_tick(); // работа с реле происходит здесь.
}
void relay_tick(){
    static uint32_t relMillis;

    if (flagRelay == REL_START){    // Можно вместо if использовать case
        flagRelay = REL_STEP_1;
        relMillis = millis();
        Включить реле
    }
    if (flagRelay == REL_STEP_1){
        if(millis() - relMillis >  Время){
            Выключить реле
            flagRelay = REL_WAIT;       
        }
    }
}
 
Изменено:
  • Лойс +1
Реакции: Teh-nick

Teh-nick

✩✩✩✩✩✩✩
9 Ноя 2023
14
1
@Bruzzer, спасибо за ответ.

Подскажите, в 20 строке:
if(millis() - flagRelay > Время){
имелось в виду:
if(millis() - relMillis > Время){
?

Локальная переменная
static uint32_t relMillis;
будет инициализироваться каждый раз при вызове функции? Или нужно использовать глобальную переменную?
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
501
149
имелось в виду:
if(millis() - relMillis > Время){
Да. имелось в виду это. (Сейчас исправил в предыдущем сообщении).

> Или нужно использовать глобальную переменную?
В приведенном коде это не используется, поэтому выгода не так очевидна.
Очевидный плюс у локальной - ее можно называть одинаково в разных функциях
Не изобретать каждый раз новое название а использовать любое (хоть tmp или millisPrev или millisStep1 и т.д.)
Прочитать можно в поиске по "область видимости переменных C++".
 
  • Лойс +1
Реакции: Teh-nick