Работа с millis()

BigMeister
Offline
Зарегистрирован: 11.02.2018

//Я профан в программировании, пока только изучаю.

Я так понял, что отсчет в millis() идет с запуска самой ардуины.

Мне нужно, чтобы отсчет шел при выполнении конкретного блока if. 

Примерный код -

if (millis() - lastmillis > 10000)
{
   lastmillis = millis();
   некий код
   ....
   ....
}

То есть при перескакивании программы в блок этого if должно пройти 10 сек и далее идет код.

Проблема в том, что пока программа дойдет до этого блока, 10 сек давно пройдут, к тому времени millis() - lastmillis  уже больше 10000 и блок if выполняется моментально. 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

это надо еще вставить туда, откуда должен начаться отчет, только флаг нужен еще, чтобы срабатывал один раз когда нужно

lastmillis = millis();

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Три раза прочёл, так и не понял вопроса.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А чего тут понимать, человек хочет управлять абсолютным значением millis. Правильно, ТС?

Green
Offline
Зарегистрирован: 01.10.2015
static uint32_t t = millis();
if (millis() - t >= 1000) {
  t = millis();
  run();
}

Не?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

BigMeister пишет:

Проблема в том, что пока программа дойдет до этого блока, 10 сек давно пройдут, к тому времени millis() - lastmillis  уже больше 10000 и блок if выполняется моментально. 


1. Интересная у вас программа получается.
Где ж это она может аж 10 секунд бродить
и никак не добраться до вашего миллиса?
160 миллионов тактов процессора ! ! !
2. А вам что, надо или не надо чтобы
код выполнился если 10 секунд уже прошли?

Rex
Offline
Зарегистрирован: 16.02.2018

Вот как сделал я для того чтобы при нажатии кнопки на нужном выводе появлялась лог. 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);		//подаем на выход управления электроклапаном значение переменной
 }