Вопрос от новичка

Novi4ok777
Offline
Зарегистрирован: 15.12.2017

Здравствуйте. Подскажите пожалуйста, я только изучаю основы.

Поставил задачу, выполнить несколько раз 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++;
}

 

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

1) Во втором примере Вы noTone пропустили. Или используйте третий параметр функции tone.

2) Если этот Ваш цикл находится в loop то он и будет повторяться бесконечно. Для "чисто попробовать" перенесите код в setup. Он выполнится один раз.

3) У Вас не выделено время на "молчание". Звук только отключается и тут же включается снова. Так все циклы теряют смысл. После того как выключите звук вставьте тоже задержку. Тогда Вы услышите раздельно желаемое количество сигналов.

kostyamat
Offline
Зарегистрирован: 16.11.2017

Первый вариант правильный. Если надо бибикнуть только один раз, при старте МК, перенесите его в setup и все дела.
А вот второй пример вообще ни разу не сработает. Почему, сами подумайте.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Можно так поправить ситуацию:

static int i=0; // прописано в loop()
while (i<3){

 

Novi4ok777
Offline
Зарегистрирован: 15.12.2017

Спасибо всем за подсказки и развёрнутый ответ.
По выполнению в setup(), я понимаю что код будет исполняться однажды при включении питания.
Сразу начал исполнять код в loop() потому что пока игрался с RTC-модулем и реле  при помощи условия if, возникла идея перед включением нагрузки на реле подавать нецикличный звуковой сигнал. Понял что не так всё просто и вынес в отдельный скетч для "чисто попробовать". 

Почему второй пример не сработает я кажется понял, с каждым повторением цикла i в нём будет возвращаться в 0.

То есть, в loop() не получится сделать что бы tone() сработал однажды, допустим вместе с запуском реле?

kasper007
Offline
Зарегистрирован: 23.05.2016

Второй пример не должен пищать вообще никогда в таком виде.

Брайан Керниган, Деннис Ритчи "Язык программирования Си": while (fahr <= upper) { do_something }
Он работает следующим образом. Проверяется условие в скобках. Если оно истинно (значение fahr меньше или равно значению upper), то выполняется тело цикла (три инструкции, заключенные в фигурные скобки).
Затем опять проверяется условие, и если оно истинно, то тело цикла выполняется снова. Когда условие становится ложным (fahr превысило upper), цикл завершается, и вычисления продолжаются с инструкции, следующей за циклом.

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

Novi4ok777 пишет:

Почему второй пример не сработает я кажется понял, с каждым повторением цикла i в нём будет возвращаться в 0.

 

Второй пример не сработает не только в loop, где i "будет возвращаться в ноль", но и нигде в другом месте тоже - вы в условии while знак сравнения перепутали.

Novi4ok777 пишет:

То есть, в loop() не получится сделать что бы tone() сработал однажды, допустим вместе с запуском реле?

Легко. Нужно просто запомнить в программе , что  tone() уже сработал - и больше его не включать. Это делается с помощью глобальной переменной, т. н. "флага".

bool flag =0;

void loop () {

if (! flag) {
do_something(); // сделать "что-то" один раз
flag =1;  // установить флаг, что это "что-то" уже выполнено
}

.....

}

код выше выполнит do_something()  один раз

kasper007
Offline
Зарегистрирован: 23.05.2016

Т.е. чтобы у вас все работало вынесите

int i=0 

в setup, а в loop знак ">" замените на "<"

Novi4ok777
Offline
Зарегистрирован: 15.12.2017

Большое спасибо за подсказки, буду изучать!

kostyamat
Offline
Зарегистрирован: 16.11.2017

Смотрю, Вы потерялись в трёх соснах. ))
Второй пример у вас не сработает никогда потому, что вы говорите i = 0, а потом "выполнять пока i БОЛЬШЕ 3-х. Как вы думаете, это будет работать??

Novi4ok777
Offline
Зарегистрирован: 15.12.2017

Кажется понял ошибку, спасибо :)