Hi guys,
Try this code if you have completed project 4 and want to try something 'extra'. I've added a 10 sec calibration and set constraint for output between 0 to 255 to prevent flickering. The effect is fantastic. You can also set brightness in the code, so that it won't blind you in dark environment.
For those of you who experienced problems, you might want to check your resistors. I used 10M Ohm instead of 10k Ohm in the beginning.
I was stumped for 2 days because of wrong resistors because I had no multimeter that time.
/*
Arduino Starter Kit example
Project 4 - Color Mixing Lamp (Extra added)
This sketch is written to accompany Project 3 in the
Arduino Starter Kit
Parts required:
1 RGB LED
three 10 kilohm resistors
3 220 ohm resistors
3 photoresistors
red green and blue colored gels
Created 13 September 2012
Modified 14 November 2012
by Scott Fitzgerald
Thanks to Federico Vanzati for improvements
Extra features added by Lam Kwok Leong, 8 July 2013
http://arduino.cc/starterKit
This example code is part of the public domain
*/
const int Brightness = 20; // set overall brightness, use lower value in darkroom to protect your eyes (0-255)
const int greenLEDPin = 9; // LED connected to digital pin 9
const int redLEDPin = 10; // LED connected to digital pin 10
const int blueLEDPin = 11; // LED connected to digital pin 11
const int redSensorPin = A0; // pin with the photoresistor with the red gel
const int greenSensorPin = A1; // pin with the photoresistor with the green gel
const int blueSensorPin = A2; // pin with the photoresistor with the blue gel
int redSensorValue = 0; // variable to hold the value from the red sensor
int greenSensorValue = 0; // variable to hold the value from the green sensor
int blueSensorValue = 0; // variable to hold the value from the blue sensor
int redSensorHigh = 0; //High and low value for mapping. Notice that 'High' value were set low at 0, so that during calibration, its value would be be pushed up. See project 6.
int greenSensorHigh = 0;
int blueSensorHigh = 0;
int redSensorLow = 1023; // the opposite is true for 'Low' value
int greenSensorLow = 1023;
int blueSensorLow = 1023;
void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
// set the digital pins as outputs
pinMode(greenLEDPin,OUTPUT);
pinMode(redLEDPin,OUTPUT);
pinMode(blueLEDPin,OUTPUT);
//switching on your lamp before calibration, as it would affect calibration too, especially in dark environment
analogWrite(redLEDPin, Brightness);
analogWrite(greenLEDPin, Brightness);
analogWrite(blueLEDPin, Brightness);
//actual calibration which takes 10 seconds. During calibration, LED would shine at constant brightness. After that, it'll start to respond.
while (millis() < 10000) {
redSensorValue = analogRead(redSensorPin); //read pin
if (redSensorValue > redSensorHigh) { //push 'High' value up based on sensor value. At the end of calibration, 'High' value would take the highest 'SensorValue' during the 10 seconds.
redSensorHigh = redSensorValue;
}
if (redSensorValue < redSensorLow) { //opposite is true for 'Low' value
redSensorLow = redSensorValue;
}
delay(5);
greenSensorValue = analogRead(greenSensorPin);
if (greenSensorValue > greenSensorHigh) {
greenSensorHigh = greenSensorValue;
}
if (greenSensorValue < greenSensorLow) {
greenSensorLow = greenSensorValue;
}
delay(5);
blueSensorValue = analogRead(blueSensorPin);
if (blueSensorValue > blueSensorHigh) {
blueSensorHigh = blueSensorValue;
}
if (blueSensorValue < blueSensorLow) {
blueSensorLow = blueSensorValue;
}
delay(5);
}
}
void loop() {
// Read the sensors first:
// read the value from the red-filtered photoresistor:
redSensorValue = analogRead(redSensorPin);
// give the ADC a moment to settle
delay(5);
// read the value from the green-filtered photoresistor:
greenSensorValue = analogRead(greenSensorPin);
// give the ADC a moment to settle
delay(5);
// read the value from the blue-filtered photoresistor:
blueSensorValue = analogRead(blueSensorPin);
// print out the values to the serial monitor
Serial.print("raw sensor Values \t red: ");
Serial.print(redSensorValue);
Serial.print("\t green: ");
Serial.print(greenSensorValue);
Serial.print("\t Blue: ");
Serial.println(blueSensorValue);
/*
In order to use the values from the sensor for the LED,
you need to do some math. The ADC provides a 10-bit number,
but analogWrite() uses 8 bits. You'll want to divide your
sensor readings by 4 to keep them in range of the output.
*/
/*
Changed from a mere division by 4 in the original code to mapping.
Lowest value recorded at calibration would be mapped to 0, and highest value would be mapped to brightness set earlier.
The constraint function is set to prevent flickering, when value are negative or exceeds 255.
*/
int redValue = map(redSensorValue,redSensorLow,redSensorHigh,0,Brightness);
redValue = constrain(redValue,0,255);
int greenValue = map(greenSensorValue,greenSensorLow,greenSensorHigh,0,Brightness);
greenValue = constrain(greenValue,0,255);
int blueValue = map(blueSensorValue,blueSensorLow,blueSensorHigh,0,Brightness);
blueValue = constrain(blueValue,0,255);
// print out the mapped values
Serial.print("Mapped sensor Values \t red: ");
Serial.print(redValue);
Serial.print("\t green: ");
Serial.print(greenValue);
Serial.print("\t Blue: ");
Serial.println(blueValue);
/*
Now that you have a usable value, it's time to PWM the LED.
*/
analogWrite(redLEDPin, redValue);
analogWrite(greenLEDPin, greenValue);
analogWrite(blueLEDPin, blueValue);
}