Помогите найти источник задержки

MadFox
Offline
Зарегистрирован: 21.08.2017

Здравствуйте. Оговорюсь сразу, я не програмист. Кое-какое представление имею, но не более того. Написал я вот такой код:

int InputVoltage = 0;
int Sound = 0;
int Visual = 1; 
float vin = 0;
void setup() {
 pinMode (Sound, OUTPUT);
 pinMode (Visual, OUTPUT);
 pinMode (5, INPUT);
 analogReference (DEFAULT);
}

void loop() {
 vin = analogRead (InputVoltage);
 if (vin > 835){ 
  MySound ();
}
 else {
  noTone (Sound);
  digitalWrite(Visual, LOW);    
}
}

void MySound () {
 tone (Sound, 3000);
 digitalWrite(Visual, HIGH);   
 delay(1000);   
 digitalWrite(Visual, LOW);    
 delay(1000);
 digitalWrite(Visual, HIGH);   
 delay(1000);   
 digitalWrite(Visual, LOW);    
 delay(1000);
}

Несоответствие заявленного пина и analogRead не смотрите - это особенность диджиспарка.

Суть в чем: код смотрит уровень на пине 5 и в зависимости от величины включает\не включает пищалку и мигает встроенным светодиодом.

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

И вот тут происходит задержка: При снижении уровня, пищалка срабатывает с задержкой, на время примерно равное периоду мигания светодиода, указанного у функции. Т.е. 4 секунды, а не две, выдаваемые командой delay. Хотя сам светодиод не мигает, соответственно код указанный в функции вроде-бы не выполняется.

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

Заранее спасибо.

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

Причина задержки - delay(). Хоть выноси его в функцию, хоть не выноси - это блокирующая вычислительный процесс функция.

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

MadFox пишет:

Помогите найти источник задержки

Да, пожалуйста, сразу четыре: строки №№ 26, 28, 30 и 32.

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

MadFox пишет:

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

Вынос в отдельную функцию никак не обеспечит "не прекращать снятие показаний с пина 5." Пока функция не завершится новые показания не снимет. Ищите по сайту и форуму блинк без делея.

MadFox
Offline
Зарегистрирован: 21.08.2017

Чушь какая-то получается: При неудовлетворении условию IF половина команд не выполняется (digitalWrite), а половина выполняется (delay). Так что-ли ?

__Alexander
Offline
Зарегистрирован: 24.10.2012
При неудовлетворении условию IF у Вас выполняються только эти две строчки. Никакие другие и не должны выполняться.

  noTone (Sound);
  digitalWrite(Visual, LOW);   

 

leks
Offline
Зарегистрирован: 22.10.2017

Надо чтение аналогового пина вынести в отдельную функцию - аналог "делая". Тогда Вы не потеряете восприятие "неправильной структуры" своего скетча.

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

MadFox пишет:

Чушь какая-то получается: При неудовлетворении условию IF половина команд не выполняется (digitalWrite), а половина выполняется (delay). Так что-ли ?

Выполняются все команды.

Правда, Ардуина одновременно может выполнять только одну команду.

Соответственно, когда выполняется delay(), другие команды выполняться не могут.

А digitalWrite() тоже выполняется всегда, когда написана в программе. Но, вероятно, выполняется не тогда, когда бы Вам хотелось, из-за того, что в это время выполняется команда delay().

Вам уже правильно посоветовали: избавляться от delay(), для чего разобрать и понять, как работает blink without delay.

 

PS. Программа всегда работает так, как написана, а не так, как ее хотели написать.

MadFox
Offline
Зарегистрирован: 21.08.2017

andriano пишет:

А digitalWrite() тоже выполняется всегда, когда написана в программе. Но, вероятно, выполняется не тогда, когда бы Вам хотелось, из-за того, что в это время выполняется команда delay().

Вам уже правильно посоветовали: избавляться от delay(), для чего разобрать и понять, как работает blink without delay.

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

MadFox
Offline
Зарегистрирован: 21.08.2017

__Alexander пишет:

При неудовлетворении условию IF у Вас выполняються только эти две строчки. Никакие другие и не должны выполняться.

  noTone (Sound);
  digitalWrite(Visual, LOW);   

О чем я и говор. И никаких delay там нет.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Вы уверены, что Ваш код "смотрит уровень на пине 5"? А если проверить?

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

MadFox пишет:
Я в данный момент хочу понять зачем программа лезет в ту область, которая не удовлетворяет условию if и выполнятся не должна.
А кто Вам сказал, что она лезет? Откуда такой вывод?

MadFox
Offline
Зарегистрирован: 21.08.2017

Уровень она смотрит. Изменение напряжения влияет на работу программы. Она пищит или перестает пищать.

А то, что она лезет.... Ну, по прикидкам задержка у меня в районе 3-4 сек, а других delay, тем более с похожим временем, у меня нет вообще.

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

MadFox пишет:
Ну, по прикидкам задержка у меня в районе 3-4 сек, а других delay, тем более с похожим временем, у меня нет вообще.
Блин, Вы из какой группы десткого сада? С утра сидите с плёвой проблемой и всё у Вас "по прикидкам".

Вставляете в Вашу программу

1. gосле строки, 13 печать переменной vin
2. после строки 17, печать текста "Popal v ELSE"
3. после строки 23, печать текста "Popal v MySound"
4. после строки 32, печать текста "Exit from MySound"

B и спокойно смотрите, что у Вас происходит - всё видно как на ладони и безо всякихприкидок.

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

Делайте. думаю. когда посмотрите, во всём разберётесь. А не разбеоётесь, выкладывайте свежий скетчи копипасту протокола - чего печатает.

MadFox
Offline
Зарегистрирован: 21.08.2017

Евгений, вопрос где я увижу эту печать ? Учитывая что Serial монитора у нее нет, а цеплять внешний текстовый - неохота, ей богу.

Да и попадание/непопадание, повторюсь, прекрасно слышно по писку. Вот только застревает он где-то на 4 секунды, с погасшим светодиодом.

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

Залейте на обычную ардуину - проверьте. Код наипростейший, застревать в нем негде. Непонятно, правда, зачем там float.

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

sadman41 пишет:

Залейте на обычную ардуину - проверьте. Код наипростейший, застревать в нем негде. Непонятно, правда, зачем там float.

так там тогда пины надо переопределять

MadFox
Offline
Зарегистрирован: 21.08.2017

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

float - честно говоря не сильно задумывался, взял из попавшего скетча вольтметра.

Ладно, будем ковырять эту фигню, благо до лета она врят-ли понадобится. Если причина выплывет - напишу.

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

MadFox пишет:

неохота, ей богу.

Ну, так охота хуже неволи. Просили помочь - я сказал Вам что и как надо делать. неохота - дело хозяйское.

Кстати, интересно,  если Вам самому лень заниматься Вашей проблемой, чего Вы нас-то напрягаете? Или потому и напрягаете, что самому лень?

MadFox
Offline
Зарегистрирован: 21.08.2017

Да как вам сказать... Человек катаясь по трассе, может потратить год, на то что-бы заметить, понять что это ошибка и проанализировать их. Или я посмотрю 5 минут на его езду и выдам где и в чем его ошибки. А вот принять и осмыслить выданную ему информацию - это уже труд человека.

Тут - ИМХО аналогично.

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

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

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

Ну, так и делайте, что Вам говорят, печатайте, смотрите, понимайте и осмысливайте. Если условие не выполняется, то программа никак не может пойти в ветку под if. Вы в этом сомневаетесь, так убедитесь. А если неохота, так ... кто ж Вас заставит.

Если у Вас нет ардуины, кто Вам мешает запустить эту программу на PC? Берёте протеус, выбираете там модель UNO, запускаете и смотрите всё, что нужно. Кроме протеуса есть ещё с десяток моделирующих программ, которые умеют ардуину моделировать. Берите и запускайте. Никто за Вас этого делать не будет. 

MadFox
Offline
Зарегистрирован: 21.08.2017

Короче вроде разобрался.

Похоже это какая-то особенность именно Digispark'а - при смене сенсорного пина на другой задержка исчезла.

Попутно (при тестировании на живых кошках) еще и знак неравенства не в ту сторону нашел. Я олень :-) 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

MadFox пишет:

 Я олень :-) 

Хуже.  Ты алень, нарисованный на чайнике.