Go Down

Topic: led drum lights (Read 1 time) previous topic - next topic


I want to build an led drum light similar to this one http://www.youtube.com/watch?v=HdgNQ_hs-G4 . I am new to the arduino. I have a piezo attached to analog pin A0. I tried to combine the array example sketch with the knock sensor sketch. I was eventually able to get the array to work with the piezo but it goes through the whole array when the piezo is greater than the threshold,
How would i increment the array pointer +\- 1 one time per event ?  Or is there an easier way to do this ?



How would i increment the array pointer +\- 1 one time per event ?

What array pointer?

How do you define an event?
The art of getting good answers lies in asking good questions.


Dec 21, 2011, 08:58 pm Last Edit: Dec 21, 2011, 09:37 pm by DVDdoug Reason: 1
I'm going to guess you need a delay (maybe 100ms ?), assuming your code is otherwise OK.   Of course, the drum-hit doesn't make a nice single digital pulse, and you are going to get multiple triggers if you don't stop and wait while the drum-sound fades-down.

- Wait for hit (looping)
- Trigger & read array
- Incriment to next array element
- Delay
- Loop back and wait for another hit...

Or, you might have to make a variable threshold...  So, after a hit/trigger it gets less-sensitive for a few milliseconds.   Then as the milliseconds pass, it gets more sensitive waiting for the next hit. 

I've actually built something like that with an analog circuit - It would automatically set the trigger threshold...   I had a peak-detector charging a capacitor, and that set my threshold-reference.  So a beat comes-in, triggers the lights, and the threshold is automatically set.  (The threshold and signal are run-into a comparator that triggers the lights whenever the signal is greater than the threshold.)   The capacitor would discharge through a resistor, so the threshold would drop and and the thing would get more sensitive the longer it waited for another beat.      (There may have been a bit more to the circuit, but that's the basic idea and the same thing can be done in software.)  The timing was "tuned" so that it "likes" to trigger 3 or 4 times per second to match the beat of a typical song. 


Thanks DVDdoug

I'm having trouble keeping it from running through the whole array here's what I have so far, if any one could point me in the right direction I would appreciate it. also I have included a video of how it acts with the current code

Code: [Select]
const int knockSensor = A0; // the piezo is connected to analog pin 0
const int threshold = 100;  // threshold value to decide when the detected sound is a knock or not
int timer = 160;           // The higher the number, the slower the timing.
int ledPins[] = {
  13, 8, 12, 9, 11, 10,  };       // an array of pin numbers to which LEDs are attached
int pinCount = 6;           // the number of pins (i.e. the length of the array)
int sensorReading = 0;      // variable to store the value read from the sensor pin
void setup() {
  int thisPin;
  // the array elements are numbered from 0 to (pinCount - 1).
  // use a for loop to initialize each pin as an output:
  for (int thisPin = 0; thisPin < pinCount; thisPin++)  {
    pinMode(ledPins[thisPin], OUTPUT);     

void loop() {
  sensorReading = analogRead(knockSensor);   
  // loop from the lowest pin to the highest:
   if (sensorReading >= threshold) {
  for (int thisPin = 0; thisPin < pinCount; thisPin++) {
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);   
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);   

  // loop from the highest pin to the lowest:
   if (sensorReading >= threshold) {
  for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) {
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);

I would like to build this for my nephew
Here's a link to a video of my nephews band

Go Up