Как сделать так, чтобы мой пьезо-зуммер гудел только один раз без повторения?
У меня есть проблема с тем, чтобы заставить мой зуммер издавать только те звуки, которые я запрограммировал один раз. Я знаю, что должен добавить какой-то код, но я относительно новичок в этом деле, так что на самом деле не знаю. Я хочу, чтобы он начал воспроизводить тоны, которые у меня есть в коде, как только я нажму кнопку. После этого он должен немедленно остановиться, не зацикливаясь на всем, пока я снова не нажму кнопку. В основном у меня есть эти светодиоды, которые загораются подряд при каждом нажатии кнопки, и как только загорается последний светодиод, зуммер должен играть свою мелодию. После этого я могу снова нажать на кнопку, и все начнется сначала. Если бы кто-нибудь мог помочь, я был бы более чем благодарен!
Вот мой код:
#define button 3
#define LED 1
#define twoLED 2
#define threeLED 4
#define fourLED 5
#define fiveLED 6
#define sixLED 7
#define sevenLED 8
#define eightLED 9
#define nineLED 10
#define tenLED 11
int state = 0;
int old = 0;
int buttonPoll = 0;
void setup() {
pinMode (3,INPUT);
pinMode (11,OUTPUT);
pinMode(LED, OUTPUT);
pinMode(twoLED, OUTPUT);
pinMode(threeLED, OUTPUT);
pinMode(fourLED, OUTPUT);
pinMode(fiveLED, OUTPUT);
pinMode(sixLED, OUTPUT);
pinMode(sevenLED, OUTPUT);
pinMode(eightLED, OUTPUT);
pinMode(nineLED, OUTPUT);
pinMode(tenLED, OUTPUT);
digitalWrite(LED, LOW);
digitalWrite(twoLED,LOW);
digitalWrite(threeLED,LOW);
digitalWrite(fourLED, LOW);
digitalWrite(fiveLED, LOW);
digitalWrite(sixLED, LOW);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
}
void loop() {
buttonPoll = digitalRead (3);
if (buttonPoll ==1) {
delay (50);
buttonPoll = digitalRead (3);
if (buttonPoll == 0) {
state = old + 1;
}
}
else {
delay(100);
}
switch (state) {
case 1:
digitalWrite(LED, HIGH);
digitalWrite(twoLED,LOW);
digitalWrite(threeLED,LOW);
digitalWrite(fourLED, LOW);
digitalWrite(fiveLED, LOW);
digitalWrite(sixLED, LOW);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 2:
digitalWrite(LED, HIGH);
digitalWrite(twoLED,HIGH);
digitalWrite(threeLED,LOW);
digitalWrite(fourLED, LOW);
digitalWrite(fiveLED, LOW);
digitalWrite(sixLED, LOW);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 3:
digitalWrite(LED, HIGH);
digitalWrite(twoLED,HIGH);
digitalWrite(threeLED,HIGH);
digitalWrite(fourLED, LOW);
digitalWrite(fiveLED, LOW);
digitalWrite(sixLED, LOW);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 4:
digitalWrite(LED, HIGH);
digitalWrite(twoLED,HIGH);
digitalWrite(threeLED,HIGH);
digitalWrite(fourLED, HIGH);
digitalWrite(fiveLED, LOW);
digitalWrite(sixLED, LOW);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 5:
digitalWrite(LED, HIGH);
digitalWrite(twoLED,HIGH);
digitalWrite(threeLED,HIGH);
digitalWrite(fourLED, HIGH);
digitalWrite(fiveLED, HIGH);
digitalWrite(sixLED, LOW);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 6:
digitalWrite(LED, HIGH);
digitalWrite(twoLED,HIGH);
digitalWrite(threeLED,HIGH);
digitalWrite(fourLED, HIGH);
digitalWrite(fiveLED, HIGH);
digitalWrite(sixLED, HIGH);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 7:
digitalWrite(LED, HIGH);
digitalWrite(twoLED,HIGH);
digitalWrite(threeLED,HIGH);
digitalWrite(fourLED, HIGH);
digitalWrite(fiveLED, HIGH);
digitalWrite(sixLED, HIGH);
digitalWrite(sevenLED, HIGH);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 8:
digitalWrite(LED, HIGH);
digitalWrite(twoLED,HIGH);
digitalWrite(threeLED,HIGH);
digitalWrite(fourLED, HIGH);
digitalWrite(fiveLED, HIGH);
digitalWrite(sixLED, HIGH);
digitalWrite(sevenLED, HIGH);
digitalWrite(eightLED, HIGH);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 9:
digitalWrite(LED, HIGH);
digitalWrite(twoLED,HIGH);
digitalWrite(threeLED,HIGH);
digitalWrite(fourLED, HIGH);
digitalWrite(fiveLED, HIGH);
digitalWrite(sixLED, HIGH);
digitalWrite(sevenLED, HIGH);
digitalWrite(eightLED, HIGH);
digitalWrite(nineLED, HIGH);
digitalWrite(tenLED, LOW);
old = state;
break;
case 10:
digitalWrite(LED, HIGH);
digitalWrite(twoLED,HIGH);
digitalWrite(threeLED,HIGH);
digitalWrite(fourLED, HIGH);
digitalWrite(fiveLED, HIGH);
digitalWrite(sixLED, HIGH);
digitalWrite(sevenLED, HIGH);
digitalWrite(eightLED, HIGH);
digitalWrite(nineLED, HIGH);
digitalWrite(tenLED, HIGH);
old = state;
tone (11,261);
delay(250);
tone(11, 330);
delay(250);
tone(11,391.99);
delay(250);
tone(11,440);
delay(250);
tone(11, 391.995);
delay(250);
tone(11, 330);
delay(250);
}
break;
default:
digitalWrite(LED, LOW);
digitalWrite(twoLED,LOW);
digitalWrite(threeLED,LOW);
digitalWrite(fourLED, LOW);
digitalWrite(fiveLED, LOW);
digitalWrite(sixLED, LOW);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = 0;
break;
}
}
@Éemia, 👍2
3 ответа
Лучший ответ:
Закрепите первый раздел кода loop()
внутри цикла while.
while (condition)
{
// этот код выполняется непрерывно до тех пор, пока "условие" (condition) не станет истинным
}
В вашем случае переменное состояние
изменяется при записи активного нажатия кнопки: используйте это как свое условие
.
while (state == old)
{
buttonPoll = digitalRead (3);
if (buttonPoll ==1)
{
delay (50);
buttonPoll = digitalRead (3);
if (buttonPoll == 0)
{
state = old + 1;
}
}
else
{
delay(100);
}
}
Пока состояние
остается неизменным, т. Е. Оно равно старому
, код в цикле while будет выполняться бесконечно.
ПРИМЕЧАНИЕ: Любой код вне цикла
while будет эффективно выполняться только один раз. Если вы развернете код, то обнаружите, что большая его часть находится в цикле
while. Если это так, то, возможно, есть лучший подход для рассмотрения.
Как только последовательность светодиодов и пьезо завершится, ваш код не будет ждать повторного нажатия кнопки. Если кнопка не нажата, код не ждет, он просто задерживается на 100 мс, а затем повторяет последовательность.
Добро пожаловать в ASE :)
- Вы сопоставили функцию тона и светодиод с теми же выводами. Таким образом, вам, возможно, придется найти другой штифт для зуммера (штифт 0 )
- Я также взял код от @charlieHanson.
- Скобки для оператора switch были поставлены не в том месте. Я все исправил.
Попробуйте: код здесь
#define button 3
#define LED 1
#define twoLED 2
#define threeLED 4
#define fourLED 5
#define fiveLED 6
#define sixLED 7
#define sevenLED 8
#define eightLED 9
#define nineLED 10
#define tenLED 11
int state = 0;
int old = 0;
int buttonPoll = 0;
void setup() {
pinMode (3, INPUT_PULLUP);
pinMode (11, OUTPUT);
pinMode(LED, OUTPUT);
pinMode(twoLED, OUTPUT);
pinMode(threeLED, OUTPUT);
pinMode(fourLED, OUTPUT);
pinMode(fiveLED, OUTPUT);
pinMode(sixLED, OUTPUT);
pinMode(sevenLED, OUTPUT);
pinMode(eightLED, OUTPUT);
pinMode(nineLED, OUTPUT);
pinMode(tenLED, OUTPUT);
digitalWrite(LED, LOW);
digitalWrite(twoLED, LOW);
digitalWrite(threeLED, LOW);
digitalWrite(fourLED, LOW);
digitalWrite(fiveLED, LOW);
digitalWrite(sixLED, LOW);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
}
void loop() {
while (state == old)
{
buttonPoll = digitalRead (3);
if (buttonPoll == 1)
{
delay (50);
buttonPoll = digitalRead (3);
if (buttonPoll == 0)
{
state = old + 1;
}
}
else
{
delay(100);
}
}
switch (state) {
case 1:
digitalWrite(LED, HIGH);
digitalWrite(twoLED, LOW);
digitalWrite(threeLED, LOW);
digitalWrite(fourLED, LOW);
digitalWrite(fiveLED, LOW);
digitalWrite(sixLED, LOW);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 2:
digitalWrite(LED, HIGH);
digitalWrite(twoLED, HIGH);
digitalWrite(threeLED, LOW);
digitalWrite(fourLED, LOW);
digitalWrite(fiveLED, LOW);
digitalWrite(sixLED, LOW);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 3:
digitalWrite(LED, HIGH);
digitalWrite(twoLED, HIGH);
digitalWrite(threeLED, HIGH);
digitalWrite(fourLED, LOW);
digitalWrite(fiveLED, LOW);
digitalWrite(sixLED, LOW);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 4:
digitalWrite(LED, HIGH);
digitalWrite(twoLED, HIGH);
digitalWrite(threeLED, HIGH);
digitalWrite(fourLED, HIGH);
digitalWrite(fiveLED, LOW);
digitalWrite(sixLED, LOW);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 5:
digitalWrite(LED, HIGH);
digitalWrite(twoLED, HIGH);
digitalWrite(threeLED, HIGH);
digitalWrite(fourLED, HIGH);
digitalWrite(fiveLED, HIGH);
digitalWrite(sixLED, LOW);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 6:
digitalWrite(LED, HIGH);
digitalWrite(twoLED, HIGH);
digitalWrite(threeLED, HIGH);
digitalWrite(fourLED, HIGH);
digitalWrite(fiveLED, HIGH);
digitalWrite(sixLED, HIGH);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 7:
digitalWrite(LED, HIGH);
digitalWrite(twoLED, HIGH);
digitalWrite(threeLED, HIGH);
digitalWrite(fourLED, HIGH);
digitalWrite(fiveLED, HIGH);
digitalWrite(sixLED, HIGH);
digitalWrite(sevenLED, HIGH);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 8:
digitalWrite(LED, HIGH);
digitalWrite(twoLED, HIGH);
digitalWrite(threeLED, HIGH);
digitalWrite(fourLED, HIGH);
digitalWrite(fiveLED, HIGH);
digitalWrite(sixLED, HIGH);
digitalWrite(sevenLED, HIGH);
digitalWrite(eightLED, HIGH);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = state;
break;
case 9:
digitalWrite(LED, HIGH);
digitalWrite(twoLED, HIGH);
digitalWrite(threeLED, HIGH);
digitalWrite(fourLED, HIGH);
digitalWrite(fiveLED, HIGH);
digitalWrite(sixLED, HIGH);
digitalWrite(sevenLED, HIGH);
digitalWrite(eightLED, HIGH);
digitalWrite(nineLED, HIGH);
digitalWrite(tenLED, LOW);
old = state;
break;
case 10:
digitalWrite(LED, HIGH);
digitalWrite(twoLED, HIGH);
digitalWrite(threeLED, HIGH);
digitalWrite(fourLED, HIGH);
digitalWrite(fiveLED, HIGH);
digitalWrite(sixLED, HIGH);
digitalWrite(sevenLED, HIGH);
digitalWrite(eightLED, HIGH);
digitalWrite(nineLED, HIGH);
digitalWrite(tenLED, HIGH);
old = 0;
state = 0;
tone (11, 261);
delay(250);
tone(11, 330);
delay(250);
tone(11, 391.99);
delay(250);
tone(11, 440);
delay(250);
tone(11, 391.995);
delay(250);
tone(11, 330);
delay(250);
noTone(11);
break;
default:
digitalWrite(LED, LOW);
digitalWrite(twoLED, LOW);
digitalWrite(threeLED, LOW);
digitalWrite(fourLED, LOW);
digitalWrite(fiveLED, LOW);
digitalWrite(sixLED, LOW);
digitalWrite(sevenLED, LOW);
digitalWrite(eightLED, LOW);
digitalWrite(nineLED, LOW);
digitalWrite(tenLED, LOW);
old = 0;
break;
}
}
Вот предварительный просмотр :)
Вот ссылка на симулятор Arduino: https://wokwi.com/arduino/projects/297098737606459913
Ух ты, большое спасибо!!!, @Éemia
- Пассивный зуммер работает с AnalogWrite(), но не с DigitalWrite(). Он также имеет постоянный статический шум.
- Как включить и выключить зуммер
- Пьезозвук мелодия ардуино для автосигнализации
- Плохое качество звука при использовании пьезоэлемента в TinkerCad
- Как повторить другое действие внутри цикла?
- Кнопка выхода из текущего цикла
- Не выходит из цикла for
- Обнаружение нажатия кнопки в цикле
Большое спасибо за вашу помощь! Я действительно ценю это!, @Éemia
Я так рада, что ты потрудился ответить мне. К сожалению, я попробовал, и результат оказался таким же, как и раньше. Но все равно спасибо!, @Éemia
О! Вы забыли добавить "noTone(11);" в конце разных тонов! Вам также нужно будет сбросить "состояние" до нуля, когда вы сбросите "старое" до нуля, иначе вы застрянете в бесконечном цикле., @CharlieHanson
Боже мой, спасибо тебе огромное!!! Ты даже не представляешь, как сильно ты мне помогла! Я так благодарна вам за помощь., @Éemia