Arduino färgsensor (4 / 5 steg)
Steg 4: Steg 3: skriva kod
Här är min Arduino kod. Du kommer att behöva kalibrera const värden baserat på hur mycket ljus är i rummet - kommentera bort den angivna delen av metoden loop() och observera de RGB-värden visas för olika färgade kort. Lagra de RGB-värdena i den ICOLOR const int [] 's i början av skriptet. Om du gjorde ett bra jobb med ljus-proofing rutan, bör samma RGB värden arbeta med olika nivåer av bakgrunden ljus./ ** Körs en färgsensor på Arduino
* Starta programmet samtidigt visar det vita kortet. När RGB LED släcks,
* (snabbt) växla till svart kort. Efter RGB LED: n blinkar vitt, är det redo.
*/
PIN-ID
int blå = A2;
int grön = A1;
int rött = A0;
int redOut = 9.
int greenOut = 10;
int blueOut = 11;
räknar antalet slingor - brukade tid händelser
int count = 0;
lagrar den aktuella RGB-ingången
int ut [3].
ICOLOR = RGB input från transistor som är den färgen.
FÄRG = RGB utgång göra RGB LED visar att färg
int IWHITE [3] = {175,48,455}. int vit [3] = {224,226,243}.
int IBLACK [3] = {42,5,20}. int av [3] = {0,0,0}.
int IRED [3] = {145,15,38}. int rött [3] = {200,0,0}.
int IYELLOW [3] = {175,40,60}. int gul [3] = {255,150,0}.
int IMAGENTA [3] = {150,16,83}. int MAGENTA [3] = {200,0,200}.
int IBLUE [3] = {57,7,160}. int blå [3] = {0,0,200}.
int IGREEN [3] = {41,6,50}. int GREEN [3] = {0,200,0}.
int NONE [3].
[0] av dessa är min, [1] är max.
int redConvert [2].
int greenConvert [2].
int blueConvert [2].
läser i den aktuella färgen
readColor() {int *
int ret [3];
ret [0] = analogRead(red);
ret [1] = analogRead(green);
ret [2] = analogRead(blue);
återvändande ret;
}
kontrollerar att varje element i color1 är inom dev av
det motsvarande elementet i refColor
booleska inRange (int color1 [], int refColor [], int dev) {
tillbaka (abs (color1 [0] - refColor[0]) < = dev) & &
ABS (color1 [1] - refColor[1]) < = dev & &
ABS (color1 [2] - refColor[2]) < = dev;
}
Anger färg RGB LED
void setColor (int color[]) {
analogWrite (redOut, color[0]);
analogWrite (greenOut, color[1]);
analogWrite (blueOut, color[2]);
}
värdena för svart och vitt
void calibrate() {
setColor(RED);
Delay(500);
setColor(GREEN);
Delay(500);
setColor(BLUE);
Delay(500);
setColor(WHITE);
int redSum = 0;
int greenSum = 0;
int blueSum = 0;
för (int jag = 1; jag < = 5; i ++) {
redSum += analogRead(red);
greenSum += analogRead(green);
blueSum += analogRead(blue);
Delay(333);
}
int whiteCal [3] = {redSum/5, greenSum/5, blueSum/5};
redSum = blueSum = greenSum = 0;
setColor(OFF);
Serial.Print ("vita Cal (RGB):");
Serial.Print(whiteCal[0]);
Serial.Print("");
Serial.Print(whiteCal[1]);
Serial.Print("");
Serial.println(whiteCal[2]);
Serial.println ("Infoga svart kort");
While(inRange(readColor(),whiteCal,50)) {
Delay(1000);
Serial.Print ("röd grön blå:");
Serial.Print(analogRead(Red));
Serial.Print("");
Serial.Print(analogRead(Green));
Serial.Print("");
Serial.println(analogRead(Blue));
setColor(out);
}
Serial.println ("nytt kort upptäcks - jag hoppas det är svart");
Delay(5000);
för (int jag = 1; jag < = 5; i ++) {
redSum += analogRead(red);
greenSum += analogRead(green);
blueSum += analogRead(blue);
Delay(100);
}
int blackCal [3] = {redSum/5, greenSum/5, blueSum/5};
Serial.Print ("svart Cal (RGB):");
Serial.Print(blackCal[0]);
Serial.Print("");
Serial.Print(blackCal[1]);
Serial.Print("");
Serial.println(blackCal[2]);
beräkna konverteringsfunktioner
redConvert [0] = blackCal [0];
redConvert [1] = whiteCal [0];
greenConvert [0] = blackCal [1].
greenConvert [1] = whiteCal [1].
blueConvert [0] = blackCal [2].
blueConvert [1] = whiteCal [2].
}
körs skärmkalibrering rutin och vänder på ljust vit innan
Start loop
void setup() {
Serial.BEGIN(9600);
Calibrate();
setColor(WHITE);
Delay(1000);
}
void loop() {
läser i nya värden
Out [0] = analogRead (röd), //0-1024
ut [1] = analogRead(green);
[2] = analogRead(blue);
uppdatera RGB LED och skriver ut mindre ofta
om (count % 5000 == 0) {
Serial.Print ("röd grön blå:");
Serial.Print(Out[0]);
Serial.Print("");
Serial.Print(Out[1]);
Serial.Print("");
Serial.println(Out[2]);
kommentera ut resten av denna slinga till bara visningsvärden och inte använda RGB LED
IF(inRange(out,IWHITE,10)) {
Serial.println("White!");
setColor(WHITE);
}
annat if(inRange(out,IRED,10)) {
Serial.println("Red!");
setColor(RED);
}
annat if(inRange(out,IBLUE,10)) {
Serial.println("Blue!");
setColor(BLUE);
}
annat if(inRange(out,IYELLOW,10)) {
Serial.println("Yellow!");
setColor(YELLOW);
}
annat if(inRange(out,IMAGENTA,10)) {
Serial.println("magenta!");
setColor(MAGENTA);
}
annat if(inRange(out,IGREEN,10)) {
Serial.println("Green!");
setColor(GREEN);
}
annat setColor(OFF);
}
greve ++;
}