עוד שיפור קטן: הוספתי חיישן אור- מראה את עוצמת האור כאשר יש אור (על ה-LCD) וכשאין מדליק את הלד (בזמן שהלד דולק הוא מראה בנוסף גם את וקטור המטרה). יש לציין שבשביל ה-VCC של הלד הוצאתי "1" לוגי מאחת היציאות הדיגיטליות והשתמשתי בו כ- VCC- להלן הקוד:
קוד: בחירת הכל
/* RANDOM CONTINOUS MOVMENT BETWEEN RGB LED COLORS*/
/* writen & debuged by Dekel Ziv 27/12/11 */
/* the circuit: GND of led to GND of uno
r leg throught 330 ohm resistor to PWM 9 leg of uno
g leg throught 330 ohm resistor to PWM 10 leg of uno
b leg throught 330 ohm resistor to PWM 11 leg of uno
*/
#include <stdlib.h> // for itoa() call
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 2, 3, 4, 5);
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5 // read the buttons
int read_LCD_buttons() {
adc_key_in = analogRead(0); // read the value from the sensor
// my buttons when read are centered at thesevalies: 0, 144, 329, 504, 741
// we add approx 50 to those values and check to see if we are close
if (adc_key_in < 10)return btnNONE;
if ((adc_key_in < 195)&& (adc_key_in> 50))return btnRIGHT;
if ((adc_key_in < 500)&& (adc_key_in > 195))return btnUP;
if ((adc_key_in < 700)&& (adc_key_in >500))return btnDOWN;
if ((adc_key_in < 900)&& (adc_key_in >700))return btnLEFT;
if ((adc_key_in < 1023)&& (adc_key_in >900))return btnSELECT;
}
void setup() {
lcd.begin(16,2); // start the library
lcd.setCursor(0,0);
}
void loop() {
int power=150;
beg:analogWrite(11,0);
analogWrite(10,0);
analogWrite(9,0);
digitalWrite(8,HIGH);// providing ref V
int a;
a=analogRead(A5);//read the value
char bufg[5];
// convert a to string [buf]
itoa(a,bufg, 10);
lcd.print(itoa(a, bufg, 10));//print value
delay(1000);//delay
lcd.clear();// clear LCD for next iteration
if (a>power) {goto beg;} else {goto next;}// check whether there is light
next:
int vec2[3]={random(255),random(130),random(30)};//random vec2
int vec1[3]={random(255),random(130),random(30)};//random vec1
int vec3[3]={234,100,20};//reff vector-random, but constant
int vec4[3]={random(255),random(130),random(30)};//random vec4
int vec5[3]={random(255),random(130),random(30)};//random vec5
int vec6[3]={random(255),random(130),random(30)};//random vec6
int r=vec3[0];
int g=vec3[1];
int b=vec3[2];//initiation of the RGB to reff vec
while (1) {
char bufr1[5];
// convert 123 to string [buf]
;
char bufg1[5];
// convert 123 to string [buf]
itoa(vec1[0], bufg1, 10);
char bufb1[5];
// convert 123 to string [buf]
itoa(vec1[1], bufb1, 10);
lcd.clear();
lcd.setCursor(0,1);
lcd.print ("R:");
lcd.print(itoa(vec1[0], bufr1, 10));
lcd.print (" G:");
lcd.print(itoa(vec1[1], bufg1, 10));
lcd.print (" B:");
lcd.print(itoa(vec1[2], bufb1, 10));// prins the values of rgb led by usinf "itoa" function
//itoa can convert an integer value to a string
delay(10);
if (r>vec1[0]) {r--;} else
if (r<vec1[0]) {r++;} else { r=r;}
if (g>vec1[1]) {g--;} else
if (g<vec1[1]) {g++;} else { g=g;}
if (b>vec1[2]) {b--;} else
if (b<vec1[2]) {b++;} else { b=b;}
analogWrite(11,b);
analogWrite(10,g);
analogWrite(9,r);
char bufr[5];
// convert 123 to string [buf]
;
char bufg[5];
// convert 123 to string [buf]
itoa(g, bufg, 10);
char bufb[5];
// convert 123 to string [buf]
itoa(b, bufb, 10);
lcd.clear();
lcd.setCursor(0,0);
lcd.print ("R:");
lcd.print(itoa(r, bufr, 10));
lcd.print (" G:");
lcd.print(itoa(g, bufg, 10));
lcd.print (" B:");
lcd.print(itoa(b, bufb, 10));// prins the values of rgb led by usinf "itoa" function
//itoa can convert an integer value to a string
delay (10);
if (r==vec1[0] && g==vec1[1] && b==vec1[2]) break;//this loop zooms the RGB integers to the target vector &output the change with delay
//(repeats for all vectors one after the other)
digitalWrite(8,HIGH);// providing ref V
a=analogRead(A5);//read
if (a>power) {analogWrite(11,0);
analogWrite(10,0);
analogWrite(9,0);
goto beg;}
}
while (1) {
char bufr1[5];
// convert 123 to string [buf]
;
char bufg1[5];
// convert 123 to string [buf]
itoa(vec2[0], bufg1, 10);
char bufb1[5];
// convert 123 to string [buf]
itoa(vec2[1], bufb1, 10);
lcd.clear();
lcd.setCursor(0,1);
lcd.print ("R:");
lcd.print(itoa(vec2[0], bufr1, 10));
lcd.print (" G:");
lcd.print(itoa(vec2[1], bufg1, 10));
lcd.print (" B:");
lcd.print(itoa(vec2[2], bufb1, 10));// prins the values of rgb led by usinf "itoa" function
//itoa can convert an integer value to a string
delay(10);
if (r>vec2[0]) {r--;} else
if (r<vec2[0]) {r++;} else { r=r;}
if (g>vec2[1]) {g--;} else
if (g<vec2[1]) {g++;} else { g=g;}
if (b>vec2[2]) {b--;} else
if (b<vec2[2]) {b++;} else { b=b;}
analogWrite(11,b);
analogWrite(10,g);
analogWrite(9,r);
char bufr[5];
// convert 123 to string [buf]
;
char bufg[5];
// convert 123 to string [buf]
itoa(g, bufg, 10);
char bufb[5];
// convert 123 to string [buf]
itoa(b, bufb, 10);
lcd.clear();
lcd.setCursor(0,0);
lcd.print ("R:");
lcd.print(itoa(r, bufr, 10));
lcd.print (" G:");
lcd.print(itoa(g, bufg, 10));
lcd.print (" B:");
lcd.print(itoa(b, bufb, 10));// prins the values of rgb led by usinf "itoa" function
//itoa can convert an integer vlue to a string
delay (10);
if (r==vec2[0] && g==vec2[1] && b==vec2[2]) break;
digitalWrite(8,HIGH);// providing ref V
a=analogRead(A5);//read
if (a>power) {analogWrite(11,0);
analogWrite(10,0);
analogWrite(9,0);
goto beg;}
}
while (1) {
char bufr1[5];
// convert 123 to string [buf]
;
char bufg1[5];
// convert 123 to string [buf]
itoa(vec4[0], bufg1, 10);
char bufb1[5];
// convert 123 to string [buf]
itoa(vec4[1], bufb1, 10);
lcd.clear();
lcd.setCursor(0,1);
lcd.print ("R:");
lcd.print(itoa(vec4[0], bufr1, 10));
lcd.print (" G:");
lcd.print(itoa(vec4[1], bufg1, 10));
lcd.print (" B:");
lcd.print(itoa(vec4[2], bufb1, 10));// prins the values of rgb led by usinf "itoa" function
//itoa can convert an integer value to a string
delay(10);
if (r>vec4[0]) {r--;} else
if (r<vec4[0]) {r++;} else { r=r;}
if (g>vec4[1]) {g--;} else
if (g<vec4[1]) {g++;} else { g=g;}
if (b>vec4[2]) {b--;} else
if (b<vec4[2]) {b++;} else { b=b;}
analogWrite(11,b);
analogWrite(10,g);
analogWrite(9,r);
char bufr[5];
// convert 123 to string [buf]
;
char bufg[5];
// convert 123 to string [buf]
itoa(g, bufg, 10);
char bufb[5];
// convert 123 to string [buf]
itoa(b, bufb, 10);
lcd.clear();
lcd.setCursor(0,0);
lcd.print ("R:");
lcd.print(itoa(r, bufr, 10));
lcd.print (" G:");
lcd.print(itoa(g, bufg, 10));
lcd.print (" B:");
lcd.print(itoa(b, bufb, 10));// prins the values of rgb led by usinf "itoa" function
//itoa can convert an integer vlue to a string
delay (10);
if (r==vec4[0] && g==vec4[1] && b==vec4[2]) break;
digitalWrite(8,HIGH);// providing ref V
a=analogRead(A5);//read
if (a>power) {analogWrite(11,0);
analogWrite(10,0);
analogWrite(9,0);
goto beg;}
}
while (1) {
char bufr1[5];
// convert 123 to string [buf]
;
char bufg1[5];
// convert 123 to string [buf]
itoa(vec5[0], bufg1, 10);
char bufb1[5];
// convert 123 to string [buf]
itoa(vec5[1], bufb1, 10);
lcd.clear();
lcd.setCursor(0,1);
lcd.print ("R:");
lcd.print(itoa(vec5[0], bufr1, 10));
lcd.print (" G:");
lcd.print(itoa(vec5[1], bufg1, 10));
lcd.print (" B:");
lcd.print(itoa(vec5[2], bufb1, 10));// prins the values of rgb led by usinf "itoa" function
//itoa can convert an integer value to a string
delay(10);
if (r>vec5[0]) {r--;} else
if (r<vec5[0]) {r++;} else { r=r;}
if (g>vec5[1]) {g--;} else
if (g<vec5[1]) {g++;} else { g=g;}
if (b>vec5[2]) {b--;} else
if (b<vec5[2]) {b++;} else { b=b;}
analogWrite(11,b);
analogWrite(10,g);
analogWrite(9,r);
char bufr[5];
// convert 123 to string [buf]
;
char bufg[5];
// convert 123 to string [buf]
itoa(g, bufg, 10);
char bufb[5];
// convert 123 to string [buf]
itoa(b, bufb, 10);
lcd.clear();
lcd.setCursor(0,0);
lcd.print ("R:");
lcd.print(itoa(r, bufr, 10));
lcd.print (" G:");
lcd.print(itoa(g, bufg, 10));
lcd.print (" B:");
lcd.print(itoa(b, bufb, 10));// prins the values of rgb led by usinf "itoa" function
//itoa can convert an integer vlue to a string
delay (10);
if (r==vec5[0] && g==vec5[1] && b==vec5[2]) break;
digitalWrite(8,HIGH);// providing ref V
a=analogRead(A5);//read
if (a>power) {analogWrite(11,0);
analogWrite(10,0);
analogWrite(9,0);
goto beg;}
}
while (1) {
char bufr1[5];
// convert 123 to string [buf]
;
char bufg1[5];
// convert 123 to string [buf]
itoa(vec6[0], bufg1, 10);
char bufb1[5];
// convert 123 to string [buf]
itoa(vec6[1], bufb1, 10);
lcd.clear();
lcd.setCursor(0,1);
lcd.print ("R:");
lcd.print(itoa(vec6[0], bufr1, 10));
lcd.print (" G:");
lcd.print(itoa(vec6[1], bufg1, 10));
lcd.print (" B:");
lcd.print(itoa(vec6[2], bufb1, 10));// prins the values of rgb led by usinf "itoa" function
//itoa can convert an integer value to a string
delay(10);
if (r>vec6[0]) {r--;} else
if (r<vec6[0]) {r++;} else { r=r;}
if (g>vec6[1]) {g--;} else
if (g<vec6[1]) {g++;} else { g=g;}
if (b>vec6[2]) {b--;} else
if (b<vec6[2]) {b++;} else { b=b;}
analogWrite(11,b);
analogWrite(10,g);
analogWrite(9,r);
char bufr[5];
// convert 123 to string [buf]
;
char bufg[5];
// convert 123 to string [buf]
itoa(g, bufg, 10);
char bufb[5];
// convert 123 to string [buf]
itoa(b, bufb, 10);
lcd.clear();
lcd.setCursor(0,0);
lcd.print ("R:");
lcd.print(itoa(r, bufr, 10));
lcd.print (" G:");
lcd.print(itoa(g, bufg, 10));
lcd.print (" B:");
lcd.print(itoa(b, bufb, 10));// prins the values of rgb led by usinf "itoa" function
//itoa can convert an integer vlue to a string
delay (10);
if (r==vec6[0] && g==vec6[1] && b==vec6[2]) break;
digitalWrite(8,HIGH);// providing ref V
a=analogRead(A5);//read
if (a>power) {analogWrite(11,0);
analogWrite(10,0);
analogWrite(9,0);
goto beg;}
}
while (1) {
char bufr1[5];
// convert 123 to string [buf]
;
char bufg1[5];
// convert 123 to string [buf]
itoa(vec3[0], bufg1, 10);
char bufb1[5];
// convert 123 to string [buf]
itoa(vec3[1], bufb1, 10);
lcd.clear();
lcd.setCursor(0,1);
lcd.print ("R:");
lcd.print(itoa(vec3[0], bufr1, 10));
lcd.print (" G:");
lcd.print(itoa(vec3[1], bufg1, 10));
lcd.print (" B:");
lcd.print(itoa(vec3[2], bufb1, 10));// prins the values of rgb led by usinf "itoa" function
//itoa can convert an integer value to a string
delay(10);
if (r>vec3[0]) {r--;} else
if (r<vec3[0]) {r++;} else { r=r;}
if (g>vec3[1]) {g--;} else
if (g<vec3[1]) {g++;} else { g=g;}
if (b>vec3[2]) {b--;} else
if (b<vec3[2]) {b++;} else { b=b;}
analogWrite(11,b);
analogWrite(10,g);
analogWrite(9,r);
char bufr[5];
// convert 123 to string [buf]
;
char bufg[5];
// convert 123 to string [buf]
itoa(g, bufg, 10);
char bufb[5];
// convert 123 to string [buf]
itoa(b, bufb, 10);
lcd.clear();
lcd.setCursor(0,0);
lcd.print ("R:");
lcd.print(itoa(r, bufr, 10));
lcd.print (" G:");
lcd.print(itoa(g, bufg, 10));
lcd.print (" B:");
lcd.print(itoa(b, bufb, 10));// prins the values of rgb led by usinf "itoa" function
//itoa can convert an integer vlue to a string
delay (10);
if (r==vec3[0] && g==vec3[1] && b==vec3[2]) break;//the last loop returns the RGB integers to the refference vector-this is critical
// so their won't be any "jumps" in colors
digitalWrite(8,HIGH);// providing ref V
a=analogRead(A5);//read
if (a>power) {analogWrite(11,0);
analogWrite(10,0);
analogWrite(9,0);
goto beg;}
}
goto next;
}
הקוד אולי קצת מחורבש ויש בו אולי כמה קטעים מיותרים (עקב השילד LCD בו אני משתמש.