Piano and Forte

I created a paper lantern that lights up and filters the diffused light. On occasion (as in, if positioned properly with a really low overhang), it can make a modest light pattern on my apartment ceiling.

To interact with the lantern, people can type in music dynamic such as ‘p’, ‘pp’, ‘mp’, ‘f’, ‘ff’. For example, ‘p’ stands for piano, and a small soft blue light will fade in and fade out slowly. ‘pp’ fades in and fades out with an even softer blue light twice. ‘F’ on the other hand is loud and lively, a color crescendo. My first version’s ‘F’ fluctuated from red-green to a vibrating blue to magenta. My second iteration is more smooth in transition.

They all fade at variable rates, representing the dynamics of their music symbolism.

Materials

  • 1/2 Blue LED
  • 1 Button
  • Jumper cables
  • Resistors (220Ω)
  • 1 Arduino Uno
  • 1 Breadboard
  • Ping Pong Ball or Translucent Cup
  • Paper

 

Code


/*
* Code for cross-fading 3 LEDs, red, green and blue, or one tri-color LED, using PWM
* The program cross-fades slowly from red to green, green to blue, and blue to red
* The debugging code assumes Arduino 0004, as it uses the new Serial.begin()-style functions
*/
// Output
int greenPin = 3; // Red LED, connected to digital pin 9
int bluePin = 6; // Green LED, connected to digital pin 10
int redPin = 11; // Blue LED, connected to digital pin 11

// Program variables
String dynamic;
int blueVal = 0; // Variables to store the values to send to the pins
int greenVal = 0 ; // Initial values are Red full, Green and Blue off
int redVal = 0;
int repeat= 0;
int i = 0; // Loop counter
int wait = 25; // 50ms (.05 second) delay; shorten for faster fades
//int DEBUG = 0; // DEBUG counter; if set to 1, will write values back via serial

void setup()
{
pinMode(redPin, OUTPUT); // sets the pins as output
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
Serial.begin(9600);
analogWrite(redPin, redVal);
analogWrite(greenPin, greenVal);
analogWrite(bluePin, blueVal);
Serial.println("enter a music dynamic command: pp, p, mp, f, ff");

}

// Main program
void loop()
{
i = 0;
dynamic = "";
while (Serial.available() == 0) {

}
dynamic = Serial.readString();
if (dynamic.substring(0,1) == "p") {
redVal = 0;
greenVal = 0;
blueVal = 0;
wait = 25;
for (repeat = 0; repeat <dynamic.length(); repeat++) {
i = 0;
for (; i <100; i++) {
greenVal += (1/dynamic.length()) ;
analogWrite(redPin, redVal);
analogWrite(greenPin, greenVal);
analogWrite(bluePin, blueVal);
delay(wait);
}
for (; i <200;i++) {
greenVal -= (1/dynamic.length());
analogWrite(redPin, redVal);
analogWrite(greenPin, greenVal);
analogWrite(bluePin, blueVal);
delay(wait);
}
}
}
if (dynamic == "mp") {
redVal = 0;
greenVal = 0;
blueVal = 0;
wait = 20;
for (repeat = 0; repeat <4; repeat++) {
i = 0;
for (; i <100; i++) {
redVal += 1;
greenVal += 1;
analogWrite(redPin, redVal);
analogWrite(greenPin, greenVal);
analogWrite(bluePin, blueVal);
delay(wait);
}
for (; i <200;i++) {
greenVal -= 1;
redVal -= 1;
analogWrite(redPin, redVal);
analogWrite(greenPin, greenVal);
analogWrite(bluePin, blueVal);
delay(wait);
}
}
}
if (dynamic.substring(0,1) == "f") {
redVal = 255;
greenVal = 0;
blueVal = 0;
wait = 50;
for (repeat = 0; repeat <dynamic.length(); repeat++) {
i = 0;
for (; i <100; i++) {
redVal -= 1;
greenVal += 1;
blueVal =1;
analogWrite(redPin, redVal);
analogWrite(greenPin, greenVal);
analogWrite(bluePin, blueVal);
delay(wait);
}
for (; i <200;i++) {
redVal = 1;
greenVal -= 1;
blueVal += 1;
analogWrite(redPin, redVal);
analogWrite(greenPin, greenVal);
analogWrite(bluePin, blueVal);
delay(wait);
}
for (; i <300;i++) {
redVal += 1;
greenVal =1;
blueVal -= 1;
analogWrite(redPin, redVal);
analogWrite(greenPin, greenVal);
analogWrite(bluePin, blueVal);
delay(wait);
}
redVal = 0;
greenVal = 0;
blueVal = 0;
analogWrite(redPin, redVal);
analogWrite(greenPin, greenVal);
analogWrite(bluePin, blueVal);
}
}
}

1st Iteration of ‘ff’:

2nd Iteration of ‘ff’:

Leave a Reply