Добрый день. Начал осваивать arduino и столкнулся с тем, что не выходит реализовать таймер на millis.
В общем идея такая, имеется некий импульсный насос, работает через реле и по задумке должен управляться по bluetooth/монитор порта и дозировать нужный объем. Написал небольшой простейший код с использованием delay в цикле for, который подает нужное количество импульсов. Скетч работает без проблем, довольно точно подается нужный объем, но хотелось бы реализовать все с использованием millis, дабы контроллер не висел трупом на время исполнения delay, т.к. планирую повесить на одну ардуинку датчики, реле и т.д.
(Прилагаю два скетча один с delay (работает чётко как надо), второй по примеру из мануала arduino на millis (реле загорается и не тухнет)).
Скетч с delay()
Все работает именно так, как написано в скетче. То, что это не совпадает с вашими желаниями, говорит только о том, что вы не продумали, как нужно. Постарайтесь мысленно пройтись по вашему коду, “выполняя” его в голове, и сами все поймете.
Тупая замена delay() на millis() ничего не даст, т.к. это абсолютно разные принципы работы.
Обратите внимание, что в скетче с миллис Вы вообще не используете данные, полученные из порта. Это одно необходимое исправление в логике.
Другое - это то, что непосредственно дёргание пина насоса находится внутри условия “если пришла команда”. Надо вынести наружу!
Вот очень примерный алгоритм действий в loop:
Если пришла команда, то считаем и запоминаем необходимое число импульсов и например взводим флаг “надо качать!”.
А дальше смотрим этот флаг.
Если надо качать, то дёргаем ножкой, проверяя интервал переключения и считая, сколько раз дёрнули. Когда дойдём до нужного числа, сбрасываем флаг.
Если не надо качать - ничего не делаем.
Когда это реализуете, то должны появиться уточняющие вопросы, которых нет в скетче с делей. Например, что нужно делать, если команда пришла, когда уже качаем? Но это можно уже потом разрулить.
ошибка здесь, пока символ по сериалу не пришел остальное всё висит.
Ну и желательно вообще разобраться, как асинхронно такие вещи писать, типа Случилось - Действие. Там просто в Лууп носится всё без остановки и если какое-то условие выполняется то что-то происходит; и никто никого не ждет. Ну это я так, на бытовом тсказать уровне пытаюсь объяснить способ.
void loop()
{
if (millis()-time>250)
{
trigger=!trigger;
digitalWrite(13, trigger); // здесь обычное мигание светодиода
time=millis();
}
if (millis()-time2>10000)
{
trigger2=!trigger2;
// А здесь получаю данные с BMP180 (температуру)
time2=millis();
}
}
Так вот. Несколько часов все было нормально, а затем данные о температуре “застыли”, светодиод продолжал мигать. Восстановилось после перезагрузи МК.