Команда задержки» и проблема со связью по 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);  
}
} 

app

, 👍0

Обсуждение

Вы имеете в виду задержку с каждой командой, которую вы отправляете? Или только одной специальной командой?, @chrisl

Все данные, которые я отправляю, задерживаются, потому что в части анимации есть «команда задержки»., @bopele

См. пример программы BlinkWithoutDelay.ino в среде IDE., @Majenko


1 ответ


1

Я вижу 2 проблемы с вашим кодом:

  1. Вы используете функцию delay(), что не является хорошим стилем кодирования, поскольку в основном занято ожиданием. В это время Arduino ничего не делает и не реагирует ни на какие входные данные. Вместо этого вы должны использовать неблокирующий стиль кодирования, который делает что-то только тогда, когда пришло время это сделать, и не будет блокироваться, пока что-то не произойдет. Вы можете увидеть этот стиль в примере BlinkWithoutDelay, который поставляется с Arduino IDE. Он использует millis() в качестве меры времени. Подумайте, как бы вы испекли пиццу. Вы не будете сидеть перед духовкой, ничего не делая, пока пицца не будет готова. Вы будете заниматься другими делами, регулярно глядя на часы и проверяя, не пора ли вынести пиццу.

  2. В части последовательной связи вы используете 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