Я бью тревогу. Я хочу, чтобы она сыграла мелодию, когда придет время бить тревогу. Я хочу, чтобы он был остановлен нажатием кнопки.
У меня работает мелодия, и она подает сигнал тревоги, когда я хочу. Но когда я нажимаю кнопку, я не могу отключить будильник.
Кажется, не так много, что я могу увидеть в Интернете на этом топи c. Некоторые сбили меня с толку, сказав, что это можно сделать с помощью "while" l oop, а другие говорят, что это можно сделать с "for" l oop, а другие говорят, что вам нужно проверить в определенных c точках в вашем коде, чтобы увидеть, была ли нажата кнопка после прерывания. (изменяемая переменная будет изменена во время прерывания)
Я не думаю, что установка контрольных точек для кнопки, нажатой после прерывания, является элегантным решением, а размер файла был бы слишком большим, чтобы удерживать полную настройку. (96% места было использовано при полной настройке)
У меня было несколько попыток.
первая попытка не пыталась исправить проблему, но была обходным решением. это в основном будет держать Arduino занятым бесконечно во время прерывания. Это плохая практика, но она, по крайней мере, остановит тревогу.
int tonePin = 11;
boolean button_was_pressed = false;
void donothing(){
while(button_was_pressed)
{bool who_cares_this_is_just_to_keep_the_cpu_busy;}}
void isr()
{
button_was_pressed = true;
digitalWrite(13,LOW);
donothing();
}
void setup() {
attachInterrupt(digitalPinToInterrupt(2), isr, RISING);
pinMode(13,OUTPUT);
Serial.begin(9600);
}
void midi() {
Serial.println("midi");
Serial.println(millis());
tone(tonePin, 207, 3595.840371094);
delay(3627.200390625);
delay(150.197988281);
tone(tonePin, 220, 578.592360352);
delay(609.044589844);
delay(275.638066406);
tone(tonePin, 207, 578.592360352);
delay(609.044589844);
delay(240.976992188);
Serial.println("midi exit");
Serial.println(millis());
//(the actual tune isnt so bland and short. this tune was for debugging purposes)
}
void loop() {
unsigned long period = 15*1000L;//the period is 15 seconds (can easily be replaced with 24 hrs once the issue is solved)
Serial.println("loop");
Serial.println(millis());
Serial.println(millis() % period);
//wait till morning
digitalWrite(13,HIGH);
delay(100);
//unsigned long hbhb = 15*1000L; //15 sec
if(millis() % period < 100)
{
midi();
}
У меня были другие попытки вызвать другую функцию, но после прерывания она всегда возвращается туда, где остановилась.
как я могу остановить воспроизведение песни, не отвлекая программу и не вмешиваясь в следующий будильник?