Использование цикла while в функции настройки для считывания данных датчика
У меня есть автомобиль на базе Arduino, и я загружаю в него проекты, которые должны работать при подаче яркого света на датчик освещенности, подключенный к аналоговому выводу A4. До сих пор я использовал следующий код:
void setup() {
while (analogRead(A4) < 900) {}
}
void loop() {
// сделать что-нибудь с транспортным средством
}
Я знаю, что это неудачный дизайн, но есть ограничение: я не могу использовать функцию loop() (на самом деле, это ограничение конкретного сценария использования IDE). Мне нужно сделать это в функции setup(), поэтому я хотел бы знать, не навредит ли использование предыдущего кода Arduino или датчику освещённости. Стоит ли использовать в этом цикле while также функции delay() или millis()? Точность обнаружения яркого света не требуется.
@Wizard, 👍3
Обсуждение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
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Печать string and integer LCD
- устаревшее преобразование из строковой константы в 'char*'
если код работает как задумано, то используйте его, @jsotola
Я голосую за возобновление работы. Автор вопроса спрашивает: «Я хотел бы знать, наношу ли я какой-либо вред Arduino или датчику освещённости, используя предыдущий код». На чём основано это мнение? Выполнение такого цикла либо наносит вред Arduino, либо датчику, либо нет, и это легко продемонстрировать. Их второй вопрос вряд ли вызовет возражения; программа настолько тривиальна, что задержка, цикл millis() или использование ни того, ни другого всё равно позволят достичь заявленной цели, и это также легко продемонстрировать., @JRobert