I made a clap light switch to control my room lights and ground LEDs, and it works perfectly but when ever I have both the LEDs and the lights on it kinda stops working.
I use two claps for the lights and three for the LEDs.
Does anyone know what could be wrong? here is my code.
/* DEFINE PINS */
const int buzzer = 2;
const int micPin = 0;
const int relayLED = 9;
const int relayLights = 8;
const int sampleWindow = 50;
const int N = 50;
unsigned int sample;
boolean lights = false; //lighs on or off
boolean leds = false; //leds on or off
double soundArray[N]; //array to check claps
int i = 0;
int clapsCount = 0;
void setup() {
pinMode(relayLED, OUTPUT);
pinMode(relayLights, OUTPUT);
digitalWrite(relayLED, HIGH);
digitalWrite(relayLights, HIGH);
}
void loop() {
/* gets 50 constant sound sample and resets */
if (i<N) {
soundArray[i] = getVolts();
i++;
} else {
i = 0;
}
if (i == N-1) {
clapsCount = clapCount(soundArray);
}
/* if 2 claps detected do this */
if (clapsCount == 2) {
if (lights == false) {
turnOnLights();
lights = true;
} else {
turnOffLights();
lights = false;
}
playSound();
clapsCount = 0;
}
/* if 3 claps detected do this */
if (clapsCount == 3) {
if (leds == false) {
turnOnLeds();
leds = true;
} else {
turnOffLeds();
leds = false;
}
playSound();
clapsCount = 0;
}
}
int clapCount(double soundArray[]) {
int claps = 0;
for (int j=0; j<N; j++) {
if (soundArray[j] > 3.0 && soundArray[j] < 3.5) {
claps++;
}
}
return claps;
}
void turnOnLights() {
digitalWrite(relayLights, LOW);
}
void turnOffLights() {
digitalWrite(relayLights, HIGH);
}
void turnOnLeds() {
digitalWrite(relayLED, LOW);
}
void turnOffLeds() {
digitalWrite(relayLED, HIGH);
}
/* gets mic volts */
double getVolts() {
unsigned long startMillis= millis(); // Start of sample window
unsigned int peakToPeak = 0; // peak-to-peak level
unsigned int signalMax = 0;
unsigned int signalMin = 1024;
// collect data for 50 mS
while (millis() - startMillis < sampleWindow)
{
sample = analogRead(micPin);
if (sample < 1024) {
if (sample > signalMax) {
signalMax = sample; // save just the max levels
}
else if (sample < signalMin) {
signalMin = sample; // save just the min levels
}
}
}
peakToPeak = signalMax - signalMin; // max - min = peak-peak amplitude
double volts = (peakToPeak * 5.0) / 1024; // convert to volts
return volts;
}
void playSound() {
tone(buzzer, 1000);
delay(100);
tone(buzzer, 500);
delay(100);
noTone(buzzer);
}