если нужно не переодически выполнять действие и просто сделать небольшую паузу, не останавливая выполнение всей программы, а затем вернуться обратно?
К примеру - есть функция которая получает скорость вращения вентилятора, и задает её. И в ней есть такой момент, что если полученная скорость ниже определенного порога, то нужно дать толчек: задать скорость 255 на 500мс, а потом установить ту скорость которая нужна, иначе стоячий вентилятор не запустится на низких оборотах.
С delay это одна строчка delay(500);
но это вешает всю программу.
Библиотека SimpeTimer имеет инструмент .SetTimeout но он требует в параметрах функцию, которую будет запускать, причем void без параметров.
Сама же функция задания скорости вентилятора запускается с интервалом 10сек, т.е. мы не можем просто написать проверку millis, потому что следующий проход будет через 10сек, а не через 500мс.
Вопрос как быть?
Дело в том, что отрезать часть фукнции исполняющуюся после паузы 500мс, и вызывать её через тот же .SetTimeout мы не можем, т.к. там фигурирует значение value полученное как параметр - значит придется объявлять эту переменную глобально? это плохо.. да и вообще плодить лишние функции не хорошо..
А учитывая что таких моментов в скетче наберется с десяток..
Поэтому вопрос, как бы вызывать задержку без delay, так чтобы после указанного интервала выполнение программы начиналось со следующей строчки, после вызова задержки?
вот привожу пример функции
void fanCheck()
{
if (tempAir.value >= thisSet.maxTemp && tempAir.lastst<tempAir.value){ //если темперарута больеш рекомендуемой и растет
fanPwr.value += FAN_STEP;//увечичиваем скорость на шаг
}
else if (tempAir.value <= thisSet.maxTemp && tempAir.lastst>tempAir.value){ //если меньше рекомендуемой и падает
fanPwr.value -= FAN_STEP;//уменьшаем скорость на шаг
};
fanSetSpeed(fanPwr.value); //задаем скорость вращение
//ждем новой проверки время fanPwr.interval
}
void fanSetSpeed(int value) //устанавливаем скорость вентилятора
if (value < 100){ //если скорость ниже 100 - дать толчек
fanMotor.setSpeed(120);
//дать раскрутиться 500мс
};
//устанавливаем полученное значение
if (value > thisSet.fanMaxPwr){ fanPwr.value = thisSet.fanMaxPwr; } //но не более максимальной
else if (value < thisSet.fanMinPwr){ fanPwr.value = thisSet.fanMinPwr; }; //но не менее минимальной
fanMotor.setSpeed(value);
}
Когда я вижу решения "мигания без задержки", меня всегда коробит... Ни разу не увидел, что бы кто то учел возможность перехода millis() через 0... Почему ? Ведь это колдовство может привести к тому, что "диод загориться" на 50 дней :)
Когда я вижу решения "мигания без задержки", меня всегда коробит... Ни разу не увидел, что бы кто то учел возможность перехода millis() через 0... Почему ?
Потому что плохо смотрели. Именно в такой конструкции переполнение учтено:
Не столь тяжелую (кстати, интерестно как вы без танцев с бубуном возведете в квадрат, скажем число 4294967295).
Но "модуль" - вас не спасет. Все будет с точностью до наоборот. При переходе через ноль он резко начнет выдавать "большие интервалы", хотя, на самом деле прошло все несколько миллисекунд. И вы получите ложную "сработку" в момент перехода.
Народ, можете объяснить, почему все всегда определяют
#define LED_PIN 13
когда есть заранее определённая (в системе) константа
LED_BUILTIN
причём про неё написано, что светодиод не всегда подключён к пину 13 - на некоторых платах к другому пину, а эта константа как раз дефайнится всегда правильно, для любой платы.
Для чего дублировать системную константу? Не могу понять почему, но раз все так делают, должна же быть какая-то причина?
Всех системных констант не упомнишь... А о многих и не знаем. Я когда-то пробовал найти их список, но безуспешно. А ковырять системные библиотеки утомительно.
1 - я про неё даже и не знал :)
2 - типерь знаю , но всё равно буду применять-определять свои - #define ledPinOK 9 , #define ledPinErr A0 , #define ledPinClk 7
...... просто я так хочу и мне удобнее ( а компилятор сам решит что включать в код - дублирования не будет )
Всех системных констант не упомнишь... А о многих и не знаем. Я когда-то пробовал найти их список, но безуспешно. А ковырять системные библиотеки утомительно.
Сама же функция задания скорости вентилятора запускается с интервалом 10сек, т.е. мы не можем просто написать проверку millis, потому что следующий проход будет через 10сек, а не через 500мс.
Вопрос как быть?
Встречный вопрос, а почему бы следующий проход не сделать 0.5 сек?
Притом, реализовыать это можно, минимум,двумя способами:
1. Цикл ВСЕГДА 0.5 сек, но внутри такого цикла есть дополнительная проверка на 10 сек, по результатам которой и выполняется 10-секундный код.
2. Длину интервала между проходами можно хранить в переменной, которая обычно равна 10000 мс, но иногда переопредлеляется на 500.
Цитата:
Поэтому вопрос, как бы вызывать задержку без delay, так чтобы после указанного интервала выполнение программы начиналось со следующей строчки, после вызова задержки?
Такое тоже можно сделать. Если очень нужно. Вопрос в том - целесообразно ли? Мне кажется, лучше остановиться на одном из предложенных выше вариантов.
Если же нужно сделать именно так: программа работает до определенной границы, затем прерывается, а потом начинает выполнение с этой границы, то нужно ввести переменную состояния. При одном значении состояния выполняется код от начала loop до границы, а при другом - от границы до конца loop. В конце первого блока переменная переводится во второе состояние, в конце второго - возвращается в первое. Ну а интервал времени, в течение которого прерывается выполнение программы, реализуется так же, как и "мигаем светодиодом без delay".
Подскажите как мигнуть без задержки 1-2 раза при определеном условии
if (определенное условие)
{
// мигаем первый раз
digitalWrite(LEDpin, HIGH);
digitalWrite(LEDpin, LOW);
// мигаем второй раз
digitalWrite(LEDpin, HIGH);
digitalWrite(LEDpin, LOW);
}
Как Вы и написали - без задержки и по определённому условию. Но мигание это Вы не увидите, т.к. слишком быстро.
Ну тут правда, если например интервал 5 секунд, то первые 5 секунд после загрузки моргание не будет срабатывать, если конечно не задать какой-нибудь огромный previousMillis, вместо 0, так-то можно постараться все учесть, но думаю при Ваших 100 мс, ничего страшного.
Здесь 2 раза мигнет, если надо 4, то 4 надо исправить на 8. И вообще весь if-else можно заменить на
Это заменяет if-else, при первом проходе переменная изменяется с 1 на 2, при втором с 2 на 3, затем с 3 на 0 и мигание прекращается до следующего запуска, кстати если попадет так, что светодиод светится в процессе мигания, а где-то в коде сработает modeLed = 1; то цикл закончится на включенном светодиоде, это можно избежать проверкой не идет ли уже мигание при присваивании = 1 или сам код изменять, чтобы в конце всегда заканчивалось на выключении.
++ прибавляет +1. Если находится перед переменной, то сначала переменная изменяется (+1), а затем возвращается уже измененная, а если после переменной ++, то сначала возвращается текущее значение, а потом прибавляется +1. Поэтому не взаимозаменяемо.
modeLed = 1;
value = ++modeLed; // value будет равно 2, modeLed тоже 2
modeLed = 1;
value = modeLed++; // value будет равно 1, а modeLed 2
% - остаток от деления, то есть / делит, а % - это остаток, значит 1%4 = 1, 2%4=2, 3%4=3, 4%4=0 (5%4=1, 6%4=2, 7%4=3, 8%4=0)
Упс... там раньше не modeLed = ++modeLed%4;, а modeLed = ++modeLed%5; иначе будет включенным оставаться и когда не часто, а чтобы и при часто работало, то так:
Запутался с миллис. Задача контроля исполнения функции за промежуток времени.
Т.е. после сработки датчика1 происходит цикл действий и система возвращается к датчику1, так вот если время цикла заняло больше 30 секунд включаем светодиод об аварийной ситуации, если менее 30 секунд обнуляем миллис и цикл продожается.
Можно ли в этой функции заменить стандартную конструкцию c использованием
previous = millis();
, на пример от leashak?
int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout)
{
uint8_t x = 0, answer = 0;
char response[100];
unsigned long previous;
memset(response, '\0', 100); // Initialice the string
delay(100);
while( Serial2.available() > 0) Serial2.read(); // Clean the input buffer
Serial2.println(ATcommand); // Send the AT command
x = 0;
previous = millis();
// this loop waits for the answer
do
{
// if there are data in the UART input buffer, reads it and checks for the asnwer
if(Serial2.available() != 0)
{
response[x] = Serial2.read();
if (x < sizeof(response) - 1) x++;
// check if the desired answer is in the response of the module
if (strstr(response, expected_answer) != NULL)
{
answer = 1;
}
}
// Waits for the asnwer with time out
}
while((answer == 0) && ((millis() - previous) < timeout));
Serial.println(response);
return answer;
}
Простите, может я туплю, но я не понимаю. Вы хотите заменить в приведённом Вам скетче, что и на что? Я не хочу перечитывать всю тему. Если скажете в какой программе. что и на что Вы хотите поменять, я посмотрю. Если я Вас достал своей тупостью, то и забейте - не отвечайте. Извините, но никак понять не могу.
Простите, может я туплю, но я не понимаю. Вы хотите заменить в приведённом Вам скетче, что и на что? Я не хочу перечитывать всю тему. Если скажете в какой программе. что и на что Вы хотите поменять, я посмотрю. Если я Вас достал своей тупостью, то и забейте - не отвечайте. Извините, но никак понять не могу.
Нет, с этой конструкцией проблем быть не должно, она нормальная. Не глючит она.
Если программа работает нормально, а потом вдруг перестаёт, я бы посмотрел на памятьЮ особенно динамическую. В одном месте по крйней мере она у Вас используется явно неоправданно. Я имею в виду строку 437. Почему бы вместо
и избавиться от динамического запроса памяти при создании экземпляра String?
Ошибка стаблильна? Или каждый раз в новом месте? Если не знаете. понаставьте во все функции печати при входе и при выходе и следите за прохождением программы. Так Вы обнаружите в каком месте беда впервые проявляется. Может оглядитесь повнимательнее и поймёте причину.
Опять же не помешает иногда печатать отчёт о расходовании памяти. Если расход накапливается - значит стопудово ломается при переполнении - надо искать причину переполнения.
Нет, с этой конструкцией проблем быть не должно, она нормальная. Не глючит она.
Если программа работает нормально, а потом вдруг перестаёт, я бы посмотрел на памятьЮ особенно динамическую. В одном месте по крйней мере она у Вас используется явно неоправданно. Я имею в виду строку 437. Почему бы вместо
и избавиться от динамического запроса памяти при создании экземпляра String?
Ошибка стаблильна? Или каждый раз в новом месте? Если не знаете. понаставьте во все функции печати при входе и при выходе и следите за прохождением программы. Так Вы обнаружите в каком месте беда впервые проявляется. Может оглядитесь повнимательнее и поймёте причину.
Опять же не помешает иногда печатать отчёт о расходовании памяти. Если расход накапливается - значит стопудово ломается при переполнении - надо искать причину переполнения.
Я и раньше пытался без String обойтись, но почему-то раньше не удавалось... Как я понял, новичкам строки лучше не использовать вовсе, так как занимают много места!
Нашел такую библиотеку, получается мне надо выводить кол-во свободной памяти в каждой функции или можно в одном месте loop()?
понаставьте во все функции печати при входе и при выходе - Это при помощи Serial.print? Просто совсем далек от программирования, а помидорки хочется :D
Я и раньше пытался без String обойтись, но почему-то раньше не удавалось... Как я понял, новичкам строки лучше не использовать вовсе, так как занимают много места!
Дело даже не в том, что много, а в том, что часто. Вот посмотрите, я только сегодня пример приводил как часто она дергает память.
jahmal пишет:
Нашел такую библиотеку, получается мне надо выводить кол-во свободной памяти в каждой функции или можно в одном месте loop()?
Думаю, для начала в loop и посмотреть не растёт ли расход, ну и сколько там всего свободной. Если надо будет. то в другие места потом можно вставить.
jahmal пишет:
Это при помощи Serial.print?
Ну, да. Просто чтобы понимать "вошла сюда", "вышла отсюда" и следить за её путём. Это обычная практика.
Такой вопрос мучает:
если нужно не переодически выполнять действие и просто сделать небольшую паузу, не останавливая выполнение всей программы, а затем вернуться обратно?
К примеру - есть функция которая получает скорость вращения вентилятора, и задает её. И в ней есть такой момент, что если полученная скорость ниже определенного порога, то нужно дать толчек: задать скорость 255 на 500мс, а потом установить ту скорость которая нужна, иначе стоячий вентилятор не запустится на низких оборотах.
С delay это одна строчка delay(500);
но это вешает всю программу.
Библиотека SimpeTimer имеет инструмент .SetTimeout но он требует в параметрах функцию, которую будет запускать, причем void без параметров.
Сама же функция задания скорости вентилятора запускается с интервалом 10сек, т.е. мы не можем просто написать проверку millis, потому что следующий проход будет через 10сек, а не через 500мс.
Вопрос как быть?
Дело в том, что отрезать часть фукнции исполняющуюся после паузы 500мс, и вызывать её через тот же .SetTimeout мы не можем, т.к. там фигурирует значение value полученное как параметр - значит придется объявлять эту переменную глобально? это плохо.. да и вообще плодить лишние функции не хорошо..
А учитывая что таких моментов в скетче наберется с десяток..
Поэтому вопрос, как бы вызывать задержку без delay, так чтобы после указанного интервала выполнение программы начиналось со следующей строчки, после вызова задержки?
вот привожу пример функции
реально ли Вашим способом переделать такой код:
Конечно.
Когда я вижу решения "мигания без задержки", меня всегда коробит... Ни разу не увидел, что бы кто то учел возможность перехода millis() через 0... Почему ? Ведь это колдовство может привести к тому, что "диод загориться" на 50 дней :)
Когда я вижу решения "мигания без задержки", меня всегда коробит... Ни разу не увидел, что бы кто то учел возможность перехода millis() через 0... Почему ?
Ну при переходе через ноль, милис будет меньше чем предыдущее, и соотв. результат будет отрицательным и сравнение не выполнится.
Поэтому я сравниваю значение по модулю. Т.е. сравниваю с интервалом корень квадратный из квадрата разницы между millis() и previousMillis
Ну при переходе через ноль, милис будет меньше чем предыдущее, и соотв. результат будет отрицательным и сравнение не выполнится.
Поэтому я сравниваю значение по модулю. Т.е. сравниваю с интервалом корень квадратный из квадрата разницы между millis() и previousMillis
Вопрос уже поднимался выше по ветке.
Ну при переходе через ноль, милис будет меньше чем предыдущее, и соотв. результат будет отрицательным и сравнение не выполнится.
Это ложное утверждение. Скетч из сообщения #18 доказывает обратное.
Поэтому я сравниваю значение по модулю. Т.е. сравниваю с интервалом корень квадратный из квадрата разницы между millis() и previousMillis
Если посмотреть в справочник, то можно найти готовую функцию "модуль" http://arduino.ru/Reference/Abs
Не столь тяжелую (кстати, интерестно как вы без танцев с бубуном возведете в квадрат, скажем число 4294967295).
Но "модуль" - вас не спасет. Все будет с точностью до наоборот. При переходе через ноль он резко начнет выдавать "большие интервалы", хотя, на самом деле прошло все несколько миллисекунд. И вы получите ложную "сработку" в момент перехода.
Уважаемый Леший, подскажите пожалуйста, как я могу по кнопке менять параметр
?
Если задавать этот параметр как
то код не работает.
Спасибо!
Программирование -> unsigned long
leshak, с возвращением ?
К сожалению, пока еще нет. Но я надеюсь...
А чем плох такой вариант:
Народ, можете объяснить, почему все всегда определяют
когда есть заранее определённая (в системе) константа
причём про неё написано, что светодиод не всегда подключён к пину 13 - на некоторых платах к другому пину, а эта константа как раз дефайнится всегда правильно, для любой платы.
Для чего дублировать системную константу? Не могу понять почему, но раз все так делают, должна же быть какая-то причина?
Всех системных констант не упомнишь... А о многих и не знаем. Я когда-то пробовал найти их список, но безуспешно. А ковырять системные библиотеки утомительно.
1 - я про неё даже и не знал :)
2 - типерь знаю , но всё равно буду применять-определять свои - #define ledPinOK 9 , #define ledPinErr A0 , #define ledPinClk 7
...... просто я так хочу и мне удобнее ( а компилятор сам решит что включать в код - дублирования не будет )
причина - личное дело-мнение каждого :)
Всех системных констант не упомнишь... А о многих и не знаем. Я когда-то пробовал найти их список, но безуспешно. А ковырять системные библиотеки утомительно.
аха :)
потревожу избитую и всем понятную тему оптимизации кода мигания без делау.
но, чёрт возьми, почему
если в реальности
Сама же функция задания скорости вентилятора запускается с интервалом 10сек, т.е. мы не можем просто написать проверку millis, потому что следующий проход будет через 10сек, а не через 500мс.
Вопрос как быть?
Встречный вопрос, а почему бы следующий проход не сделать 0.5 сек?
Притом, реализовыать это можно, минимум,двумя способами:
1. Цикл ВСЕГДА 0.5 сек, но внутри такого цикла есть дополнительная проверка на 10 сек, по результатам которой и выполняется 10-секундный код.
2. Длину интервала между проходами можно хранить в переменной, которая обычно равна 10000 мс, но иногда переопредлеляется на 500.
Поэтому вопрос, как бы вызывать задержку без delay, так чтобы после указанного интервала выполнение программы начиналось со следующей строчки, после вызова задержки?
Такое тоже можно сделать. Если очень нужно. Вопрос в том - целесообразно ли? Мне кажется, лучше остановиться на одном из предложенных выше вариантов.
Если же нужно сделать именно так: программа работает до определенной границы, затем прерывается, а потом начинает выполнение с этой границы, то нужно ввести переменную состояния. При одном значении состояния выполняется код от начала loop до границы, а при другом - от границы до конца loop. В конце первого блока переменная переводится во второе состояние, в конце второго - возвращается в первое. Ну а интервал времени, в течение которого прерывается выполнение программы, реализуется так же, как и "мигаем светодиодом без delay".
leshak спасибо за #32 пост. Очень помогло в написании кода.
Молодчина.
Спасибо за простые и понятные разъяснения!
Здравствуйте,
Подскажите как мигнуть без задержки 1-2 раза при определеном условии
Подскажите как мигнуть без задержки 1-2 раза при определеном условии
Как Вы и написали - без задержки и по определённому условию. Но мигание это Вы не увидите, т.к. слишком быстро.
:)))
Так и я умею...
Но я думаю понятно ято я мигаю не для процессора а для человека.. так что он должен заметить..
Может 1,2,3 Гц
Но при этом не использовать делей, так как в это время принимается сигнал...
:для человека.. так что он должен заметить..
1мс вполне заметно. Проверено.
Я думаю это не принципиальный вопрос... но думаю надо хоть 100 мс
Мне надо просто при наступлении события моргнуть один два раза
И желательно использовать мо меньше процессорного времени..
Я не могу позволить себе потерять на задержку 100 мс
Ясно, я просто неправильно понял. Вам нужно без delay(), но с millis(). Хорошо, в чём конкретно у Вас возникла проблема? Где Ваш скетч?
Да все верно...
Я принимаю данные и хотелось сделать индикацию приема...
Но вот куда это примостить .. данные принимаются по рпириванию
Пробовал примостить за функцией записи в память
Так те варианты которые есть работают не корректно
то включат то выключат светодиод... а хотел 4 раза мигнуть..
Ну тут правда, если например интервал 5 секунд, то первые 5 секунд после загрузки моргание не будет срабатывать, если конечно не задать какой-нибудь огромный previousMillis, вместо 0, так-то можно постараться все учесть, но думаю при Ваших 100 мс, ничего страшного.
Здесь 2 раза мигнет, если надо 4, то 4 надо исправить на 8. И вообще весь if-else можно заменить на
И получится
Спасибо большое...
Завтра попробую
Вот вопрос а что означает
modeLed = ++modeLed%4;
Оно взаимо зменяемо с
modeLed++
Какую роль играет %
Хотя если я правильно понял по условию
modeLed должно превратится в 0...
Это заменяет if-else, при первом проходе переменная изменяется с 1 на 2, при втором с 2 на 3, затем с 3 на 0 и мигание прекращается до следующего запуска, кстати если попадет так, что светодиод светится в процессе мигания, а где-то в коде сработает modeLed = 1; то цикл закончится на включенном светодиоде, это можно избежать проверкой не идет ли уже мигание при присваивании = 1 или сам код изменять, чтобы в конце всегда заканчивалось на выключении.
++ прибавляет +1. Если находится перед переменной, то сначала переменная изменяется (+1), а затем возвращается уже измененная, а если после переменной ++, то сначала возвращается текущее значение, а потом прибавляется +1. Поэтому не взаимозаменяемо.
% - остаток от деления, то есть / делит, а % - это остаток, значит 1%4 = 1, 2%4=2, 3%4=3, 4%4=0 (5%4=1, 6%4=2, 7%4=3, 8%4=0)
Спасибо
Я очень благодарен за информацию...
Буду завтра делать :)
Да получается что мигает но не совсем так...
Если условия наступают часто то мигает.. но может только один раз моргнуть или остаться включенным ...
Как заставить доработать до конца?
Этот код корректно выполняется только один раз...
При повторных вызовах от сбивается и работает не корректно... modeLed принимает такие значения..
Все гениальное просто :) Спасибо за идею...
Возможны пропуски по миганию если условие наступает слишком часто, но зато всегда будет по 2 раза мигать...
Упс... там раньше не modeLed = ++modeLed%4;, а modeLed = ++modeLed%5; иначе будет включенным оставаться и когда не часто, а чтобы и при часто работало, то так:
Попробуйте, должно быть идеально =)
Эта строчка что бы не остался включенным, за следующим кругом погасит?
Да
Помогите начинающему.
Запутался с миллис. Задача контроля исполнения функции за промежуток времени.
Т.е. после сработки датчика1 происходит цикл действий и система возвращается к датчику1, так вот если время цикла заняло больше 30 секунд включаем светодиод об аварийной ситуации, если менее 30 секунд обнуляем миллис и цикл продожается.
Надо запоминать значания и потом его сравнивать с текущи...
И я так понял что это надо делать в цыкле....
Всем добрых суток времени.
У меня такой вопрос.
Можно ли в этой функции заменить стандартную конструкцию c использованием
, на пример от leashak?
Можно ли в этой функции
В какой "этой"?
Можно ли в этой функции
В какой "этой"?
Ну, тогда поясняйте что на что Вы хотите заменить
Ну, тогда поясняйте что на что Вы хотите заменить
Я желаю чтобы не происходило переполнение перменной previous, тут как бы вся тема этому посвященна...
Простите, может я туплю, но я не понимаю. Вы хотите заменить в приведённом Вам скетче, что и на что? Я не хочу перечитывать всю тему. Если скажете в какой программе. что и на что Вы хотите поменять, я посмотрю. Если я Вас достал своей тупостью, то и забейте - не отвечайте. Извините, но никак понять не могу.
Простите, может я туплю, но я не понимаю. Вы хотите заменить в приведённом Вам скетче, что и на что? Я не хочу перечитывать всю тему. Если скажете в какой программе. что и на что Вы хотите поменять, я посмотрю. Если я Вас достал своей тупостью, то и забейте - не отвечайте. Извините, но никак понять не могу.
Зарание извеняюсь! Тупость с моей стороны...
Нет, с этой конструкцией проблем быть не должно, она нормальная. Не глючит она.
Если программа работает нормально, а потом вдруг перестаёт, я бы посмотрел на памятьЮ особенно динамическую. В одном месте по крйней мере она у Вас используется явно неоправданно. Я имею в виду строку 437. Почему бы вместо
не написать
и избавиться от динамического запроса памяти при создании экземпляра String?
Ошибка стаблильна? Или каждый раз в новом месте? Если не знаете. понаставьте во все функции печати при входе и при выходе и следите за прохождением программы. Так Вы обнаружите в каком месте беда впервые проявляется. Может оглядитесь повнимательнее и поймёте причину.
Опять же не помешает иногда печатать отчёт о расходовании памяти. Если расход накапливается - значит стопудово ломается при переполнении - надо искать причину переполнения.
Нет, с этой конструкцией проблем быть не должно, она нормальная. Не глючит она.
Если программа работает нормально, а потом вдруг перестаёт, я бы посмотрел на памятьЮ особенно динамическую. В одном месте по крйней мере она у Вас используется явно неоправданно. Я имею в виду строку 437. Почему бы вместо
не написать
и избавиться от динамического запроса памяти при создании экземпляра String?
Ошибка стаблильна? Или каждый раз в новом месте? Если не знаете. понаставьте во все функции печати при входе и при выходе и следите за прохождением программы. Так Вы обнаружите в каком месте беда впервые проявляется. Может оглядитесь повнимательнее и поймёте причину.
Опять же не помешает иногда печатать отчёт о расходовании памяти. Если расход накапливается - значит стопудово ломается при переполнении - надо искать причину переполнения.
Я и раньше пытался без String обойтись, но почему-то раньше не удавалось... Как я понял, новичкам строки лучше не использовать вовсе, так как занимают много места!
Нашел такую библиотеку, получается мне надо выводить кол-во свободной памяти в каждой функции или можно в одном месте loop()?
понаставьте во все функции печати при входе и при выходе - Это при помощи Serial.print? Просто совсем далек от программирования, а помидорки хочется :D
Я и раньше пытался без String обойтись, но почему-то раньше не удавалось... Как я понял, новичкам строки лучше не использовать вовсе, так как занимают много места!
Дело даже не в том, что много, а в том, что часто. Вот посмотрите, я только сегодня пример приводил как часто она дергает память.
Думаю, для начала в loop и посмотреть не растёт ли расход, ну и сколько там всего свободной. Если надо будет. то в другие места потом можно вставить.
Ну, да. Просто чтобы понимать "вошла сюда", "вышла отсюда" и следить за её путём. Это обычная практика.
Здравствуйте.
Подскажите пожалуйста, где ошибка, при выключении правильно отрабатывает, а при выключении двигатель не выключается.
Хочу чтоб работало так:
сигнал с концевика есть - на 2 сек. двигатель включился вперед и выключился,
нет сигнала - на 2 сек. двигатель включился назад и выключился,
.... и так постоянно.