Переполнение millis()

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

Добрый день.

Знаю подобные тему уже не раз обсуждались, но все равно никак не могу разобраться.

Есть код:

void loop()
{
  int trig=analogRead(fridge_btn); //читаем "сигнал" ,на аналоговом порту А0, с концевика холодильника: 0-дверь открыта(0В), 50-дверь закрыта(5В)
  trig=map(trig,0,1023,0,50);
  if (trig < 10) //если дверь открыли
    {
      alert=1; //взводим флаг
      currentMillis = millis() - previousMillis; //начинаем отсчет таймера
      if(currentMillis<=INTERVAL) //сравниваем с величиной INTERVAL заданной вначале
          {
        //Serial.println(currentMillis); //для отладки пишем пройденное время таймера в порт
        	//digitalWrite(led,HIGH);
          }
      if (currentMillis >= INTERVAL) //если время все таки вышло
        {
        		tone(piezo, 440, 250);
        		delay(250);
        		tone(piezo, 165, 250);
    		 	delay(250);
        		tone(piezo, 440, 250);
        		delay(250);
        		delay(250);
        		noTone(piezo);
        		//Serial.println("Time alert!Door open");
        }
      }
  else
      {
      	previousMillis = millis(); //если на А0 значение >10, т.е. дверь закрыта
      	noTone(piezo);
      	//Serial.println("All is OK.Fridge closed.");
      	//digitalWrite(led,LOW);
      	alert=0; //флаг тревоги так и остается "не взведен"
    }
}

Примерно через месяц-полтора дуина тупо зависает и не реагирует. Я так понимаю происходит переполнение millis() и условие перестает выполняться. Как поправить код?

P.S. Если кому то данная тема "обрыбила" или "набила оскомину"-пожалуйста не пишите гневных сообщений, пусть даже в таком случае пост без ответов останется...

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

http://alxarduino.blogspot.ru/2013/09/ComfortablyBlinkWithoutDelay.html

сначала читаем раздел UPD1:, затем прыгаем в начало и внимательно смотрим как это реализовано.

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

Спасибо, ушел читать.

P.S. Ох и тяжко мне дается программирование, но интересно блииииин :)

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

legionercheg пишет:

Примерно через месяц-полтора дуина тупо зависает и не реагирует. Я так понимаю происходит переполнение millis() и условие перестает выполняться. Как поправить код?

P.S. Если кому то данная тема "обрыбила" или "набила оскомину"-пожалуйста не пишите гневных сообщений, пусть даже в таком случае пост без ответов останется...

ты форум читаешь?

кто тебе запретил прочитать любую тему про титановй велосипед, посмотреть код и понять, как исправить код?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

legionercheg пишет:

Че за гонево?

Задав тупой вопрос, ты сам, лично, уже себя унизил.

Терпеть унижения и глумеж - это плата за помощь. Не хочешь так платить - звездуй на... отсюда.

если (текущее_время - старое_время > интервал) то {делаем то, что нужно по прошествии интервала}

в этой форме сравнение устойчиво к переполнению и никак не повлияет на программу.

И да, вопрос этот реально задолбал.

И да, Клапауций абсолютно прав - есть ПРИКРЕПЛЕННЫЕ темы, им же и написанные, в том числе и про это.

И да. прежде чем спрашивать нужно потрудиться поискать ответ самому, иначе будешь вечным придурком.

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

wdrakula пишет:

Терпеть унижения и глумеж - это плата за помощь. Не хочешь так платить - звездуй на... отсюда.

я категорически против такого метода оплаты за знания - я сам иногда задаю вопросы на форуме, но после того, как оказался в информационном тупике: не знаешь, по каким словам составить запрос в поисковой системе, другие уважительные причины.

но! все, кто желает получить то, что лежит у них под ногами, должны быть посланы в лес.

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

Просто вот так вот сходу не вкурил что есть такая тема в прилепленных, можно было дать ссылку молча и удалить тему через пол часа,и никому глаза не мозолило бы!

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

legionercheg пишет:

можно было дать ссылку молча и удалить тему через пол часа,и никому глаза не мозолило бы!

точно так нужно было сделать?

назови хоть одну причину - почему?

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

А в чем смысл разводить "вот это вот всё",вместо одного поста со ссылкой на соотв. тему?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

legionercheg пишет:

А в чем смысл разводить "вот это вот всё",вместо одного поста со ссылкой на соотв. тему?

хороший вопрос - зачем ты это "развёл", вместо забить в поиск форума [титановый велосипед], прочитать и поблагодарить за просветление?

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

Спасибо за просветление

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

legionercheg пишет:

Спасибо за просветление

ок. удачи в нелёгком пути к знаниям.