Использование цикла while в функции настройки для считывания данных датчика

У меня есть автомобиль на базе Arduino, и я загружаю в него проекты, которые должны работать при подаче яркого света на датчик освещенности, подключенный к аналоговому выводу A4. До сих пор я использовал следующий код:

void setup() {
    while (analogRead(A4) < 900) {}
}
void loop() {
  // сделать что-нибудь с транспортным средством
}

Я знаю, что это неудачный дизайн, но есть ограничение: я не могу использовать функцию loop() (на самом деле, это ограничение конкретного сценария использования IDE). Мне нужно сделать это в функции setup(), поэтому я хотел бы знать, не навредит ли использование предыдущего кода Arduino или датчику освещённости. Стоит ли использовать в этом цикле while также функции delay() или millis()? Точность обнаружения яркого света не требуется.

, 👍3

Обсуждение

если код работает как задумано, то используйте его, @jsotola

Я голосую за возобновление работы. Автор вопроса спрашивает: «Я хотел бы знать, наношу ли я какой-либо вред Arduino или датчику освещённости, используя предыдущий код». На чём основано это мнение? Выполнение такого цикла либо наносит вред Arduino, либо датчику, либо нет, и это легко продемонстрировать. Их второй вопрос вряд ли вызовет возражения; программа настолько тривиальна, что задержка, цикл millis() или использование ни того, ни другого всё равно позволят достичь заявленной цели, и это также легко продемонстрировать., @JRobert


1 ответ


Лучший ответ:

1

Нет, вы не причините никакого вреда Arduino или датчику освещенности, используя это. код. И нет смысла что-либо добавлять (delay(), millis(), (что угодно) в тело цикла. Единственное, что я бы добавил, — это комментарий. излагая цель этого цикла.

Я знаю, что это плохой дизайн

Это не соответствует правилам «неблокирующего» кода. Я бы не стал беспокоиться. Хотя слишком много об этом говорят: когда отсутствие блокировки имеет значение, оно обычно только Важно внутри loop(), а не в setup(). Если вы действительно хотите быть не блокируя нигде, можно сделать что-то вроде этого:

bool start_signal_received = false;

void loop() {
    if (!start_signal_received) {
        if (analogRead(A4) >= 900)  // проверка сигнала запуска
            start_signal_received = true;
        else
            return;  // без этого сигнала дальше не пойдем
    }

    // Код ниже выполняется только после сигнала запуска.
    ...
}

Ваш блокирующий цикл проще, поэтому я предлагаю вам сохранить его, если только у вас есть веская причина не делать этого.

,

Да. Это похоже на распространённый while (!Serial); во многих скетчах., @the busybee