Запуск цикла за определенный период времени

В настоящее время у меня есть цикл, который выполняется без условия времени:

unsigned long previousMillis = 0;        // запомним время последнего обновления светодиода

int WET=4;//влажная линия
int DRY=5;//сухая строка
int Inhale=1000;//мсек
int Exhale=1000;//мсек
//int Noflow=3000;//мс

void setup() {
  // поместите сюда код установки для однократного запуска:
  pinMode (WET, OUTPUT);
  pinMode (DRY, OUTPUT);
}

void loop() {
  // вдох
  digitalWrite(WET,LOW);
  digitalWrite(DRY,HIGH);
  delay (Inhale);
  // выдох
  digitalWrite(WET,HIGH);
  digitalWrite(DRY,LOW); 
  delay (Exhale);
  //Нет потока
  // цифровая запись (ВЛАЖНЫЙ, ВЫСОКИЙ);
  // цифровая запись (СУХОЙ, ВЫСОКИЙ);
  // задержка (нет потока);
}

Затем я попытался написать "таймер" для каждого цикла, но получил ошибку:" статус выхода 1 Ошибка компиляции для платы Arduino/Genuino Uno."

Код с таймером:

unsigned long previousMillis = 0;        // запомним время последнего обновления светодиода

int WET = 4; //мокрая линия
int DRY = 5; //сухая линия
//int Inhale=1000;//мс
//целое выдох=1000;//мс
//int Noflow=1000;//мс
int BPM = 60;
int IE = (((60 * 1000) / BPM) / 2);

void setup() {
  // поместите сюда код установки для однократного запуска:
  pinMode (WET, OUTPUT);
  pinMode (DRY, OUTPUT);
}

void loop() {
  for (int i = 0; i = 20;)
    int BPM = BPM + 10;
#include <elapsedMillis.h>

  elapsedMillis timeElapsed;
  unsigned int interval = 60000; // одна минута в мс

  while (timeElapsed < interval) {

    // вдох
    digitalWrite(WET, LOW);
    digitalWrite(DRY, HIGH);
    delay (IE);
    // выдох
    digitalWrite(WET, HIGH);
    digitalWrite(DRY, LOW);
    delay (IE);
    //Нет потока
    // цифровая запись (ВЛАЖНЫЙ, ВЫСОКИЙ);
    // цифровая запись (СУХОЙ, ВЫСОКИЙ);
    // задержка (2000);
  }
}

Цель вывода: выполнение каждого цикла цикла в течение 1 минуты.

Кто-нибудь знаком с этой ошибкой? Большое спасибо за вашу помощь

, 👍0


2 ответа


1

В вашем коде есть ряд проблем:

Не помещайте операторы #include для файлов заголовков в середину кода. Они должны быть вверху, перед любым другим кодом. (Что такое заголовочный файл elapsedMillis.h?)

Ещё один момент: у вас беспорядок в цикле for. Он должен выглядеть примерно так: for (int i = 0; i < 20; i++) (это приведет к тому, что цикл for будет выполнен 20 раз со значением i в диапазоне от 0 до 19. ) Однако что вы хотите, чтобы произошло в цикле for? Без фигурных скобок после этого кода ЕДИНСТВЕННАЯ строка, которая будет выполняться 20 раз, — это строка int BPM = BPM + 10; (что не имеет никакого смысла.)

Вам действительно не следует использовать циклы while, основанные на времени, внутри вашей основной функции цикла. Это противоречит цели использования таймеров вместо операторов задержки. И вы должны избавиться от своих вызовов delay() и использовать millis() для управления всем вашим временем. Выполните поиск по запросу «Arduino blink no delay» и изучите примеры для получения информации о том, как реструктурировать код.

,

1
  1. Ваш цикл for не будет работать, так как изначально i равно 0, а вы сравниваете его с 20, а также у вас не было условия обновления третьей переменной в цикле for.
  2. Вы объявляете BPM новым каждый раз, когда запускается цикл, что неверно
  3. Кроме того, вы включаете заголовочный файл между запуском программы, что испортит ваш код, и это совершенно неправильная практика.
,