Команда задержки» и проблема со связью по bluetooth
У меня есть проект, в котором я отправляю данные в Arduino через Bluetooth с помощью приложения для Android. Например, когда я нажимаю 1 в части приложения, посвященной полосе, должна произойти анимация. Когда я нажимаю 2, будет отображаться другая анимация. Однако из-за того, что в анимациях есть «команда задержки», происходит задержка обмена данными, когда я нажимаю кнопку. Как я могу предотвратить это? Есть ли команда, которую я могу использовать вместо «Команды задержки»?
void loop() {
if (bluetooth.available()) {
while (bluetooth.available())
{
bar_analog = bluetooth.parseInt();
head_analog = bluetooth.parseInt();
bar_anim = bluetooth.parseInt();
strip_anim = bluetooth.parseInt();
motor_speed = bluetooth.parseInt();
direct = bluetooth.parseInt();
level = bluetooth.parseInt();
if (debug) {
Serial.print("Bar Brightness: ");
Serial.println(bar_analog);
Serial.print("Bar Animation Type: ");
Serial.println(bar_anim);
Serial.print("Headlight Brightness: ");
Serial.println(head_analog);
Serial.print("Strip Animation Type: ");
Serial.println(strip_anim);
Serial.print("Motor Speed Level: ");
Serial.println(motor_speed);
Serial.print("Direction: ");
Serial.println(direct);
Serial.print("Mast Goes: ");
Serial.println(level);
Serial.println("--------------------------------");
}
if (bluetooth.read() == '\n') {
}
}}
if(bar_anim==1) {
digitalWrite(8,HIGH);
delay(50);
digitalWrite(8,LOW);
delay(250);
}
else if(bar_anim==2) {
digitalWrite(8,HIGH);
delay(250);
digitalWrite(8,LOW);
delay(50);
}
}
@bopele, 👍0
Обсуждение1 ответ
Я вижу 2 проблемы с вашим кодом:
Вы используете функцию
delay()
, что не является хорошим стилем кодирования, поскольку в основном занято ожиданием. В это время Arduino ничего не делает и не реагирует ни на какие входные данные. Вместо этого вы должны использовать неблокирующий стиль кодирования, который делает что-то только тогда, когда пришло время это сделать, и не будет блокироваться, пока что-то не произойдет. Вы можете увидеть этот стиль в примереBlinkWithoutDelay
, который поставляется с Arduino IDE. Он используетmillis()
в качестве меры времени. Подумайте, как бы вы испекли пиццу. Вы не будете сидеть перед духовкой, ничего не делая, пока пицца не будет готова. Вы будете заниматься другими делами, регулярно глядя на часы и проверяя, не пора ли вынести пиццу.В части последовательной связи вы используете
parseInt()
. Это может быть проблемой, так как время ожидания составляет 1 с (стандартное значение). До истечения времени ожидания функция будет заблокирована. Это смягчается, если вы сознательно отправляете нецифровой символ в конце каждого значения. Но лучше сначала прочитать сообщение полностью (до символа новой строки\n
), а затем обработать сообщение целиком.
Кроме того, строка if (bluetooth.available())
здесь не нужна, так как цикл while
сделает то же самое.
Спасибо за хороший ответ. Я пытался использовать команду millis(). Тем не менее, я смог включить и выключить светодиод с интервалом всего в 1 секунду. Например, я хочу, чтобы светодиод включался в течение одной секунды и выключался в течение половины секунды. Как мне это сделать с помощью millis()?, @bopele
Вы можете использовать оператор if, чтобы различать состояние OFF и состояние ON. Внутри этого if/else вы помещаете операторы millis() if с разными значениями интервала, @chrisl
Я решил эту проблему, спасибо. У меня есть последний вопрос. Можно ли использовать millis () с циклом for? Например for (int j = 0; j <NUM_LEDS_PER_STRIP; j ++) { fastled.setbrightness (255); светодиоды [j] = CRGB (100, 172, 45); fastled.show (); задержка (100); } Могу ли я использовать здесь миллис () вместо «задержка»?, @bopele
В этом случае не следует использовать цикл for. Вы должны сами создать функциональность, объявив переменную, содержащую номер текущего светодиода. Затем напишите оператор «millis if», в котором вы устанавливаете цвет текущего светодиода и увеличиваете переменную до следующего числа., @chrisl
- Можно ли измерить скорость акселерометром? Насколько точно?
- Arduino Pro Micro, получить данные с контакта Tx?
- Хочу создать Bluetooth audio control (увеличение/уменьшение громкости, воспроизведение, пауза и т.д.) для смартфона
- Невозможно подключиться к Bluetooth hc-05.
- Проблемы с надежным подключением с использованием HC-05 в качестве ведущего устройства Bluetooth
- Как решить проблему AT+INQ ERROR (1F), AT+INIT ERROR(17) на модуле Bluetooth HC-05?
- Модуль Bluetooth HC-05 мигает красным светом - Arduino Uno
- Bluetooth-модуль HC-05 — команда INQ не работает
Вы имеете в виду задержку с каждой командой, которую вы отправляете? Или только одной специальной командой?, @chrisl
Все данные, которые я отправляю, задерживаются, потому что в части анимации есть «команда задержки»., @bopele
См. пример программы
BlinkWithoutDelay.ino
в среде IDE., @Majenko