Оцените код
- Войдите на сайт для отправки комментариев
Втр, 17/03/2020 - 02:56
Подскажите пожалуйста, пытаюсь избавиться от функции 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);
}
нормальный код, только стоит строку 21 тоже внутрь условия If перенести, иначе она будет выполнятся не с интервалом delayTime, а каждый оборот loop()
я бы строку 15 выкинул переместив миллис в условие
Честно говоря не понял, чем от делея отличается. Один в один почти. Если вспомнить елд.
вот так оптимальнее, зачем лишние переменные плодить. Стоит почитать о типах данных, их размерах и максимальных значениях. Поможет экономить ОЗУ контроллера, его мало.
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 байт экономии ОЗУ. } }вот так оптимальнее, зачем лишние переменные плодить.
я бы строку 15 выкинул переместив миллис в условие
Разница такая же, как и между "в среднем равно" и "больше или равно".
kostyamat, это относится и к Вашему коду.
я бы строку 15 выкинул переместив миллис в условие
Это тема старого, как мир холивара. Для разных задач нужно делать по-разному. Фишка тут в том, что между условием и строкой №18 значение millis может измениться.
Поэтому, вопрос, что Вам реально нужно - обеспечит равные интервалы, в которые включаются и действия внутри условия (тогда - как у ТС) или равные задержки между действиями в условии (тогда везде писать голимый миллис без сохранения в переменной)
Westwood, Вам правда нужно добросовестно полазить и объективно оценить с кучей замечаний? Или начнёте обижаться, что "к мелочам цепляюсь" и мудаком назовёте? Плавали - знаем, потому и спрашиваю, прежде, чем время тратить.
я бы строку 15 выкинул переместив миллис в условие
Это тема старого, как мир холивара. Для разных задач нужно делать по-разному. Фишка тут в том, что между условием и строкой №18 значение millis может измениться.
Поэтому, вопрос, что Вам реально нужно - обеспечит равные интервалы, в которые включаются и действия внутри условия (тогда - как у ТС) или равные задержки между действиями в условии (тогда везде писать голимый миллис без сохранения в переменной)
чессказать даже не рассматривал такую ситуацию, мне просто не нравится 100500 присваиваний переменной в цикле, до выполнения условия, если есть цель, тогда да, но ТС не систему RTL жеж делает )))
Если вам интересна "эстетика" вопроса, я бы посоветовал минимизировать число объявлений, особенно глобальных, и все такие мелкие задачи решать минимумом текста. При достаточно длинном листинге Вы в них "утоните". Т.е. вместо
лучше просто
Хреновая программа для контроллера, поскольку создана на "похвалится", а не для работы.