Оцените код

Westwood
Offline
Зарегистрирован: 17.03.2020

Подскажите пожалуйста, пытаюсь избавиться от функции delay. Могли бы вы оценить решение данной проблемы с помощью такого кода? Именно с точки зрения применения такой конструкции в готовых проектах. По моему мнению, учитывая что не стопорится работа микроконтроллера и просто каждый цикл происходит перезапись значения в digitalWrite, функция гораздо уместнее delay. Что по вашему мнению? Не пинайте только, учусь!  

const int LED = 3;
unsigned long currentTime;
unsigned long previousTime;
long delayTime = 5000;
boolean n=0;

void setup ()
{
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  currentTime = millis();
  if(currentTime - previousTime >= delayTime)
  {
    previousTime = currentTime;
    n = !n;
  }
  digitalWrite(LED, n);
}

 

 

b707
Offline
Зарегистрирован: 26.05.2017

нормальный код, только стоит строку 21 тоже внутрь условия If перенести, иначе она будет выполнятся не с интервалом delayTime, а каждый оборот loop()

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

я бы строку 15 выкинул переместив миллис в условие

nik182
Offline
Зарегистрирован: 04.05.2015

Честно говоря не понял, чем от делея отличается. Один в один почти. Если вспомнить елд.

kostyamat
Offline
Зарегистрирован: 16.11.2017

вот так оптимальнее, зачем лишние переменные плодить. Стоит почитать о типах данных, их размерах и максимальных значениях. Поможет экономить ОЗУ контроллера, его мало.

const byte LED = 3;  //если не предусматриваются значения более 255, не стоит использовать int, лучше uint8_t или byte. Они занимают 1 байт, а не два как int
// ИМХО, использовать #define LED 3 уместнее, так ОЗУ не потребляется вообще. Компилятор просто подставит значение 3 всюду, где вы укажите псевдоним LED
unsigned long previousTime;  //одной переменной для таймера, в данном примере, вполне достаточно
unsigned int delayTime = 5000;  // вот тут не стоит использовать long если вам не надо задержку более 65535 миллисекунд. Экономия памяти - 2 байта.


void setup ()
{
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
  previousTime = millis();
}

void loop()
{

  if(millis() - previousTime >= delayTime) //millis() (и другие функции, возвращающие значения, даже самописные) можно на прямую использовать в вычислениях. Промежуточная переменная - излишнее расточительство памяти. Экономия 4 байта.
  {
    previousTime = millis();
    digitalWrite(LED, !digitalRead(LED)); //чтобы узнать текущее состояние цифрового пина, его можно просто прочитать и инвертировать прочитанное, не обязательно переменную-флаг заводить. Еще 1 байт экономии ОЗУ. 
  }
}

 

5N62V
Offline
Зарегистрирован: 25.02.2016

kostyamat пишет:

вот так оптимальнее, зачем лишние переменные плодить. 

И строчка 10 еще не нужна :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

я бы строку 15 выкинул переместив миллис в условие

Это неэквивалентная замена.

Разница такая же, как и между "в среднем равно" и "больше или равно".

kostyamat, это относится и к Вашему коду.

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

ua6em пишет:

я бы строку 15 выкинул переместив миллис в условие

Это тема старого, как мир холивара. Для разных задач нужно делать по-разному. Фишка тут в том, что между условием и строкой №18 значение millis может измениться.

Поэтому, вопрос, что Вам реально нужно - обеспечит равные интервалы, в которые включаются и действия внутри условия (тогда - как у ТС) или равные задержки между действиями в условии (тогда везде писать голимый миллис без сохранения в переменной)

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

Westwood, Вам правда нужно добросовестно полазить и объективно оценить с кучей замечаний? Или начнёте обижаться, что "к мелочам цепляюсь" и мудаком назовёте? Плавали - знаем, потому и спрашиваю, прежде, чем время тратить.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

я бы строку 15 выкинул переместив миллис в условие

Это тема старого, как мир холивара. Для разных задач нужно делать по-разному. Фишка тут в том, что между условием и строкой №18 значение millis может измениться.

Поэтому, вопрос, что Вам реально нужно - обеспечит равные интервалы, в которые включаются и действия внутри условия (тогда - как у ТС) или равные задержки между действиями в условии (тогда везде писать голимый миллис без сохранения в переменной)

чессказать даже не рассматривал такую ситуацию, мне просто не нравится 100500 присваиваний переменной в цикле, до выполнения условия, если есть цель, тогда да, но ТС не систему RTL жеж делает  )))
 

vlad072
Offline
Зарегистрирован: 01.08.2017

Если вам интересна "эстетика" вопроса, я бы посоветовал минимизировать число объявлений, особенно глобальных, и все такие мелкие задачи решать минимумом текста. При достаточно длинном листинге Вы в них "утоните". Т.е. вместо

unsigned long currentTime;
//...
  currentTime = millis();
  if(currentTime....

лучше просто

if (millis()...

 

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Хреновая программа для контроллера, поскольку создана на "похвалится", а не для работы.