Доброго времени суток! Возник такой вопрос по упражнению №8(Мерзкое пианино) Как переделать данный код, чтобы была всего одна кнопка, при том чтобы с нажатием на кнопку издавалось бы разная нота( и всего было бы пять разных звучаний), пять раз нажал, пять разных звуков издал динамик,а потом заново те же ноты: #define BUZZER_PIN 13 #define FIRST_KEY_PIN 7 #define KEY_COUNT 3 void setup() { pinMode(BUZZER_PIN,OUTPUT); } void loop() { for (int i = 0; i<KEY_COUNT; ++i) { int keyPin = i + FIRST_KEY_PIN; boolean keyUp = digitalRead(keyPin); if (!keyUp){ int frequency = 3500 + i*500; tone (BUZZER_PIN, frequency, 20); } } } Пробовал по-разному переделать код, но у меня так и не вышло ничего, с каждым нажатием один и тот же звук
Код (C++): #define KEY_COUNT 1 Код (C++): static int frequency += 3500 + i*500; if(frequency > 5*3500) frequency=0;
Добавил эти две строчки, но всё равно не работает, пьезо динамик пищит, когда запускаю плату и при нажатии перестаёт пищать,а после с каждым нажатием издаёт один и тот же звук
Ваш код контролирует не нажатие, а удержание кнопки. Пока кнопка нажата он очень быстро крутит частоты. Нужно или delay воткнуть, чтобы нота прозвучала и вы успели отпустить кнопку. Или переделать так, чтобы код фиксировал нажатие, а не удержание кнопки.
где-то так, проверить не на чем: Код (C++): #define BUZZER_PIN 9 #define KEY_PIN 7 // кнопка между пином и GND #define TONES_COUNT 5 // количество тональностей #define BOUNCE_TIME 100 // псевдозащита от дребезга кнопки const unsigned int freq[TONES_COUNT] = {220, 440, 880, 1760, 3520}; // список частот void setup() { pinMode(KEY_PIN, INPUT_PULLUP); // используется внутренний подтягивающий резистор pinMode(BUZZER_PIN, OUTPUT); } void loop() { static byte counter = 0; // счетчик нажатий if (!digitalRead(KEY_PIN)) // нажата кнопка { counter++; // увеличиваем счетчик if (counter >= TONES_COUNT - 1) counter = 0; // возврат в начало по достижении последнего элемента в списке tone (BUZZER_PIN, freq[counter]); delay(BOUNCE_TIME); } }
Код (C++): void loop() { static byte counter = 0; // счетчик нажатий if (!digitalRead(KEY_PIN)) // нажата кнопка { counter++; // увеличиваем счетчик if (counter >= TONES_COUNT - 1) counter = 0; // возврат в начало по достижении последнего элемента в списке } while(!digitalRead(KEY_PIN)) // пока нажата кнопка { tone (BUZZER_PIN, freq[counter]); delay(BOUNCE_TIME); } noTone(BUZZER_PIN); }