// EPOCH PROJECT#20: "ACTIVE AND PASSIVE BUZZERS" // IN THIS PROJECT WE'LL LEARN HOW TO USE THE ACTIVE AND PASSIVE BUZZERS // CONNECTIONS: // CONNECT THE ADCK (ANALOG KEYPAD PIN) TO THE A5 ANALOG PIN ON CHIP-A // CONNNECT GPIO PIN#2 ON CHIP-A TO ONE OF THE TWO BUZZER CTRL PINS ON THE LOWER LEFT SIDE OF THE EPOCH. // SET THE BUZZER SELECT JUMER TO SHORT "ACT" OR "PASS" #define buzzer 2 // OUR BUZZER WILL CONNECT TO GPIO PIN#2 ON CHIP-A int time = 0; // WE'RE GOING TO USE THIS INTEGER TO STORE TIME INFORMATION IN OUR PASSIVE() FUNCTION int hold = 0; // WE'LL STORE OUR ANALOG KEYPAD SAMPLING DATA IN THIS INTEGER void setup() { pinMode(buzzer,OUTPUT); // DECLARE OUR BUZZER AS AN OUTPUT } void loop() { hold = analogRead(5); // SAMPLE THE KEYPAD ANALOG DATA, AND PLACE THE RESULT IN hold if(hold > 500) // IF A BUTTON ON THE KEYPAD IS BEING PRESSED, CHECK TO SEE IF IT IS BUTTONS 7 TOUGH 9 AND 0. { active(); // IF SO, CALL THE active() FUNCTION SEEN BELOW } else if(hold > 25) // IF BUTTONS 1-5 ARE BEING PRESSED, CALL THE passive() FUNCTIONS SEEN BELOW. IF THE ADC KEYPAD VALUE IS LESS THAN 25, DO NOTHING. { passive(); // IF HIGHER THAN 25, BUT LOWER THAN 500, CALL THE passive() FUNCTION } } // THIS IS THE END OF VOID LOOP void active() // WHEN THIS FUNCTION IS CALLED, WE SET THE BUZZER OUTPUT TO TURN ON FOR HALF A SECOND, AND THEN OFF FOR HALF A SECOND. MAKE SURE THAT THE "ACT" BUZZER IS SELECTED { digitalWrite(buzzer,HIGH); delay(500); digitalWrite(buzzer,LOW); delay(500); } void passive() // WHEN THIS FUNCTION IS CALLED, WE SET THE BUZZER TO OUTPUT A CONSTANTLY CHANGING SIGNAL WITH VARIED DUCY CYCLE AND FREQUENCY. MAKE SURE THAT THE "ACT" BUZZER IS SELECTED { time = 1000; // SET THE time INTEGER TO 1000 for(int i = 0 ; i <= 1000 ; i++) // THE FOLLOWING for LOOP WILL EXECUTE 100 TIMES { digitalWrite(buzzer,HIGH); // TURN THE BUZZER ON delayMicroseconds(time); // delayMicroseconds() AND delay() WORK SIMILARLY. ONE IS A us (Microsecond delay), while the other is a ms (Millisecond). When we place (time) in the delay value brackets, the value of time will be the delay digitalWrite(buzzer,LOW); // TURN OFF THE BUZZER delayMicroseconds(time); // THIS DELAY IS THE SAME AS THE DELAY ABOVE time = time - 1; // SUBTRACT 1 FROM time. BECAUSE THIS for LOOP EXECUTES 1000 TIMES, THE time DELAY IS ALWAYS CHANGING BECAUSE OF THIS LINE OF CODE } // // LET'S REVERSE THE ORDER OF THINGS NOW. IN THE ABOVE for LOOP, WE STARTED time AT A VALUE OF 1000. NOW WE'LL START IT AT A VALUE OF 0. time = 0; // SET time TO 0 for(int i = 1000 ; i > 0 ; i--) // NOTE THAT THIS TIME THE for STATEMENT WORKDS DIFFERENTLY. ACTUALLY, IT WORKS THE EXACT SAME AS THE for STATEMENT ABOVE. IT JUST OPERATES DIFFERENTLY. WE START i AT 1000, AND USE i-- TO SUBTRACT AFTER EACH LOOP { digitalWrite(buzzer,HIGH); // TURN THE BUZZER ON delayMicroseconds(time); // THE VALUE IN THE time INTEGER IS THE DELAY IN MICROSECONDS. IT STARTS AT 0, AND ENDS AT 1000 WHEN THE for LOOP ENDS digitalWrite(buzzer,LOW); // TURN THE BUZZER OFF delayMicroseconds(time); // THE VALUE IN THE time INTEGER IS THE DELAY IN MICROSECONDS. IT STARTS AT 0, AND ENDS AT 1000 WHEN THE for LOOP ENDS time = time + 1; // THIS TIME WE ADD 1 TO time. ABOVE WE SUBRTACTED 1 FROM time } } // BOOM. DONE. // NOTES // for(int i = 0 ; i <= 1000 ; i++) and for(int i = 1000 ; i > 0 ; i--) both execute 1000 times. They just operate differently. // The first FOR loop starts with i equalling 0, and the loop ends when i is greater or equal to 1000. After every single loop, 1 is added to i (i++). i++ means increment i or i = i + 1 // The second FOR loop starts with i equalling 1000, and the loop ends when i = 0. After every single loop, 1 is subtracted from i (i--). i-- means decrement i, or i = i - 1 // If you don't have the TONE.h library, try downloading it and playing with it. // Also try messing around with the for loops. See if you can generate different sounds!