Здравствуйте! Подскажите новичку, пожалуйста. Задумка такая, как только срабатывает датчик проигрывается один раз мелодия.Датчик в виде сопротивления.Программа определяет сопротивление и если оно нужного номинала проигрывает один раз мелодию. Код (C++): #include "pitches.h" int a = 0; byte f = 0; // ноты в мелодии: int melody[] = { NOTE_C4, NOTE_E4,NOTE_G4, NOTE_C5, NOTE_G4, NOTE_C5,}; // продолжительность ноты: 4 = четверть ноты, 8 = восьмая часть, и т.д.: int noteDurations[] = { 8, 8, 8, 4,8,4 }; void setup () { pinMode (A0, INPUT_PULLUP); pinMode(13, OUTPUT); //перебор нот мелодии: } void loop () { // не нужно повторять мелодию. a = analogRead(A0); if (a > 300 && a < 370) { f = 0; } else { f = 1; } if (f == 0) { musika(); } } void musika() { for (int thisNote = 0; thisNote < 8; thisNote++) { // для расчета продолжительности мелодии взята одна секунда //разделенная на тип ноты. //e.g. четверть ноты= 1000 / 4, восьмая часть = 1000/8, etc. int noteDuration = 1000/noteDurations[thisNote]; tone (10, melody[thisNote],noteDuration); //чтоб разделить ноты установим минимальную паузу между ними. // длительност ноты + 30% вполне подойдет: int pauseBetweenNotes = noteDuration * 1.30; delay (pauseBetweenNotes); // stop the tone playing: noTone (10); } } Но проблема в том ,что если датчик будет включен постоянно то мелодия будет постоянно повторятся, а мне нужно чтоб она сработала один раз. Как сделать чтоб она сработала разово?
Почти правильно. Вы флаг немного не так используете Код (C++): #include "pitches.h" int a = 0; boolean flagPlayOnce = true; // при true НАДО проиграть музыку 1 раз // ноты в мелодии: int melody[] = { NOTE_C4, NOTE_E4,NOTE_G4, NOTE_C5, NOTE_G4, NOTE_C5,}; // продолжительность ноты: 4 = четверть ноты, 8 = восьмая часть, и т.д.: int noteDurations[] = { 8, 8, 8, 4,8,4 }; void setup () { pinMode (A0, INPUT_PULLUP); pinMode(13, OUTPUT); //перебор нот мелодии: } void loop () { // не нужно повторять мелодию. a = analogRead(A0); if (a > 300 && a < 370 ) // если кнопка нажата { musika(); } else { // к флагу тут ничего не относится } } void musika() if flagPlayOnce == true // если разрешено, играем мелодию { for (int thisNote = 0; thisNote < 8; thisNote++) { // для расчета продолжительности мелодии взята одна секунда //разделенная на тип ноты. //e.g. четверть ноты= 1000 / 4, восьмая часть = 1000/8, etc. int noteDuration = 1000/noteDurations[thisNote]; tone (10, melody[thisNote],noteDuration); //чтоб разделить ноты установим минимальную паузу между ними. // длительност ноты + 30% вполне подойдет: int pauseBetweenNotes = noteDuration * 1.30; delay (pauseBetweenNotes); // stop the tone playing: noTone (10); } flagPlayOnce = false; // ставим метку, что музыка уже сыграла один раз } }