Очередная задержка без delay

Serega16
Offline
Зарегистрирован: 16.09.2016

Собрал на ардуине терморегулятор. Все работает как надо.

Вкратце алгоритм работы выглядит следующим образом

#define enablePin 8
#define ledPin 13
...

void setup() {
  pinMode(enablePin,INPUT);
  pinMode(ledPin,OUTPUT);
  ...
}

void loop() {
  if(digitalRead(enablePin)==HIGH)
  {
    ...
// подключаем LCD
// включаем светодиод
// подаем управляющий сигнал на нагреватель
delay(20000) // включаем задержку на 20-30 секунд
// после задержки считываем показания температуры и выполняем необходимые действия
...    
  }
  // выключаем терморегулятор
}

При повторной подаче сигнала на 8 вывод процедура должна повториться. Решил избавиться от delay. Для упрощения пытаюсь пока выполнить все это с помощью кнопки и светодиода - при нажатии кнопки светодиод загорается через определенный интервал, после отпускания сразу гаснет. Вот код

int ledPin =  13;      
int enablePin=8;
      
unsigned long previousMillis = 0;      

const long interval = 20000;       

void setup() {
    pinMode(ledPin, OUTPUT);
    pinMode(enablePin, INPUT);
}

void loop() {

if (digitalRead(enablePin) == HIGH)
  {

    unsigned long currentMillis = millis();

    if (currentMillis - previousMillis >= interval)
    {
      previousMillis = currentMillis;
      digitalWrite(ledPin, HIGH);
    }
    previousMillis = 0;
  }
  else {
    digitalWrite(ledPin, LOW);
    
  }
}

Но в ходе моделирования возникли проблемы

1. при повторном нажатии кнопки задержка отсутствует

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

Помогите допилить код.

 

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Удалите 25 строчку.

fogary
Offline
Зарегистрирован: 05.03.2016

Вероятно, проблема в переменной previousMillis. Если ее инициализировать при нажатии кнопки, то должно работать как надо. Например добавить флажок, определяющий состояние удержания кнопки. В начале, флаг = false. После нажатия, если флаг == false, то previousMillis = millis() и флаг = true. После отжатия, флаг = false.

Ответ на первый и второй вопрос, кроется в том, что Вы присваиваете "previousMillis = 0;" в строках 4 и 25, причем присвоение в строке 22 будет замещено присвоением в строке 25. Если после рестарта прошло более 20 секунд,то  условие "if (currentMillis - previousMillis >= interval)" будет выполнятся с первой попытки ("millis() - 0 >= 20000").

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

Serega16 пишет:

Решил избавиться от delay. 

Цель? Если всё работает как надо, то зачем избавляться? Какая разница будет оно стоять в цикле-delay или в цикле-loop? Или Вы просто поупражняться хотите?

Serega16
Offline
Зарегистрирован: 16.09.2016

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

Цель? Если всё работает как надо, то зачем избавляться? Какая разница будет оно стоять в цикле-delay или в цикле-loop? Или Вы просто поупражняться хотите?

хочу использовать сторожевого пса, а он, как вы понимаете, при таких задержках работает не совсем корректно. Да и во время delay информация на дисплее и поступающая от датчиков информация  "замораживается". Ну и поупражняться лишним тоже никогда не будет.

Serega16
Offline
Зарегистрирован: 16.09.2016

Nosferatu пишет:

Удалите 25 строчку.

Ее я как раз и поставил когда пытался решить проблемы. Если убираю, то 1 вопрос отпадает, но остается второй. Заметил что если нажать и сразу отпустить кнопку, а затем опять нажать то и во втором случае (т.е. когда период между нажатиями превышает время задержки) задержка начинает отрабатываться.

upd: Пока пришла идея использовать следующий костыль - разбить один большой delay на несколько маленьких, а между ними вставить wdt_reset. Но из-за спортивного интереса все-таки хочу добить задержку без delay.

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

Serega16 пишет:

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

Не понимаю. В чём некорректность работы WatchDog и чем ему помешают delay?

Serega16 пишет:

Да и во время delay информация на дисплее и поступающая от датчиков информация  "замораживается". 

Тоже не понимаю. Если Вы уберёте delay, но не будете опрашивать датчики и обновлять дисплей чаще, чем сейчас, она будет точно также "замораживаться".

Serega16 пишет:

Ну и поупражняться лишним тоже никогда не будет.

Это я понимаю и считаю правильным! Удачи!

Serega16
Offline
Зарегистрирован: 16.09.2016

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

Не понимаю. В чём некорректность работы WatchDog и чем ему помешают delay?

Максимальное время таймера wdt 8 секунд

wdt_enable(WDTO_8S);

если задержка больше этих 8 секунд, то в это время команда wdt_reset() соответственно не действует, МК думает что программа зависла и происходит перезагрузка системы.

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

Фу, ты, блин, думал и впрямь проблема :))) Ставите делай хоть на 4 секунды, дергаете ресет и снова на те же 4 - не вижу проблемы.

Serega16
Offline
Зарегистрирован: 16.09.2016

Ну пока так и сделал

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

Вместо if   используйте while (currentMillis - previousMillis <= interval) wdt_reset(); - будет задержка на сколько хотите и WDT будет сброшен. 

Serega16
Offline
Зарегистрирован: 16.09.2016

fogary пишет:

Вероятно, проблема в переменной previousMillis. Если ее инициализировать при нажатии кнопки, то должно работать как надо. Например добавить флажок, определяющий состояние удержания кнопки.

Добавил флаг, заработало

int ledPin =  13;      
int enablePin=8;
bool flag_On;    
unsigned long previousMillis = 0;      

const long interval = 5000;       

void setup() {
    pinMode(ledPin, OUTPUT);
    pinMode(enablePin, INPUT);
    flag_On = false;
}

void loop() {
  
if (digitalRead(enablePin) == HIGH)
  {
if(!flag_On) { 
  previousMillis = millis(); 
  flag_On = true;}
  unsigned long currentMillis = millis();

if ((currentMillis - previousMillis) >= interval)
    {
      previousMillis = currentMillis;
      digitalWrite(ledPin, HIGH);
    }
   
  }
  else {
    digitalWrite(ledPin, LOW);
    flag_On = false;
  }
  
}

 

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

Простите меня за бред который напишу( щас взьедятся все кто гоняется за байтами), но если вы упражняетесь для себя то начните использовать классы хранящие состояние всей системы единомоментно, код будет намного более читаем, понятен и с большей легкостью поддаватся любым правкам..... ака начните применять ООП...

я читая данный форум заметил что сдесь не модно советовать такое применять, хотя это крайне странно =) если ваша программа сжирает 30кб кода и в мк уже не лезет больше то чтото не так кодом, или с выбором мк =) но пока вы не столкнулись с таким ограничением, и под 99% задач встречающихся сдесь -  никогда эти задачи не выйдут за пределы 10к кода и 2к озу =)

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

ToRcH2565, целый час прошёл, а Вас ещё не сожрали - все на выборах?

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

ToRcH2565! А есть примеры, по затратам флеша/памяти при решении одной и той же задачи на ООП и без ООП? Очень интересно сравнить. Время выполнения тоже интересно. Красивое, легко читаемое, изложение программы конечно хорошо, но микроконтроллеры заточены на быструю реакцию, прерывания. Как с этим в ООП? 

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

nik182 пишет:

 заточены на быструю реакцию, прерывания. Как с этим в ООП? 

Нормально, если у программиста голова на месте. А если нет, то ему ничто не поможет.

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

Всё зависит от того как напишите, из моих наблюдений только расход озу больше, процентов на 10....

Ну и если не делать "титановые велосипеды для кнопки" то сильного перерасхода не будет, а в некоторых случаях будет прирост засчет верного (т.к. проще писать\читать\исправлять легко понятный код) написания =)

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

ToRcH2565 пишет:

Ну и если не делать "титановые велосипеды для кнопки" то сильного перерасхода не будет, а в некоторых случаях будет прирост засчет верного (т.к. проще писать\читать\исправлять легко понятный код) написания =)

нет - так не пойдёт.

вначале ты пишешь код, который более экономно расходует ресурсы МК - сравниваешь с класс титановый велосипед для тактовой кнопки, и только после этого делаешь заявление, что делать класс титановый велосипед для тактовой кнопки не нужно.

*нужно отвечать за свои слова, а не просто голословно что-то заявлять.

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

Запросто, 

bool Button(int pin)

{

bool b=digitalRead(pin);
delay(1);
return digitalRead(pin)==b;

}

void setup() {
}
 
void loop() {
if Button(12)
  digitalWrite(13,HIGH) 
else
  digitalWrite(13,LOW);
}

вот только вы не верно прочли мой коментарий, и критика была не в том что класс не делает своей работы, а в том что в большинстве случаев вам он не нужен, точней все его заморочки, и если для простого дебаунца одного пина использовать таких монстров то перерасход будет поболья 10% и может достигать 90%

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

Клапауций 232 пишет:

вначале ты пишешь код, который более экономно расходует ресурсы МК - сравниваешь с класс титановый велосипед для тактовой кнопки

Сделано выше в сообщении

Клапауций 232 пишет:

и только после этого делаешь заявление, что делать класс титановый велосипед для тактовой кнопки не нужно.

Вам часто нужно всё что делает этот класс? тогда делайте то что там реализовано =) вам нужен одинарный \двойной клик и дебаунц? делайте только их =) в моем посте шла речь о том что не нужно делать космическую ракету чтобы потом стрелять с нее лазером по жукам в огороде =)

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

ToRcH2565 пишет:

Запросто, 

это дешёвый троллинг.

ToRcH2565 пишет:

вот только вы не верно прочли мой коментарий, и критика была не в том что класс не делает своей работы, а в том что в большинстве случаев вам он не нужен, точней все его заморочки, и если для простого дебаунца одного пина использовать таких монстров то перерасход будет поболья 10% и может достигать 90%

если я тебя правильно понял, то возможны случаи, когда и дуино не нужна - тогда эффективность использования ресурсов МК стремится к бесконечности, а код - к идеалу.

я правильно понял твои оправдания?

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

ToRcH2565 пишет:

Вам часто нужно всё что делает этот класс? тогда делайте то что там реализовано =) вам нужен одинарный \двойной клик и дебаунц? делайте только их =) в моем посте шла речь о том что не нужно делать космическую ракету чтобы потом стрелять с нее лазером по жукам в огороде =)

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

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

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

static const byte bounce_              =   50; // длительность отслеживания дребезга.
static const byte doubleclick_         =  200; // длительность отслеживания двойного клика.
static const unsigned long timer_      = 5000; // длительность отслеживания неактивности.
static const unsigned int retention_   = 2000; // длительность отслеживания нажатия и удержания.

меням на 

#define bounce_                50 // длительность отслеживания дребезга.
#define doubleclick_         200 // длительность отслеживания двойного клика.
#define timer_                     5000 // длительность отслеживания неактивности.
#define retention_              2000 // длительность отслеживания нажатия и удержания.

И тем самым немного экономим озу =) или не так?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Секрет быстрого и эффективного программирования это опыт и наработки (свои , чужие  библиотеки или готовые решения )программиста. Если каждый раз писать с нуля , что с классами ,что без будет сложно и с большим колличеством ошибок. Так что,ToRcH2565, если у вас нет своих классов на все случаи жизни, то пользы от классов для вас будет не много.

ToRcH2565 пишет:

И тем самым немного экономим озу =) или не так?

Самое удивительное не так. Скомпилируйте пустой скетч. А потом с вашими заменами и рассмотрите результат.

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

ToRcH2565 пишет:

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

static const byte bounce_              =   50; // длительность отслеживания дребезга.
static const byte doubleclick_         =  200; // длительность отслеживания двойного клика.
static const unsigned long timer_      = 5000; // длительность отслеживания неактивности.
static const unsigned int retention_   = 2000; // длительность отслеживания нажатия и удержания.

меням на 

#define bounce_                50 // длительность отслеживания дребезга.
#define doubleclick_         200 // длительность отслеживания двойного клика.
#define timer_                     5000 // длительность отслеживания неактивности.
#define retention_              2000 // длительность отслеживания нажатия и удержания.

И тем самым немного экономим озу =) или не так?

ок. и, о чём это свидетельствует?

что класс писать не нужно или о том, что я не профессиональный программист?

от того, что ты оптимизируешь код класса - он от этого не перестанет существовать и на его месте не появится твой сферический код в вакууме, который экономит ресурсы МК, в отличии от класса.

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

Клапауций 232 пишет:

ок. и, о чём это свидетельствует?

Клапауций 232 пишет:

вначале ты пишешь код, который более экономно расходует ресурсы МК - сравниваешь с класс титановый велосипед для тактовой кнопки, и только после этого делаешь заявление, что делать класс титановый велосипед для тактовой кнопки не нужно.

бррр, я никак не пойму я вас так сильно задел, или проблема в том что я привел ВАШ код в пример того как успешно на парадигме ООП программирования сделать монстра, который тратит ресурсы в пустую?
 
вы просили сделать лучше - я показал вам где можно улучшить, изучать ваш класс досконально - желания нету =) написать для себя - я вам привел примера которого мне в большинстве случаев достаточно, когда не достаточно -  я пишу таких же монстров, а потом смотрю и выискиваю вот такие недочеты =)
ToRcH2565
Offline
Зарегистрирован: 16.05.2015

За сим прошу откланятся, я потопал печатать говнокод на делфях =)

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

ToRcH2565 пишет:

Запросто, 

bool Button(int pin)

{

bool b=digitalRead(pin);
delay(1);
return digitalRead(pin)==b;

}

void setup() {
}
 
void loop() {
if Button(12)
  digitalWrite(13,HIGH) 
else
  digitalWrite(13,LOW);
}

вот только вы не верно прочли мой коментарий, и критика была не в том что класс не делает своей работы, а в том что в большинстве случаев вам он не нужен, точней все его заморочки, и если для простого дебаунца одного пина использовать таких монстров то перерасход будет поболья 10% и может достигать 90%

Просветите - а delay зачем в этом коде?

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

ToRcH2565 пишет:

бррр, я никак не пойму я вас так сильно задел, или проблема в том что я привел ВАШ код в пример того как успешно на парадигме ООП программирования сделать монстра, который тратит ресурсы в пустую?
 
проблема в том, что ты привёл код класс титановый велосипед для тактовой кнопки как использующий ресурсы МК впустую, не предоставив читателям экономную альтернативу - т.е. твоё заявление голословно.
 
ToRcH2565 пишет:
вы просили сделать лучше - я показал вам где можно улучшить, изучать ваш класс досконально - желания нету =) написать для себя - я вам привел примера которого мне в большинстве случаев достаточно, когда не достаточно -  я пишу таких же монстров, а потом смотрю и выискиваю вот такие недочеты

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

просто подтвердить свои слова.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

nik182 пишет:

Просветите - а delay зачем в этом коде?

Это он так ловит фронт и спад при нажатии на кнопку. В маленьких примерах пройдет. А для больших большая дрянь.

Logik
Offline
Зарегистрирован: 05.08.2014

ToRcH2565 пишет:

 ООП...

я читая данный форум заметил что сдесь не модно советовать такое применять, хотя это крайне странно =) 

Ничего не странно. ООП - это инструмент, со своими плюсами и минусами. И для МК плюсы редко проявляются, а минусы сильно заметны. Потому его не часто вспоминают. Ну и на форуме столяров про электросварку не популярно ;)

При этом ООП тем полезней, чем дальше от железа, от аппаратной специфики. Собственно это и ограничивает его в МК. Лишние ресурсы памяти тоже бывают проблемой, но не настолько. Второе важное требование - использование его по полной, включая наследование и соответственно с иерархией классов. До этого программа ардуиновская не часто доростает. А без наследования ООП превращается в баловство с дополнительной писаниной. 

Но бывают случаи когда ООП не просто уместно, но и эффективно. Например при реализации сложных меню, GUI и т.д. Еще был интересный вариант - видеоэффекты на ленте Ws2812b. Нижний уровень - вывод буфера на ассемблерной вставке, ввод ИК команд - машина состояний, а все визуальные эффекты, сценарии и т.д. - иерархия классов. Такай вышла ИМХО оптимальная архитектура.

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

Logik пишет:

Второе важное требование - использование его по полной, включая наследование и соответственно с иерархией классов.

Но согласитесь, используя его не на полную, а беря часть, обьеткы\классы, вместо чисто функционального кода - имеем неплохой прирост в скорости разработки и удобстве чтения кода... наследование, у меня просто по привычке часто выходит его использовать там где оно нафик ненужно, тут мне сложно судить о степени его необходимости в связи с некой проф деформацией =)

Logik пишет:

До этого программа ардуиновская не часто доростает. А без наследования ООП превращается в баловство с дополнительной писаниной. 

Logik пишет:
Но бывают случаи когда ООП не просто уместно, но и эффективно. Например при реализации сложных меню, GUI и т.д.

Зачастую простой код по управлению мелкой ерундой я реализую в виде одного из уровней многоуровнего меню, что в дальнейшем упрощает сборку всех железок в одну кучу, видимо сужу с этой колокольни и вижу в наследовании плюсы =)

Logik пишет:
Еще был интересный вариант - видеоэффекты на ленте Ws2812b. Нижний уровень - вывод буфера на ассемблерной вставке, ввод ИК команд - машина состояний, а все визуальные эффекты, сценарии и т.д. - иерархия классов. Такай вышла ИМХО оптимальная архитектура.

Можно ссыль на код? хотелось бы почитать =)

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

Logik пишет:

Второе важное требование - использование его по полной, включая наследование и соответственно с иерархией классов.

Но согласитесь, используя его не на полную, а беря часть, обьеткы\классы, вместо чисто функционального кода - имеем неплохой прирост в скорости разработки и удобстве чтения кода... наследование, у меня просто по привычке часто выходит его использовать там где оно нафик ненужно, тут мне сложно судить о степени его необходимости в связи с некой проф деформацией =)

Logik пишет:

До этого программа ардуиновская не часто доростает. А без наследования ООП превращается в баловство с дополнительной писаниной. 

Logik пишет:
Но бывают случаи когда ООП не просто уместно, но и эффективно. Например при реализации сложных меню, GUI и т.д.

Зачастую простой код по управлению мелкой ерундой я реализую в виде одного из уровней многоуровнего меню, что в дальнейшем упрощает сборку всех железок в одну кучу, видимо сужу с этой колокольни и вижу в наследовании плюсы =)

Logik пишет:
Еще был интересный вариант - видеоэффекты на ленте Ws2812b. Нижний уровень - вывод буфера на ассемблерной вставке, ввод ИК команд - машина состояний, а все визуальные эффекты, сценарии и т.д. - иерархия классов. Такай вышла ИМХО оптимальная архитектура.

Можно ссыль на код? хотелось бы почитать =)

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

Logik пишет:

Второе важное требование - использование его по полной, включая наследование и соответственно с иерархией классов.

Но согласитесь, используя его не на полную, а беря часть, обьеткы\классы, вместо чисто функционального кода - имеем неплохой прирост в скорости разработки и удобстве чтения кода... наследование, у меня просто по привычке часто выходит его использовать там где оно нафик ненужно, тут мне сложно судить о степени его необходимости в связи с некой проф деформацией =)

Logik пишет:

До этого программа ардуиновская не часто доростает. А без наследования ООП превращается в баловство с дополнительной писаниной. 

Logik пишет:
Но бывают случаи когда ООП не просто уместно, но и эффективно. Например при реализации сложных меню, GUI и т.д.

Зачастую простой код по управлению мелкой ерундой я реализую в виде одного из уровней многоуровнего меню, что в дальнейшем упрощает сборку всех железок в одну кучу, видимо сужу с этой колокольни и вижу в наследовании плюсы =)

Logik пишет:
Еще был интересный вариант - видеоэффекты на ленте Ws2812b. Нижний уровень - вывод буфера на ассемблерной вставке, ввод ИК команд - машина состояний, а все визуальные эффекты, сценарии и т.д. - иерархия классов. Такай вышла ИМХО оптимальная архитектура.

Можно ссыль на код? хотелось бы почитать =)

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

факты:

класс титановый велосипед для тактовой кнопки - монстр, который тратит ресурсы в пустую(с)ToRcH2565


#include <class_BUTTON.h>

BUTTON BUTTON_01(12);

void setup() {
pinMode(13, OUTPUT);
digitalWrite(13, 1);
}

void loop() {
BUTTON_01.read();
if (BUTTON_01.click_down) {digitalWrite(13,HIGH);}
if (BUTTON_01.click_up) {digitalWrite(13,LOW);}
}
 
Скетч использует 1 338 байт (21%) памяти устройства. Всего доступно 6 144 байт.
Глобальные переменные используют 25 байт (1%) динамической памяти, оставляя 2 023 байт для локальных переменных. Максимум: 2 048 байт.
 
код, представленный ToRcH2565 как альтернатива класс титановый велосипед для тактовой кнопки, экономящая ресурсы процессора:

bool Button(int pin) {
bool b = digitalRead(pin);
delay(1);
return digitalRead(pin) == b;
}

void setup() {
pinMode(13, OUTPUT);
digitalWrite(13, 1);
}

void loop() {
if (Button(12))
digitalWrite(13,HIGH);
else
digitalWrite(13,LOW);
}
Скетч использует 1 046 байт (17%) памяти устройства. Всего доступно 6 144 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2 039 байт для локальных переменных. Максимум: 2 048 байт.

===================

выполняем рекомендации по оптимизации кода класс титановый велосипед для тактовой кнопки

ToRcH2565 пишет:

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

static const byte bounce_              =   50; // длительность отслеживания дребезга.
static const byte doubleclick_         =  200; // длительность отслеживания двойного клика.
static const unsigned long timer_      = 5000; // длительность отслеживания неактивности.
static const unsigned int retention_   = 2000; // длительность отслеживания нажатия и удержания.

меням на 

#define bounce_                50 // длительность отслеживания дребезга.
#define doubleclick_         200 // длительность отслеживания двойного клика.
#define timer_                     5000 // длительность отслеживания неактивности.
#define retention_              2000 // длительность отслеживания нажатия и удержания.

И тем самым немного экономим озу =) или не так?

до оптимизации - static const

Скетч использует 1 338 байт (21%) памяти устройства. Всего доступно 6 144 байт.
Глобальные переменные используют 25 байт (1%) динамической памяти, оставляя 2 023 байт для локальных переменных. Максимум: 2 048 байт.
 
после оптимизации - #define 
 
Скетч использует 1 338 байт (21%) памяти устройства. Всего доступно 6 144 байт.
Глобальные переменные используют 25 байт (1%) динамической памяти, оставляя 2 023 байт для локальных переменных. Максимум: 2 048 байт.

===================

без комментариев - анализируем, делаем выводы...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ToRcH2565 пишет:

Зачастую простой код по управлению мелкой ерундой я реализую в виде одного из уровней многоуровнего меню, что в дальнейшем упрощает сборку всех железок в одну кучу, видимо сужу с этой колокольни и вижу в наследовании плюсы =)

Вот была тема по применению классов в одной концепции.

http://arduino.ru/forum/programmirovanie/klass-protsessy-i-programma-bli...

Хотя сейчас я пользуюсь этим.

//#1
  void setup1(){
  }
  void loop1(){
  }
//#2
  void setup2(){
  }
  void loop2(){
  }
//#3
  void setup3(){
  }
  void loop3(){
  }
void setup() {
//#1
  setup1();
//#2
  setup2();
//#3
  setup3();
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ; 

//#1 1000 миллисекунд вычислит. поток 1
  static uint32_t future1 = 0 ;
  if (MILLIS>=future1) {
  future1 = MILLIS + 1000 ;
  loop1();
  MILLIS = millis() ;    
  }
//#2  200 миллисекунд вычислит. поток 2
  static uint32_t future2 = 0 ;
  if (MILLIS>=future2) {
  future2 = MILLIS + 200 ;
  loop2();
  MILLIS = millis() ;    
  }
//#3  100 миллисекунд вычислит. поток 3
  static uint32_t future3 = 0 ;
  if (MILLIS>=future3) {
  future3 = MILLIS + 100 ;
  loop3();  
  }
}

 

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

Спасибо конечно что привели в пример, но подобным(только слегка более ООП образным) я пользуюсь всегда =)

есть Init есть run(на самом деле много больше(load reinit pause waitfor) и их может быть сколько угодно (имеется ввиду классов) простите под рукой ничего ненайду такого(все исходники на внешнем винте, а он остался в машине) но суть именно в том что каждый класс содержит некий минимум стандартных процедур аля Init,Run,..... и каждая вызывается при каждом проходе цикла Setup(init) loop(run). без задержек, просто если время для класса не наступило - он пропускает итерацию, и ждет следующей =)

Это позволяет в любом проекте оч быстро разобратся что за чем и для чего, плюс в любой момент времени можно повесится на обработчик данных, и добавив всего один класс, не переписывая половины проекта, допустим начать передавать данные на внешний контроллер, или собрать 2-3-4 проекта в один =)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ToRcH2565. Разумеется, хорошо на каждый подключаемый модуль иметь свой класс. И в этом классе указать ноги, и все модуль готов. Замечательно. А ведь на деле все так и есть. Просто все эти классы спрятаны в подключаемые библиотеки. И обычный начинающий пользователь их в упор не видит.

(анекдот)
- вы видите в Ардуине классы.
- @_@
- а они есть, и вы их широко используете.

ПС: Найдите на компьютере файл Servo.h и раскройте.

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

qwone пишет:

ToRcH2565. Разумеется, хорошо на каждый подключаемый модуль иметь свой класс. И в этом классе указать ноги, и все модуль готов. Замечательно. А ведь на деле все так и есть. Просто все эти классы спрятаны в подключаемые библиотеки. И обычный начинающий пользователь их в упор не видит.

(анекдот)
- вы видите в Ардуине классы.
- @_@
- а они есть, и вы их широко используете.

ПС: Найдите на компьютере файл Servo.h и раскройте.

Тут речь скорее о том что стоит свои поделки делать так же =) в виде класса =) а то как оно выглядит я и так в курсе =)

Logik
Offline
Зарегистрирован: 05.08.2014

ToRcH2565 пишет:

Logik пишет:
Еще был интересный вариант - видеоэффекты на ленте Ws2812b. Нижний уровень - вывод буфера на ассемблерной вставке, ввод ИК команд - машина состояний, а все визуальные эффекты, сценарии и т.д. - иерархия классов. Такай вышла ИМХО оптимальная архитектура.

Можно ссыль на код? хотелось бы почитать =)

Я его в общем и не публиковал. Точней попробовал - http://arduino.ru/forum/proekty/pokhvalimsya-khudozhestvennoi-samodeyatelnostyu-na-ws2812 ранний вариант, меня там раскритиковали за отсутствие идей )))  В общем интереса к нему не было, ну я его и пишу понемногу, втихаря, не высовываясь. Собственно функция вывода не менялась, а вот эффекты весьма разраслись. Также ИК пульт добавил. Но если публиковать для повторения другими, так тут тоже засада, пульты разные, адаптировать под другие не хочу

Я в ту тему немного закинул, сейчас код не причесан, выкладывать весь проект совсем не охота, да и интереса к нему не наблюдалось. По применению ООП, в нем я думаю понятно.

 

 

natan04g
Offline
Зарегистрирован: 05.07.2021

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

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

natan04g пишет:

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

конечно знаем. Используй миллис, Даже пример такой есть - "блинк без delay"

А вообще - неужели даже ту ветку, в которую запостил свой вопрос - лень прочитать? Она ж не зря так называется

natan04g
Offline
Зарегистрирован: 05.07.2021

В том-то и проблема - всё равно замедляет.

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

natan04g пишет:
В том-то и проблема - всё равно замедляет.

Разговор ни о чем.

Где скетч?

Где схема?

Что именно хочется получить?

Как получается на самом деле?

Что не устраивает?

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

natan04g пишет:
В том-то и проблема - всё равно замедляет.

значит руки кривые :)

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

natan04g пишет:
В том-то и проблема - всё равно замедляет.

Что замедляет? Кого замедляет? На сколько замедляет?

ХЗ какой скетч, залитый в ХЗ какую схему, ХЗ что замедляет на ХЗ сколько.

natan04g пишет:
как сделать

ХЗ!

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

Дак сделать-то понятно как - ПО-ДРУГОМУ.