Запуск цикла за определенный период времени
В настоящее время у меня есть цикл, который выполняется без условия времени:
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 минуты.
Кто-нибудь знаком с этой ошибкой? Большое спасибо за вашу помощь
@RomanS, 👍0
2 ответа
В вашем коде есть ряд проблем:
Не помещайте операторы #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» и изучите примеры для получения информации о том, как реструктурировать код.
- Ваш цикл for не будет работать, так как изначально i равно 0, а вы сравниваете его с 20, а также у вас не было условия обновления третьей переменной в цикле for.
- Вы объявляете BPM новым каждый раз, когда запускается цикл, что неверно
- Кроме того, вы включаете заголовочный файл между запуском программы, что испортит ваш код, и это совершенно неправильная практика.
- Как сделать очень долгую функцию delay(), несколько часов
- Разница между «time_t» и «DateTime»
- Получение BPM из данного кода
- Создание таймера с использованием часов реального времени с указанием времени начала и остановки
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Генерация стабильной частоты
- Как исправить ошибку компиляции для tone (), используя тот же таймер, что и другая функция
- Использовать timer0, не влияя на millis() и micros().