Работа с millis()
- Войдите на сайт для отправки комментариев
Ср, 14/02/2018 - 23:06
//Я профан в программировании, пока только изучаю.
Я так понял, что отсчет в millis() идет с запуска самой ардуины.
Мне нужно, чтобы отсчет шел при выполнении конкретного блока if.
Примерный код -
if (millis() - lastmillis > 10000)
{
lastmillis = millis();
некий код
....
....
}
То есть при перескакивании программы в блок этого if должно пройти 10 сек и далее идет код.
Проблема в том, что пока программа дойдет до этого блока, 10 сек давно пройдут, к тому времени millis() - lastmillis уже больше 10000 и блок if выполняется моментально.
это надо еще вставить туда, откуда должен начаться отчет, только флаг нужен еще, чтобы срабатывал один раз когда нужно
Три раза прочёл, так и не понял вопроса.
А чего тут понимать, человек хочет управлять абсолютным значением millis. Правильно, ТС?
static uint32_t t = millis(); if (millis() - t >= 1000) { t = millis(); run(); }Не?
Проблема в том, что пока программа дойдет до этого блока, 10 сек давно пройдут, к тому времени millis() - lastmillis уже больше 10000 и блок if выполняется моментально.
1. Интересная у вас программа получается.
Где ж это она может аж 10 секунд бродить
и никак не добраться до вашего миллиса?
160 миллионов тактов процессора ! ! !
2. А вам что, надо или не надо чтобы
код выполнился если 10 секунд уже прошли?
Вот как сделал я для того чтобы при нажатии кнопки на нужном выводе появлялась лог. 1 на нужное время (в моем случае 2 с):
void loop() { timeMillis = millis(); switch1State = digitalRead(switch1Pin); //считывание кнопки 1 if(switch1State == HIGH) { //если нажата flap1On = true; //переводим переменную в состояние лог. 1 timePreview1 = millis(); //записываем в переменную время прошедшее после подачи питания } if (timeMillis - timePreview1 >= 2000) //если разница записанного и текущего времени составит 2000 мс { flap1On = false; //переводим переменную в состояние лог. 0 } digitalWrite(flap1Pin, flap1On); //подаем на выход управления электроклапаном значение переменной }