@@ -13,9 +13,10 @@ void Buzzer::begin() {
1313 pinMode (buzzer1Pin, OUTPUT );
1414 pinMode (buzzer2Pin, OUTPUT );
1515
16- patternActive = false ;
17- currentStep = 0 ;
18- nextStepTime = 0 ;
16+ buzzer1PatternActive = false ;
17+ buzzer2PatternActive = false ;
18+ lastBuzzer1Ring = false ;
19+ lastBuzzer2Ring = false ;
1920
2021 stop ();
2122}
@@ -24,15 +25,21 @@ void Buzzer::setVolume(int vol) {
2425 volume = constrain (vol, 0 , 100 );
2526}
2627
27- void Buzzer::drive (uint16_t duration_ms , uint16_t freq) {
28+ void Buzzer::drive (uint16_t buzzerNum , uint16_t freq) {
2829 if (volume == 0 ) {
2930 stop ();
3031 return ;
3132 }
3233
33- // Max loudness: Push-pull (one pin HIGH, one pin LOW)
34- digitalWrite (buzzer1Pin, HIGH );
35- digitalWrite (buzzer2Pin, LOW );
34+ // Drive pins independently
35+ if (buzzerNum == 1 ) {
36+ digitalWrite (buzzer1Pin, HIGH );
37+ Serial.println (" -> B1 HIGH" );
38+ }
39+ else if (buzzerNum == 2 ) {
40+ digitalWrite (buzzer2Pin, HIGH );
41+ Serial.println (" -> B2 HIGH" );
42+ }
3643}
3744
3845void Buzzer::stop () {
@@ -41,36 +48,63 @@ void Buzzer::stop() {
4148}
4249
4350void Buzzer::playTone (BuzzerTone tone) {
44- patternActive = true ;
45- patternStartTime = millis ();
46- currentStep = 0 ;
47-
51+ startPattern (1 , tone);
52+ }
53+
54+ void Buzzer::startPattern (int buzzerNum, BuzzerTone tone) {
55+ int steps = 1 ;
4856 switch (tone) {
49- case TONE_CONFIRM : totalSteps = 1 ; break ; // 1 beep
50- case TONE_WARNING : totalSteps = 3 ; break ; // Beep, Sil, Beep
51- case TONE_ERROR : totalSteps = 5 ; break ; // Beep, Sil, Beep, Sil, Beep
52- case TONE_EMERGENCY : totalSteps = 19 ; break ; // Rapid pulses
57+ case TONE_CONFIRM : steps = 1 ; break ;
58+ case TONE_WARNING : steps = 3 ; break ;
59+ case TONE_ERROR : steps = 5 ; break ;
60+ case TONE_EMERGENCY : steps = 19 ; break ;
61+ }
62+
63+ if (buzzerNum == 1 ) {
64+ Serial.println (" -> B1 Pattern Start" );
65+ buzzer1PatternActive = true ;
66+ buzzer1Step = 0 ;
67+ buzzer1TotalSteps = steps;
68+ buzzer1NextStepTime = millis ();
69+ } else {
70+ Serial.println (" -> B2 Pattern Start" );
71+ buzzer2PatternActive = true ;
72+ buzzer2Step = 0 ;
73+ buzzer2TotalSteps = steps;
74+ buzzer2NextStepTime = millis ();
5375 }
54- nextStepTime = millis ();
5576}
5677
5778void Buzzer::update () {
58- if (!patternActive) return ;
59-
60- if (millis () >= nextStepTime) {
61- // Step logic: Even steps are ON, Odd steps are OFF
62- if (currentStep % 2 == 0 ) {
63- drive (0 , 0 ); // Sound ON
64- nextStepTime = millis () + 150 ; // Duration 150ms
79+ // Update Buzzer 1
80+ if (buzzer1PatternActive && millis () >= buzzer1NextStepTime) {
81+ if (buzzer1Step % 2 == 0 ) {
82+ drive (1 , 0 );
83+ buzzer1NextStepTime = millis () + 150 ;
6584 } else {
66- stop (); // Sound OFF
67- nextStepTime = millis () + 100 ; // Gap 100ms
85+ digitalWrite (buzzer1Pin, LOW );
86+ buzzer1NextStepTime = millis () + 100 ;
87+ }
88+ buzzer1Step++;
89+ if (buzzer1Step >= buzzer1TotalSteps) {
90+ digitalWrite (buzzer1Pin, LOW );
91+ buzzer1PatternActive = false ;
6892 }
93+ }
6994
70- currentStep++;
71- if (currentStep >= totalSteps) {
72- stop ();
73- patternActive = false ;
95+ // Update Buzzer 2
96+ if (buzzer2PatternActive && millis () >= buzzer2NextStepTime) {
97+ if (buzzer2Step % 2 == 0 ) {
98+ drive (2 , 0 );
99+ buzzer2NextStepTime = millis () + 150 ;
100+ } else {
101+ digitalWrite (buzzer2Pin, LOW );
102+ buzzer2NextStepTime = millis () + 100 ;
103+ }
104+ buzzer2Step++;
105+ if (buzzer2Step >= buzzer2TotalSteps) {
106+ digitalWrite (buzzer2Pin, LOW );
107+ buzzer2PatternActive = false ;
74108 }
75109 }
76110}
@@ -79,47 +113,34 @@ void Buzzer::controlFromFirebase(bool buzzer01ring, bool buzzer02ring, int buzze
79113 if (buzzersound != lastVolume) {
80114 lastVolume = buzzersound;
81115 setVolume (buzzersound);
82-
83- Serial.print (" Buzzer volume set to: " );
84- Serial.print (buzzersound);
85- Serial.println (" %" );
116+ Serial.printf (" Buzzer volume: %d%%\n " , buzzersound);
86117 }
87118
88- if (buzzer01ring) {
89- if (!buzzer1Active) {
90- buzzer1Active = true ;
91- playTone (TONE_CONFIRM );
92- }
93- } else {
94- buzzer1Active = false ;
119+ if (buzzer01ring && !lastBuzzer1Ring) {
120+ startPattern (1 , TONE_CONFIRM );
95121 }
122+ lastBuzzer1Ring = buzzer01ring;
96123
97- if (buzzer02ring) {
98- if (!buzzer2Active) {
99- buzzer2Active = true ;
100- playTone (TONE_EMERGENCY );
101- }
102- } else {
103- buzzer2Active = false ;
124+ if (buzzer02ring && !lastBuzzer2Ring) {
125+ startPattern (2 , TONE_EMERGENCY );
104126 }
127+ lastBuzzer2Ring = buzzer02ring;
105128}
106129
107130void Buzzer::singleBeep () {
108- playTone ( TONE_CONFIRM );
131+ startPattern ( 1 , TONE_CONFIRM );
109132}
110133
111134void Buzzer::doubleBeep () {
112- patternActive = true ;
113- patternStartTime = millis ();
114- currentStep = 0 ;
115- totalSteps = 3 ; // On, Off, On
116- nextStepTime = millis ();
135+ buzzer1PatternActive = true ;
136+ buzzer1Step = 0 ;
137+ buzzer1TotalSteps = 3 ;
138+ buzzer1NextStepTime = millis ();
117139}
118140
119141void Buzzer::tripleBeep () {
120- patternActive = true ;
121- patternStartTime = millis ();
122- currentStep = 0 ;
123- totalSteps = 5 ; // On, Off, On, Off, On
124- nextStepTime = millis ();
142+ buzzer1PatternActive = true ;
143+ buzzer1Step = 0 ;
144+ buzzer1TotalSteps = 5 ;
145+ buzzer1NextStepTime = millis ();
125146}
0 commit comments