Programming Question: Stop a Piep Tone

Hi Guys, i need a bit help with my source code.

During my study I have to build a clock with alarm function based on Arduino.

The problem is, that the alarm piep tone can't be interrupted by pressing any of my bottons.

The user should stop the alarm tone by pressing the main button.

To realise this, i use a loop function:

//Realization of alarm tone
// houruser is the variable for adjusted hours of the user
// minuteuser is the variable for adjusted minutes of the user
// r is the current clock time of the DCF77 time receiver (hours)
//m is the current clock time of the DCF77 time receiver (minutes)
//weckerOnOff==2 means that the alarm is activated by the user
// the 2 piezo buzzers are connected to pin 26 and 27

if((houruser == r && weckerOnOff == 2 && minuteuser == m) || ((houruser+12) ==r && minuteuser == m && weckerOnOff == 2))
{

for( int i=0 ; i<1000 ; i++){

digitalWrite(26, HIGH);
digitalWrite(27, HIGH);
delayMicroseconds(500);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
delayMicroseconds(500);
}

delay(500);
}

// I already tried a while loop with boolean== true or boolean== false to stop the for-loop, but it did not work...

//Thank you for helping =)

Hi,

Can you edit your entire post using code tags?
They are made with the </> icon in the reply Menu.
See section 7 http://forum.arduino.cc/index.php/topic,148850.0.html

I'd not sure but all those delays will not help as they block any program progress while delaying.

Tom..... :slight_smile:

   //Realization of alarm tone
  // houruser is the variable for adjusted hours of the user
  // minuteuser is the variable for adjusted minutes of the user
  // r is the current clock time of the DCF77 time receiver (hours)
  //m is the current clock time of the DCF77 time receiver (minutes)
  //weckerOnOff==2 means that the alarm is activated by the user
  // the 2 piezo buzzers are connected to pin 26 and 27
           
           


 if((houruser == r && weckerOnOff == 2 && minuteuser == m) || ((houruser+12) ==r              && minuteuser == m && weckerOnOff == 2))
            {
           
           
            for( int i=0 ; i<1000 ; i++){
           
             
            digitalWrite(26, HIGH);
            digitalWrite(27, HIGH);
            delayMicroseconds(500);
            digitalWrite(26, LOW);
            digitalWrite(27, LOW);
            delayMicroseconds(500);
            }
         
       
            delay(500);
}
for( int i=0 ; i<1000 ; i++)
{       
    digitalWrite(26, HIGH);
    digitalWrite(27, HIGH);
    delayMicroseconds(500);
    digitalWrite(26, LOW);
    digitalWrite(27, LOW);
    delayMicroseconds(500);
}

Does this add up to 0.01 seconds?

You either need to check for the button press inside this loop and break; out when its HIGH. Failing that, you need to set up an interrupt.

I already tried this one but it didn't work.

The button is connected to Pin22 and the loop should be canceled by reading the input with function digitalRead();

if((houruser == r && weckerOnOff == 2 && minuteuser == m) || ((houruser+12) == r  && minuteuser == m && weckerOnOff == 2))
            {
            
            
            for( int i=0 ; i<1000 ; i++){
           
             
            digitalWrite(26, HIGH);
            digitalWrite(27, HIGH);
            delayMicroseconds(500);
            digitalWrite(26, LOW);
            digitalWrite(27, LOW);
            delayMicroseconds(500);
            
            if(digitalRead(22)==HIGH){break;}
            } 
         
       
            delay(500);
}}

I'm not convinced the loops the issue, like I said, doesn't it come to 0.01 seconds? I think its getting into that loop each time the main program loops.

But I have no way of finding out, because you've still not posted ALL of your code.

It doesn't end up in 0,01 seconds. Its a piep tone that pieps for 0,5 seconds. If i hit the button it doesn't interrupt.

This is my source for the source code of the piep tone:

Here you can read my complete source code.

PIN/LED-Belegung
================

PIN 01 Vorbelegt
PIN 02 DCF-77
PIN 03 Nicht belegt
PIN 04 Eins
PIN 05 Zwei
PIN 06 Drei
PIN 07 Vier
PIN 08 Fuenf
PIN 09 Sechs
PIN 10 Sieben
PIN 11 Acht
PIN 12 Neun
PIN 13 Zehn
PIN 14 Elf
PIN 15 Zwo
PIN 16 Fuenf
PIN 17 Zehn
PIN 18 Viertel
PIN 19 Vor 
PIN 20 Halb
PIN 21 Nach
PIN 22 Taster 1 (Alarm On/Off)
PIN 23 Taster 2(Stunde +1)
PIN 24 Taster 3 (Minute +15)
PIN 25 Taster 4 (Snooze On/Off)
PIN 26 Piezo 1
PIN 27 Piezo 2
PIN 28 Alarm
PIN 29 Snooze
PIN 30 LED-Band
PIN 31 Taster 5 (Ambiente-Light On/Off)


*/

#include <DCF77.h>       //https://github.com/thijse/Arduino-Libraries/downloads
#include <Time.h>        //http://www.arduino.cc/playground/Code/Time

#define DCF_PIN 2         // Connection pin to DCF 77 device
#define DCF_INTERRUPT 0 // Interrupt number associated with pin

time_t prevDisplay = 0;          // when the digital clock was displayed
time_t time;
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT);

int button2State=0;
int button2StateHIGH=0;
int button3State=0;
int button3StateHIGH=0;
int button4State=0;
int button4StateHIGH=0;
int button5State=0;
int button5StateHIGH=0;
int button6State=0;
int button6StateHIGH=0;

int weckerOnOff=0;

int backlight=0;

int houruser=1;
int minuteuser=0;

int LEDBand=0;


/* ======================================================================================= */

void setup() {
  Serial.begin(9600); 
  DCF.Start();
  setSyncInterval(30);
  setSyncProvider(getDCFTime);
 
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
  pinMode(14,OUTPUT);
  pinMode(15,OUTPUT);
  pinMode(16,OUTPUT);
  pinMode(17,OUTPUT);
  pinMode(18,OUTPUT);
  pinMode(19,OUTPUT);
  pinMode(20,OUTPUT);
  pinMode(21,OUTPUT);
  
  //Pins für Piezo und Taster und Alarm/Snooze
  
  pinMode(22, INPUT);   //Taster 1
  pinMode(23, INPUT);   //Taster 2
  pinMode(24, INPUT);   //Taster 3
  pinMode(25, INPUT);   //Taster 4
  pinMode(26, OUTPUT);  //Piezo-Lautsprecher1
  pinMode(27, OUTPUT);  //Piezo-Lautsprecher2
  pinMode(28, OUTPUT);  //LED für Alarm On 
  pinMode(29, OUTPUT);  //LED für Snooze
  pinMode(30, OUTPUT);  //LED-Band
  pinMode(31, INPUT);   //Taster 5

  // DCF77 initialisieren
  Serial.println("Warte auf Zeit von DCF77 ... ");
  Serial.println("Dies wird mindestens 2 Minuten in Anspruch nehmen. Bitte warten.");
  while(timeStatus()== timeNotSet) { 
     // warten auf erstes Sync-Signal
     Serial.print(".");
     delay(2000);}
}

/* ======================================================================================= */

void loop() {  
  if( now() != prevDisplay) //update the display only if the time has changed
  {
    prevDisplay = now();
    digitalClockDisplay();  
  }
  //if (Serial.available() > 0) { //"wenn ein Datenpaket geliefert wird"
    
      Serial.println(hour());
      Serial.println(minute());
                 
      
  //Uhranzeige nur wenn Wecker aktiviert/deaktiviert ist, nicht im Einstellmenü
  
  if(weckerOnOff == 0 || weckerOnOff == 2)
    { 
    hourLEDs(whichHour(hour(), minute()));
    minuteLEDs(minute());
    }
    
       if(weckerOnOff == 0 || weckerOnOff == 1)
       {
    
            digitalWrite(28, LOW);
            digitalWrite(29, LOW);
                                     }
  
       if(weckerOnOff == 2){
    
            digitalWrite(28, HIGH);    //LED für "Alarm On" anschalten 
 
                            } 
   
   
   
   Serial.flush(); //seriellen Puffer löschen
    
    
// Taster werden als Input ständig ausgelesen
  
  button2State= digitalRead(22);
  button3State= digitalRead(23);
  button4State= digitalRead(24);
  button5State= digitalRead(25);
  button6State= digitalRead(31);
  




  
// Programmierung für KNOPF 1________________________________
  
  if(button2State==HIGH)
  {
   button2StateHIGH=1;
  }
  
  if(button2State == LOW & button2StateHIGH == 1)
 {
 weckerOnOff++;
 button2StateHIGH=0; 
 } 
 
 // Programmierung für LED-Band__________________________
 
   if(button6State==HIGH)
  {
   button6StateHIGH=1;
  }
  
  if(button6State == LOW & button6StateHIGH == 1)
 {
  LEDBand++;
  
  if(LEDBand==1){digitalWrite(30,HIGH);}
  
  if(LEDBand==0){digitalWrite(30,LOW);}
  if(LEDBand > 1){LEDBand = 0;}
  
 } 
 
 
 
 
 
 
  
// Programmierung für KNOPF 4 (SNOOZE-FUNKTION)_______________________________
  
  if(button5State==HIGH)
  {
   button5StateHIGH=1;
  }
  
  if(button5State == LOW & button5StateHIGH == 1)
 {
   if(minuteuser >= 45){
   houruser++; }
   
   
   weckerOnOff=0;
   minuteuser= minuteuser+15;
   weckerOnOff=2;
   digitalWrite(29, HIGH);
   
   button5StateHIGH=0; 
 } 
 
 if(weckerOnOff > 2)
 weckerOnOff=0;
 
//__________________________________________________________

//Programmierung für KNOPF 2________________________________
 
        if(weckerOnOff == 1) {
      

        if(button3State == HIGH)
              {
              button3StateHIGH=1;
              } 
   
        if(button3State == LOW & button3StateHIGH == 1)
             {
             houruser++;
             button3StateHIGH= 0;  
             }
     
        if(houruser > 12)
             {
             houruser=1;
             }
  
             Serial.println(houruser);

The code was too long for one post..

//Programmierung für KNOPF 3_______________________________
 
    

         if(button4State == HIGH)
             {
             button4StateHIGH=1;
             } 
   
         if(button4State == LOW & button4StateHIGH == 1)
             {
             minuteuser = minuteuser+5;
             button4StateHIGH= 0;  
             }
     
         if(minuteuser > 55)
             {
             minuteuser=0;
             }
  
         Serial.println(minuteuser); 
       
//Ausgabe der leuchtenden LED für Einstellugung der Weckzeit (STUNDEN)

          for (int x = 4; x < 21; x++)
            { 
            digitalWrite(x,LOW);    // Es werden alle LEDs, welche die Stundenanzeigen vorsorglich auf LOW gesetzt.
            }  


        if(houruser == 1   && minuteuser == 0  )      {digitalWrite(4, HIGH);                                                                                  //Eins
             for(int x = 4; x < 21; x++){
              if(x==4){x++;}digitalWrite(x,LOW);}}
        if(houruser == 1   && minuteuser == 5  )      {digitalWrite(4, HIGH); digitalWrite(21, HIGH); digitalWrite(16, HIGH);                                  //5 nach Eins
             for(int x = 4; x < 21; x++){
              if(x==4){x++;}if(x==16){x++;}if(x==21){x++;}digitalWrite(x,LOW);}} 
        if(houruser == 1   && minuteuser == 10  )      {digitalWrite(4, HIGH); digitalWrite(21, HIGH); digitalWrite(17, HIGH);                                 //10 nach Eins
             for(int x = 4; x < 21; x++){
              if(x==4){x++;}if(x==17){x++;}if(x==21){x++;}digitalWrite(x,LOW);}}                
        if(houruser == 1   && minuteuser == 15 )      {digitalWrite(4, HIGH); digitalWrite(21, HIGH); digitalWrite(18, HIGH);                                  //Viertel nach Eins
            for(int x = 4; x < 21; x++){
              if(x==4){x++;}if(x==21){x++;}if(x==18){x++;}digitalWrite(x,LOW);}}
        if(houruser == 1   && minuteuser == 20 )      {digitalWrite(5, HIGH); digitalWrite(17, HIGH); digitalWrite(19, HIGH);digitalWrite(20, HIGH);            //10 vor halb Zwei
            for(int x = 4; x < 21; x++){
              if(x==5){x++;}if(x==17){x++;}if(x==19){x++;}if(x==20){x++;}digitalWrite(x,LOW);}}
        if(houruser == 1   && minuteuser == 25 )      {digitalWrite(5, HIGH); digitalWrite(16, HIGH); digitalWrite(19, HIGH);digitalWrite(20, HIGH);            //5 vor halb Zwei
            for(int x = 4; x < 21; x++){
              if(x==5){x++;}if(x==16){x++;}if(x==19){x++;}if(x==20){x++;}digitalWrite(x,LOW);}}
        if(houruser == 1   && minuteuser == 30 )      {digitalWrite(5, HIGH); digitalWrite(20, HIGH);                                                           //Halb 2
            for(int x = 4; x < 21; x++){
              if(x==5){x++;}if(x==20){x++;}digitalWrite(x,LOW);}}
        if(houruser == 1   && minuteuser == 35 )      {digitalWrite(5, HIGH); digitalWrite(16, HIGH); digitalWrite(20, HIGH);digitalWrite(21, HIGH);            //5 nach halb Zwei
            for(int x = 4; x < 21; x++){
              if(x==5){x++;}if(x==16){x++;}if(x==20){x++;}if(x==21){x++;}digitalWrite(x,LOW);}}
        if(houruser == 1   && minuteuser == 40 )      {digitalWrite(5, HIGH); digitalWrite(17, HIGH); digitalWrite(20, HIGH);digitalWrite(21, HIGH);            //10 nach halb Zwei
            for(int x = 4; x < 21; x++){
              if(x==5){x++;}if(x==17){x++;}if(x==20){x++;}if(x==21){x++;}digitalWrite(x,LOW);}}
        if(houruser == 1   && minuteuser == 45 )      {digitalWrite(5, HIGH); digitalWrite(18, HIGH); digitalWrite(19, HIGH);                                   //Viertel vor Zwei
            for(int x = 4; x < 21; x++){
              if(x==5){x++;}if(x==18){x++;}if(x==19){x++;}digitalWrite(x,LOW);}}
        if(houruser == 1   && minuteuser == 50 )      {digitalWrite(5, HIGH); digitalWrite(17, HIGH); digitalWrite(19, HIGH);                                   //10 vor Zwei
            for(int x = 4; x < 21; x++){
              if(x==5){x++;}if(x==17){x++;}if(x==19){x++;}digitalWrite(x,LOW);}}
        if(houruser == 1   && minuteuser == 55 )      {digitalWrite(5, HIGH); digitalWrite(16, HIGH); digitalWrite(19, HIGH);                                   //5 vor Zwei
            for(int x = 4; x < 21; x++){
              if(x==5){x++;}if(x==16){x++;}if(x==19){x++;}digitalWrite(x,LOW);}}
        if(houruser == 2   && minuteuser == 0  )      {digitalWrite(5, HIGH);                                                                                   //Zwei  
            for(int x = 4; x < 21; x++){
              if(x==5){x++;}digitalWrite(x,LOW);}}    
              
        


        }

  
      
  //}
  
  //Programmierung: Knopf für Ambiente Light ON/OFF_____________________________________


   if(button6State==HIGH)
  {
   button2StateHIGH=1;
  }
  
  if(button6State == LOW & button6StateHIGH == 1)
 {
 backlight++;
 
 if(backlight == 1){
   digitalWrite(30, HIGH);  }
   
 if(backlight == 0){
   digitalWrite(30,LOW);}
 
 
 if(backlight > 1){
    backlight=0;  }
    
    
    
 button2StateHIGH=0; 
 } 
 
  
  }


/* ======================================================================================= */

void digitalClockDisplay(){

  // digital clock display of the time

 //     Serial.print(hour());
 //     printDigits(minute());
 //     printDigits(second());
 //     Serial.print(" ");
 //     Serial.print(day());
//      Serial.print(" ");
//      Serial.print(month());
//      Serial.print(" ");
//      Serial.print(year()); 
//      Serial.println(); 
}

/* -------------------------------------------------------------------------------------- */

// STUNDEN

// Funktion, um die richtige Stunde anzeigen zu lassen
// wenn Minute > 17, dann auf spätere Stunde schalten
int whichHour(int hour, int minute) {
  int result;
  if (minute > 17) {
    Serial.println("Minute ist groesser als 17, daher hoehere Stunden-LED.");
    result = hour + 1;
  }
  else {
    Serial.println("Minute ist kleiner/gleich 17, daher normale Stunden-LED.");
    result = hour;
  }
  return result;
}

3rd part...

// Stunden-LED-an/aus-Funktion
void hourLEDs(int hourLEDon) {
  

int m = minute();
int r = hour(); // für r kann auch eine Zahl, welche für die Stunden steht eingeben.    


    
    for (int x = 4; x < 16; x++){ // Es werden alle LEDs, welche die Stundenanzeigen vorsorglich auf LOW gesetzt.
      digitalWrite(x,LOW);
    }  
      
  
        if (r>12 && (r <=24)) // Das 24 Stundenformat wird in eine 12 Stundenformat umgerechnet
        {   
          r=r-12; 
        }
      
              if (r<12 && (m <17)) {
               digitalWrite((r+3), HIGH); 
              }          
              if (r==12 && (m >17)) {
               digitalWrite((4), HIGH); // 
              }
            
             if (r==12 && (m <17)) { 
              digitalWrite((r+3), HIGH);
              digitalWrite((r+4), HIGH);
             }
             
             if (r==11 && (m >17)) { 
              digitalWrite((r+3), HIGH);
              digitalWrite((r+4), HIGH);
             } 
             
            if (r<12 && (m >17)){ 
             digitalWrite((r+4), HIGH);
            }
            
            //BEEP-Ton ausgeben falls Wecker aktiviert und Weckzeit=Uhrzeit!
           
            if((houruser == r && weckerOnOff == 2 && minuteuser == m) || ((houruser+12) == r  && minuteuser == m && weckerOnOff == 2))
            {
            
            
            for( int i=0 ; i<1000 ; i++){
           
             
            digitalWrite(26, HIGH);
            digitalWrite(27, HIGH);
            delayMicroseconds(500);
            digitalWrite(26, LOW);
            digitalWrite(27, LOW);
            delayMicroseconds(500);
            
            if(digitalRead(22)==HIGH){break;}
            } 
         
       
            delay(500);
}}
        

/* -------------------------------------------------------------------------------------- */

// MINUTEN

void minuteLEDs(int min) {
  
  for (int x = 16; x < 22; x++) {
    digitalWrite(x, LOW);
  }
  
  if(min> 2 && min< 8) {digitalWrite(16, HIGH); digitalWrite(21, HIGH);}                          //  5 nach
  if(min> 7 && min<13) {digitalWrite(17, HIGH); digitalWrite(21, HIGH);}                          // 10 nach
  if(min>12 && min<18) {digitalWrite(18, HIGH); digitalWrite(21, HIGH);}                          // viertel nach
  if(min>17 && min<23) {digitalWrite(17, HIGH); digitalWrite(19, HIGH); digitalWrite(20, HIGH);}  // 10 vor  halb
  if(min>22 && min<28) {digitalWrite(16, HIGH); digitalWrite(19, HIGH); digitalWrite(20, HIGH);}  //  5 vor  halb
  if(min>27 && min<33) {digitalWrite(20, HIGH);}                                                  //         halb 
  if(min>32 && min<38) {digitalWrite(16, HIGH); digitalWrite(21, HIGH); digitalWrite(20, HIGH);}  //  5 nach halb 
  if(min>37 && min<43) {digitalWrite(17, HIGH); digitalWrite(21, HIGH); digitalWrite(20, HIGH);}  // 10 nach halb
  if(min>42 && min<48) {digitalWrite(18, HIGH); digitalWrite(19, HIGH);}                          // viertel vor
  if(min>47 && min<53) {digitalWrite(17, HIGH); digitalWrite(19, HIGH);}                          // 10 vor
  if(min>52 && min<58) {digitalWrite(16, HIGH); digitalWrite(19, HIGH);}                          //  5 vor
}

/* -------------------------------------------------------------------------------------- */


 
    
 

  

// DCF77-Funktionen (unveraendert)

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

unsigned long getDCFTime()
{ 
  time_t DCFtime = DCF.getTime();
  // Indicator that a time check is done
  if (DCFtime!=0) {
    Serial.print("X");  
  }
  return DCFtime;
}

Everywhere where you have these :

if (button2State == LOW & button2StateHIGH == 1)

Needs changing to this:

if (button2State == LOW && button2StateHIGH == 1)

Unlikely to fix your issue, but you want a logical and, not a bitwise and.

Also try this:

for ( int i = 0 ; i < 1000 ; i++) 
{
  digitalWrite(26, HIGH);
  digitalWrite(27, HIGH);
  delayMicroseconds(500);
  digitalWrite(26, LOW);
  digitalWrite(27, LOW);
  delayMicroseconds(500);

  if (digitalRead(22) == HIGH) 
  {
    weckerOnOff = 0;
    break;
  }
}

We present you the machine of the day: tammytam.

You're an Arduino-God. It works !!!!!!

THANK YOU !!!! :slight_smile: