Making a simple clap switch

A clap switch is a fun project for beginners. It switches on and off electrical appliances with a sound of clapping hands. Today we will discuss about making a simple clap switch that operates when it detects two clapping sounds in a row. It uses an electret microphone as a transducer for converting a clapping sound into an electrical signal. The microcphone output is amplified by a transistor and is then sent to the PIC12F683 microcontroller which performs an ON/OFF switching action when valid claps are detected.

Simple clap switch using a condenser mic and PIC microcontroller

Theory

The clap switch requires a transducer at the input to convert sound vibrations from clapping hands into electrical energy. An electret microphone or simply mic (OBO-04FN-0B) is used for this purpose. The output from the mic is very low in magnitide and so we need an amplifier circuit to boost the detected sound signal. The following circuit diagram shows the mic along with a single transistor amplifier. When there’s no sound, the collector voltage (Vout) of the transistor, which is saturated, is approximately 0.2V. When the mic detects a clap sound, the voltage across it drops suddenly. Since the condenser mic’s output voltage is coupled to the base of the transistor through capacitor C1, the base-emitter voltage is also lowered and as such the base-emitter junction is less forward biased or cutoff (in case of high clap sound). Therefore, every time a clapping sound is detected, there is a sudden peak arising at the collector voltage.

Sensor part

Clap sensor setup on breadboard

The following picture shows the peaks in the collector voltage due to multiple clap sounds. You can see the peak voltage can go as high as 4.0V depending on the loudness of the clap. This waveform of the collector voltage is captured using Digilent’s Analog Discovery device.

Peaks in Vout due to clapping sound

Now we know how to convert a clap sound into an electrical signal. The next stage is to feed this signal to PIC12F683 microcontroller for switching actions. The PIC12F683 microcontroller has got a built-in comparator module that can be used to compare two analog voltages and obtain a digital indication of their relative magnitudes.  The comparator module can operate in eight different modes based on CM2-CM0 bit settings in the CMCON0 register. For our purpose, we will configure it as:

CIN- pin is configured as analog, CIN+ pin is configured as I/O, COUT pin is configured as I/O, Comparator output available internally, CVREF is non-inverting input (see picture below).

Configuring the internal comparator module of PIC12F683

We will compare the collector output voltage (Vout) against an internally generated reference voltage. The reference voltage is internally connected to the positive input (CIN+) of the comparator module, while the output voltage from the transducer is fed to the negative input (CIN-) of the comparator. The CIN- pin is multiplexed with GP1 I/O pin of PIC12F683. The magnitude of reference voltage is programmable and controlled through VRCON register. We will set the reference voltage to 0.625V (assuming the supply voltage is 5.0V). So, under normal condition the reference voltage (0.625V) is greater than Vout (=0.2V) and the comparator output (COUT) is high. COUT is accessible internally as well as externally through GP2 I/O pin. When there is a clap sound, COUT will go low. The comparator output logic can be inverted by setting the comparator output inversion (CIN) bit in the CMCON0 register. The PIC12F683 microcontroller can be programmed to take switching actions based on the comparator output.

Circuit diagram

The complete circuit diagram of this simple clap switch project is shown below. The positive and negative inputs of the internal comparator module are externally accessible through GP0/CIN+ and GP1/CIN- pins, respectively. Since, the positive input is connected to the internal reference voltage source, GP1 pin can be used as a I/O pin. The output from the transducer amplifier goes to GP0/CIN+ pin. An LED is connected to GP5 pin to indicate the switching action of the microcontroller. When the microcontroller detects two clapping sound in a row, it toggles the logic output at GP5 pin. The LED is used here for illustrative purpose and it can be replaced with an electromechanical relay if you want to control an electrical appliance with it.

Complete circuit diagram of the clap switch

Circuit setup on breadboard

Software

The program is developed in C and compiled with MikroC Pro for PIC compiler. The program continuously looks for two clapping sounds in a row withing 1.5 sec interval. If that happens then GP5 pin is toggled. When a clap is detected, Timer1 module is turned on to keep record of time. It generates a Time Out signal after 1.5 seconds. If there’s no second clap before that, the microcontroller ignores the first clap, and returns to the main program.

/*
 Project: Making a simple clap switch
 Description : Clap switch using built-in comparator module
               of PIC12F683
 MCU: PIC12F683
 Oscillator: Internal 4.0000 MHz, MCLR Disabled, PWRT ON enabled
 Written by: Rajendra Bhatt (www.embedded-lab.com)
 Date:       Nov 21, 2012
*/
 
sbit Output_LED at GP5_bit;
unsigned short i, TIME_UP;
 
void interrupt(void){
  if(PIR1.TMR1IF) {
    i ++;
    if(i == 3) TIME_UP = 1;  // Time Up in 1.5 sec
    PIR1.TMR1IF = 0;
 }
}
 
void main() {
  TRISIO = 0b00000011 ;
  ANSEL = 0x00;
  INTCON = 0b11000000 ; // Enable GIE and PEIE for Timer1 overflow interrpt
  PIE1 = 0b00000001 ;   // Enable TMR1IE
 
  // Configure Comparator module
  // CIN- pin is configured as analog,
  // CIN+ pin is configured as I/O,
  // COUT pin is configured as I/O,
  // Comparator output available internally,
  // CVREF is non-inverting input
  // CINV is set to 1
  CMCON0 = 0b00010100;
  VRCON  = 0b10100011;  // Vref is set to VDD/8
  Output_LED = 0;
  do{
     TMR1H = 0x00;
     TMR1L = 0x00;
     TIME_UP = 0;
     i = 0;
     T1CON = 0b00110000;   // Configure Timer 1
     if(CMCON0.COUT){      // First clap detected
       Delay_ms(100);
       T1CON.TMR1ON = 1;   // Start Timer1
       while(!CMCON0.COUT && !TIME_UP); // Wait until second clap is
       T1CON.TMR1ON = 0;                      // detected or Timer1 overflows
       if(CMCON0.COUT && !TIME_UP) Output_LED = ~Output_LED;
       Delay_ms(100);
     }
  }  while(1);
}

Download mikroC source and HEX files

Output

Watch the following video to see the clap switch in action. It has been tested with clapping made at 10 feet away and found operating well.

Related Posts

49 comments

Leave a Reply

Your email address will not be published. Required fields are marked *