Вопрос от новичка
- Войдите на сайт для отправки комментариев
Пт, 15/12/2017 - 17:42
Здравствуйте. Подскажите пожалуйста, я только изучаю основы.
Поставил задачу, выполнить несколько раз tone() и выключить. Понимаю, что если это цикл то нужна проверка условия. Ниже 2 примера кода, пьезопищака с ними не выключается. Догадываюсь что у меня i на 2 или на 0 сбрасывается при повторении, но не могу понять как это исправить? Подскажите, пожалуйста.
for(int i=2; i<=6; i++) { tone (tonePin, 100); delay(1000); noTone (tonePin); }
int i=0; // прописано в loop() while (i>3){ tone (tonePin, 100); delay(1000); i++; }
1) Во втором примере Вы noTone пропустили. Или используйте третий параметр функции tone.
2) Если этот Ваш цикл находится в loop то он и будет повторяться бесконечно. Для "чисто попробовать" перенесите код в setup. Он выполнится один раз.
3) У Вас не выделено время на "молчание". Звук только отключается и тут же включается снова. Так все циклы теряют смысл. После того как выключите звук вставьте тоже задержку. Тогда Вы услышите раздельно желаемое количество сигналов.
Первый вариант правильный. Если надо бибикнуть только один раз, при старте МК, перенесите его в setup и все дела.
А вот второй пример вообще ни разу не сработает. Почему, сами подумайте.
Можно так поправить ситуацию:
Спасибо всем за подсказки и развёрнутый ответ.
По выполнению в setup(), я понимаю что код будет исполняться однажды при включении питания.
Сразу начал исполнять код в loop() потому что пока игрался с RTC-модулем и реле при помощи условия if, возникла идея перед включением нагрузки на реле подавать нецикличный звуковой сигнал. Понял что не так всё просто и вынес в отдельный скетч для "чисто попробовать".
Почему второй пример не сработает я кажется понял, с каждым повторением цикла i в нём будет возвращаться в 0.
То есть, в loop() не получится сделать что бы tone() сработал однажды, допустим вместе с запуском реле?
Второй пример не должен пищать вообще никогда в таком виде.
Брайан Керниган, Деннис Ритчи "Язык программирования Си": while (fahr <= upper) { do_something }
Он работает следующим образом. Проверяется условие в скобках. Если оно истинно (значение fahr меньше или равно значению upper), то выполняется тело цикла (три инструкции, заключенные в фигурные скобки).
Затем опять проверяется условие, и если оно истинно, то тело цикла выполняется снова. Когда условие становится ложным (fahr превысило upper), цикл завершается, и вычисления продолжаются с инструкции, следующей за циклом.
Почему второй пример не сработает я кажется понял, с каждым повторением цикла i в нём будет возвращаться в 0.
Второй пример не сработает не только в loop, где i "будет возвращаться в ноль", но и нигде в другом месте тоже - вы в условии while знак сравнения перепутали.
То есть, в loop() не получится сделать что бы tone() сработал однажды, допустим вместе с запуском реле?
Легко. Нужно просто запомнить в программе , что tone() уже сработал - и больше его не включать. Это делается с помощью глобальной переменной, т. н. "флага".
код выше выполнит do_something() один раз
Т.е. чтобы у вас все работало вынесите
в setup, а в loop знак ">" замените на "<"
Большое спасибо за подсказки, буду изучать!
Смотрю, Вы потерялись в трёх соснах. ))
Второй пример у вас не сработает никогда потому, что вы говорите i = 0, а потом "выполнять пока i БОЛЬШЕ 3-х. Как вы думаете, это будет работать??
Кажется понял ошибку, спасибо :)