Thursday, January 19, 2012

Arduino clapper


This is my documentation of the arduino clapper project that I did in June 2011.  I apologize for the poor code readability, I was trying to make something work as quickly as possible.

The code below is old - Click for updated code: 2/2/13

If you have any doubts or something about the code/schematic isn't clear, just comment and I'll try to explain.  Once the concept/code flow becomes clear, it's easy to code.


/*

* Clapper project
* author: Manoj Kunthu
* last update: 6/5/11
*/


int clap = 1;
boolean enabled = true;
int sensorValue = 0;


int SIZE = 25;
int buffer[25];


int now = 0;
int average = 0;
int total = 0;
int offset = 30;
boolean initialized = false;


int out = 10;


const int inPin0 = A0; 
const int clapLed1 = 12;
const int clapLed2 = 11;


const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 3;       // the pin that the LED is attached to


// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button


void setup() {                
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(out, OUTPUT);
  
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  
  pinMode(clapLed1, OUTPUT);
  pinMode(clapLed2, OUTPUT);


  Serial.begin(9600);
}


void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);
  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      buttonPushCounter++;
    } 
  }
  // save the current state as the last state, 
  //for next time through the loop
  lastButtonState = buttonState;


  if (buttonPushCounter % 2 == 0) {
    digitalWrite(ledPin, HIGH);
    
    enabled = true;
  } 
  else {
    digitalWrite(ledPin, LOW);
    digitalWrite(clapLed1, LOW);
    digitalWrite(clapLed2, LOW);
    enabled = false;
  }


  if(enabled){
    sensorValue = analogRead(inPin0); 


    //insert the sensor value into the array
    if(initialized){          
      total = total - buffer[now] + sensorValue;    
    }          
    else{
      total = total + sensorValue;


      if(now + 1 >= SIZE)
        initialized = true;
    }


    //Find the average room noise level
    if(initialized)
      average = (total/SIZE) + offset; 
    else
      average = (total/(now+1)) + offset;
    
    if (sensorValue > average)
    {
      Serial.print(" AVE: ");
      Serial.print(average);
      Serial.print("    Sensor: ");
      Serial.println(sensorValue);
    }


    if (sensorValue > average+30)
    {
      
      digitalWrite(clapLed1, HIGH);
      
      Serial.print(" AVE: ");
      Serial.print(average);
      Serial.print("    Sensor: ");
      Serial.println(sensorValue);
      //clap *= -1;
      Serial.println("---Single req");
      delay(100); 


      int inc;
      for(inc = 0; inc<2000; inc++)
      {
        sensorValue = analogRead(inPin0); 
        //insert the sensor value into the array
        if(initialized){          
          total = total - buffer[now] + sensorValue;    
        }          
        else{
          total = total + sensorValue;


          if(now + 1 >= SIZE)
            initialized = true;
        }


        //Find the average room noise level
        if(initialized)
          average = (total/SIZE) + offset; 
        else
          average = (total/(now+1)) + offset;


        if (sensorValue > average)
        {
          digitalWrite(clapLed2, HIGH);
          Serial.print("--- AVE: ");
          Serial.print(average);
          Serial.print("    Sensor: ");
          Serial.println(sensorValue);
          clap *= -1;
          Serial.println("--------Double Clap");


          if(clap == 1){
            digitalWrite(out, HIGH);   // set the LED on 
          }
          else{
            digitalWrite(out, LOW);   // set the LED off
          }
          delay(1000); 
          break;
        }
        buffer[now] = sensorValue; 
        now = (now+1)%SIZE;
      }
      Serial.println("---Single ack");
      delay(500);
      Serial.println("done");
    }
    buffer[now] = sensorValue; 
    now = (now+1)%SIZE;


    if(average < 0 || average > 800)
    {
      initialized = false;
      
      for(now = 0;now < SIZE; now++)
      {
       buffer[now] = 0;
      }
      
      digitalWrite(out, LOW);
      total = 0;
      now = 0; 
      average =0;
      Serial.print(average);
      Serial.println("RESET");


    }
  }
  else
  {
    digitalWrite(3, LOW);
    Serial.println("disabled ");
  }
  digitalWrite(clapLed1, LOW);
  digitalWrite(clapLed2, LOW);
}

Here's the schematic:
(Note: Vcc in the arduino schematic refers to the 5V supplied from left pin and same with GND)