I need to add a button to my code

Hello there, I have a final project for school, but I can't find a way to add this feature. I already have a code where my buzzer plays a song when my heart rate is higher than 155 beats per minute. However, when I press a button, I need it to turn off the buzzer (like your phone alarm snooze button). Do you have a solution?

#define USE_ARDUINO_INTERRUPTS true
#include <PulseSensorPlayground.h>
#include "pitches.h"

// Pin waar de buzzer is aangesloten
const int buzzerPin = 13;
// Pin waar de hartslagmeter is aangesloten
const int PulseWire = 0;  // Gebruik analoge pin 0 voor PulseSensor

int Threshold = 550;
PulseSensorPlayground pulseSensor;

// Melodie van "Tokyo Drift" (vereenvoudigde en verlengde versie)
int melody[] = {
  NOTE_E5, NOTE_E5, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_A5, NOTE_G5,
  NOTE_E5, NOTE_E5, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_A5, NOTE_G5,
  NOTE_E5, NOTE_E5, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_A5, NOTE_G5,
  NOTE_E5, NOTE_E5, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_A5, NOTE_G5,
  NOTE_D5, NOTE_D5, NOTE_D5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_G5, NOTE_F5,
  NOTE_D5, NOTE_D5, NOTE_D5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_G5, NOTE_F5,
};

// Duur van de noten (in milliseconden)
int noteDurations[] = {
  8, 8, 8, 8, 8, 8, 8, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  8, 8, 8, 8, 8, 8, 8, 8
};

void setup() {
  // Initialiseer de buzzer pin als een uitgang
  pinMode(buzzerPin, OUTPUT);

  // Start de seriële communicatie
  Serial.begin(9600);

  // Initialiseer de PulseSensor bibliotheek
  pulseSensor.analogInput(PulseWire);
  pulseSensor.setThreshold(Threshold);

  if (pulseSensor.begin()) {
    Serial.println("We created a pulseSensor Object !");
  }
}

void loop() {
  // Lees de BPM-waarde
  int myBPM = pulseSensor.getBeatsPerMinute();

  if (pulseSensor.sawStartOfBeat()) {
    Serial.println("♥  A HeartBeat Happened !");
    Serial.print("BPM: ");
    Serial.println(myBPM);
  }

  if (myBPM > 155) {
    // Speel de melodie voor 2 minuten
    unsigned long startTime = millis();
    while (millis() - startTime < 120000) {
      for (int thisNote = 0; thisNote < sizeof(melody) / sizeof(melody[0]); thisNote++) {
        // Bereken de duur van de noot
        int noteDuration = 1000 / noteDurations[thisNote];
        tone(buzzerPin, melody[thisNote], noteDuration);

        // Wacht een beetje langer dan de duur van de noot
        int pauseBetweenNotes = noteDuration * 1.30;
        delay(pauseBetweenNotes);

        // Stop met het spelen van de noot
        noTone(buzzerPin);

        // Lees en druk de BPM-waarde tijdens het afspelen van de melodie
        myBPM = pulseSensor.getBeatsPerMinute();
        if (pulseSensor.sawStartOfBeat()) {
          Serial.println("♥  A HeartBeat Happened !");
          Serial.print("BPM: ");
          Serial.println(myBPM);
        }
      }
    }
    // Wacht een beetje voordat de melodie opnieuw begint
    delay(2000);
  }
}




#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978

Sounds like you are ready to learn about interrupts... this Arduino page has an example at the bottom...

And here is an example in a simulation... imagine the white LED is your buzzer and the blue LED is your button-push turning your buzzer on or off.

Sure do. Wrap the buzzer feature as a dependent condition of the state of the button being the same as it was the last time it went around the loop. If it's different, turn the buzzer off.

Make the loop() function do the looping.

If your heart rate goes over 155, switch to tune playing.

If you are tune playing, start the next note and…
check if you should just finish up and stop time or button or whatever

After the tune playing, or if stopped for some reason, return to monitoring heat rate

No loops inside the loop function.

a7

The example of using an interrupt illustrates some of the trouble it brings along.

The response will still be on average one half the time the blocking code blocks. So while a brief button press is captured, it will be acted upon only when the buttonPressed flag is tested.

If the user stays on the button (perhaps because nothing happened for 100 milliseconds), the interrupt mechanism will catch a bounce on the release of the button, and consider it to be another press. So the LED doesn't toggle, it goes on with the button pressed, and off when released. That is easy to fix, I think.

But the blocking nature of the other code is always going to be the limiting factor.

If implementing the tune playing as non-blocking seems like too much, @kobe9090 can do something of a hack (untested, idea only here):

        // Wacht een beetje langer dan de duur van de noot
        int pauseBetweenNotes = noteDuration * 1.30;
        unsigned long timer = millis();
        while (millis() - timer < pauseBetweenNotes)
          if (digitalRead(stopButton) == PRESSED)
            stopFlag = true;

which does the delay differently and allows the constant checking of an input to set a flag that could be used to terminate the song playing.

a7

Yes. It can be improved.

In its current state, it is using "delay(150)" as a debounce. The intent of the sketch is to show servicing an interrupt. I want to leave it this way to highlight the interrupt and not demonstrate debouncing.

yes this has worked thank you for your help .

This what?

Please post the code that implements the solution you arrived at.

a7

i just added what u have said and added some tweaks.

Please post the code that implements the solution you arrived at.

First, you haven't even said which solution you went with. Second, since both my suggestions were fairly vague, it is impossible to know what you actually did.

I know I could do both, and there is always flexibility, we could all learn now from you, seeing a complete it works idea for solving you problem.

So post the code that now works, so we can see it, compile and run it for ourselves and marvel at your creation.

a7

ow sorry didnt think it was dat deep man. U just sned a bit of code and i implemented it .

#define USE_ARDUINO_INTERRUPTS true
#include <PulseSensorPlayground.h>
#include "pitches.h"

// Pin waar de buzzer is aangesloten
const int buzzerPin = 13;
// Pin waar de hartslagmeter is aangesloten
const int PulseWire = 0;  // Gebruik analoge pin 0 voor PulseSensor
const int stopbutton = 9; 

int Threshold = 550;
PulseSensorPlayground pulseSensor;

// Melodie van "Tokyo Drift" (vereenvoudigde en verlengde versie)
int melody[] = {
  NOTE_E5, NOTE_E5, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_A5, NOTE_G5,
  NOTE_E5, NOTE_E5, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_A5, NOTE_G5,
  NOTE_E5, NOTE_E5, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_A5, NOTE_G5,
  NOTE_E5, NOTE_E5, NOTE_E5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_A5, NOTE_G5,
  NOTE_D5, NOTE_D5, NOTE_D5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_G5, NOTE_F5,
  NOTE_D5, NOTE_D5, NOTE_D5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_G5, NOTE_F5,
};

// Duur van de noten (in milliseconden)
int noteDurations[] = {
  8, 8, 8, 8, 8, 8, 8, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  8, 8, 8, 8, 8, 8, 8, 8,
  8, 8, 8, 8, 8, 8, 8, 8
};

bool stopFlag = false;

void setup() {
  // Initialiseer de buzzer pin als een uitgang
  pinMode(buzzerPin, OUTPUT);
  
  // Initialiseer de stopknop pin als een ingang
  pinMode(stopbutton, INPUT);

  // Start de seriële communicatie
  Serial.begin(9600);

  // Initialiseer de PulseSensor bibliotheek
  pulseSensor.analogInput(PulseWire);
  pulseSensor.setThreshold(Threshold);

  if (pulseSensor.begin()) {
    Serial.println("We created a pulseSensor Object !");
  }
}

void loop() {
  // Lees de BPM-waarde
  int myBPM = pulseSensor.getBeatsPerMinute();

  if (pulseSensor.sawStartOfBeat()) {
    Serial.println("♥  A HeartBeat Happened !");
    Serial.print("BPM: ");
    Serial.println(myBPM);
  }

  if (myBPM > 155) {
    // Speel de melodie voor 2 minuten of totdat de stopknop wordt ingedrukt
    unsigned long startTime = millis();
    stopFlag = false;

    while (millis() - startTime < 120000 && !stopFlag) {
      for (int thisNote = 0; thisNote < sizeof(melody) / sizeof(melody[0]); thisNote++) {
        if (stopFlag) break;

        // Bereken de duur van de noot
        int noteDuration = 1000 / noteDurations[thisNote];
        tone(buzzerPin, melody[thisNote], noteDuration);

        // Wacht een beetje langer dan de duur van de noot
        int pauseBetweenNotes = noteDuration * 1.30;
        unsigned long timer = millis();
        
        while (millis() - timer < pauseBetweenNotes) {
          if (digitalRead(stopbutton) == HIGH) {
            stopFlag = true;
            break;
          }
        }

        // Stop met het spelen van de noot
        noTone(buzzerPin);

        // Lees en druk de BPM-waarde tijdens het afspelen van de melodie
        myBPM = pulseSensor.getBeatsPerMinute();
        if (pulseSensor.sawStartOfBeat()) {
          Serial.println("♥  A HeartBeat Happened !");
          Serial.print("BPM: ");
          Serial.println(myBPM);
        }

        if (stopFlag) break;
      }
    }
  }
  
  // Wacht een beetje voordat de melodie opnieuw begint
  delay(2000);
}




#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.