Description
For this homework, I modified the blinking LED and fading LED sample programs so that one pot controls the blinking of all 3 LEDs (at once) and another pot controls the brightness of all 3 LEDs, so that turning the pot cycles through the colors of the rainbow (from green to red to blue, and the colors in between).
Materials Used
3 LEDs, 3 220 Ohm resistors, 3 potentiometers
Arduino Code
/*
*
* Control 3 LEDs with 1 potentiometer
*
* One potentiometer controls the brightness of each LED.
* Turning the potentiometer changes the LEDs so that the effect is cycling through the rainbow,
* from green to red to blue (and the mixed colors in betwee)
*
* The second potentiometer controls the rate at which the three LEDs blink.
*
*
*If the LEDs are different colors, and are directed at diffusing surface (stuck in a
* a Ping-Pong ball, or placed in a paper coffee cup with a cut-out bottom and
* a white plastic lid), the colors will mix together.
*
*
* The mix values that create the color will be reported via serial out.
*
* Standard colors for light mixing are Red, Green, and Blue, though you can mix
* with any three colors; Red + Blue + White would let you mix shades of red,
* blue, and purple (though no yellow, orange, green, or blue-green.)
*
* Put 220 Ohm resistors in line with pots, to prevent circuit from
* grounding out when the pots are at zero
*/
// Analog pin settings
int aIn = 0; // Potentiometers connected to analog pins 0 and 1
int bIn = 1; // (Connect power to 5V and ground to analog ground)
// Digital pin settings
int aOut = 9; // LEDs connected to digital pins 9, 10 and 11
int bOut = 10; // (Connect cathodes to digital ground)
int cOut = 11;
// Values
int aVal = 0; // Variables to store the input from the potentiometers
int bVal = 0;
int cVal = 0;
// Variables for comparing values between loops
int i = 0; // Loop counter
int wait = (1000); // Delay between most recent pot adjustment and output
int checkSum = 0; // Aggregate pot values
int prevCheckSum = 0;
int sens = 3; // Sensitivity theshold, to prevent small changes in
// pot values from triggering false reporting
// FLAGS
int PRINT = 1; // Set to 1 to output values
int DEBUG = 1; // Set to 1 to turn on debugging output
void setup()
{
pinMode(aOut, OUTPUT); // sets the digital pins as output
pinMode(bOut, OUTPUT);
pinMode(cOut, OUTPUT);
Serial.begin(9600); // Open serial communication for reporting
}
void loop()
{
i += 1; // Count loop
int masterVal = analogRead(aIn); // read in value from pot 1
if (masterVal < 256){
aVal = masterVal;
bVal = 255;
cVal = 0;
}
else if ((256 < masterVal) && (masterVal < 512)){
aVal = 255;
bVal = 512 - masterVal;
cVal = 0;
}
else if ((512 < masterVal) && (masterVal < 768)){
aVal = 255;
bVal = 0;
cVal = masterVal - 512;
}
else if ((768 < masterVal) && (masterVal < 1024)){
aVal = 1024 - masterVal;
bVal = 0;
cVal = 255;
}
analogWrite(aOut, aVal); // Send new values to LEDs
analogWrite(bOut, bVal);
analogWrite(cOut, cVal);
int blinkVal = analogRead(bIn); // read the value from the pot 2
delay(blinkVal); // stop the program for some time
digitalWrite(aOut, LOW); // turn the led a off
digitalWrite(bOut, LOW); // turn the led b off
digitalWrite(cOut, LOW); // turn the led c off
delay(blinkVal);
if (i % wait == 0) // If enough time has passed...
{
checkSum = aVal+bVal+cVal; // ...add up the 3 values.
if ( abs(checkSum - prevCheckSum) > sens ) // If old and new values differ
// above sensitivity threshold
{
if (PRINT) // ...and if the PRINT flag is set...
{
Serial.print("A: "); // ...then print the values.
Serial.print(aVal);
Serial.print("\t");
Serial.print("B: ");
Serial.print(bVal);
Serial.print("\t");
Serial.print("C: ");
Serial.println(cVal);
PRINT = 0;
}
}
else
{
PRINT = 1; // Re-set the flag
}
prevCheckSum = checkSum; // Update the values
if (DEBUG) // If we want debugging output as well...
{
Serial.print(checkSum);
Serial.print("<=>");
Serial.print(prevCheckSum);
Serial.print("\tPrint: ");
Serial.println(PRINT);
}
}
}
Sample Video
Click here to view a sample video.
Comments
unfortunately, I can't view
unfortunately, I can't view the video. I don't think I have the right decoder :(