Description
I created a singing paper flower which can change colors following the rhythm. I can use a potentiometer to adjust the brightness of the colors.
Components
- 1 Arduino
- 1 Pot
- 1 Piezo Buzzer
- 3 LEDs
- 4 Resistors
- 1 Breadboard
- several Papers
Code
#include "pitches.h" const int piezoPin = 7; //piezo int rPin = 9; //red LED int gPin = 11; //green LED int bPin = 10; //blue LED int potPin = A0; //pot int potValue = 0; // notes int melody[] = {NOTE_E7, NOTE_E7, 0, NOTE_E7, 0, NOTE_C7, NOTE_E7, 0, NOTE_G7, 0, 0, 0, NOTE_G6, 0, 0, 0, NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0, NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7, 0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0, NOTE_C7, NOTE_D7, NOTE_B6, 0, 0, NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0, NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7, 0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0, NOTE_C7, NOTE_D7, NOTE_B6, 0, 0}; // durations: 2 = half note, and 8/3,4,6,8,12. It appears that 8/2.9 is more accurate than 8/3. float noteDurations[] = { 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, }; // calculates the number of elements in the melody array. int musicLength=sizeof(melody)/sizeof('NOTE_F5'); void setup() { pinMode(rPin, OUTPUT); pinMode(gPin, OUTPUT); pinMode(bPin, OUTPUT); } void loop() { Serial.println(potValue); for (int thisNote = 0; thisNote < musicLength; thisNote++) { potValue = analogRead(potPin); // calculate the note duration. change tempo by changing 2000 to other values int noteDuration = 2000/noteDurations[thisNote]; tone(piezoPin, melody[thisNote],noteDuration); // to distinguish the notes, set a minimum time between them. // the note's duration + 30% seems to work well float pauseBetweenNotes = noteDuration * 1.1; delay(pauseBetweenNotes); // blink the three LEDs in sequence if (thisNote%3==0){ analogWrite(rPin, potValue/4); analogWrite(gPin, 0); analogWrite(bPin, 0); delay(100); } else if (thisNote%3==1){ analogWrite(rPin, 0); analogWrite(gPin, potValue/4); analogWrite(bPin, 0); delay(100); } else if (thisNote%3==2){ analogWrite(rPin, 0); analogWrite(gPin, 0); analogWrite(bPin, potValue/4); delay(100); } } }