Arduino Color Picker

7,229

59

3

About: Maker, tinkerer, full stack developer

Welcome to my instructable!

The project I want to share with you today is Arduino Color Picker, a device that will let you pick any color from real life object(s) and display it in convenient way so you can use it for example in any drawing software, GUI web development and much more!

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: Parts List

For this project we will need:

Tools:

  • 3D printer, if you don't own it, you can get printed case from Shapeways: click here
  • phillips screwdriver
  • soldering iron
  • solder

Step 2: Schematics

Refer to opening video's assembly section and schematic below to see how to place parts on a PCB.

Use schematic provided above for correct wiring.

Step 3: Design and 3D Print the Case

After we have measured the parts, it is time to design a 3D case and print it!

Design

Here is the link to my design on tinkercad: https://www.tinkercad.com/things/dG47Pr28uwx

Case above is designed to perfectly fit all the components listed above.

Front part will hold the LCD screen and color sensor.

Main 3x7 cm PCB will hold DFRDuino Pro Mini, battery holders and 3 push buttons and will be screwed on the back part from inside.

RGB LED will sit inside the top section of the back part.

Power switch will fit in the small hole on the back part.

Printing

3D models ready for printing are available on Thingiverse: https://www.thingiverse.com/thing:3223709

Print settings may vary depending on your printer.

Supports are needed for battery cover part and front part because front part has a built in distancer to provide distance between color sensor and specimen.

If you don't own a 3D printer, you can get printed case from Shapeways: click here

Assembly

For assembly instructions please refer to the assembly section of the video provided at the begining.

Step 4: Source Code

Source code is available for free on GitHub: https://github.com/alojzjakob/Arduino-Color-Picker

You are more than welcome to improve the code, as the code provided is only the starting point, but works well.

This project uses these 2 specific libraries, so make sure you add these to your Arduino IDE:

#include <DFRobot_TCS34725.h>
#include <DFRobot_LCD.h>

#define ledPin 12 #define redpin 3 #define greenpin 5 #define bluepin 6

const int8_t button1Pin = 7; //1 const int8_t button2Pin = 8; //2 const int8_t button3Pin = 9; //3

int8_t button1State = 0; int8_t button2State = 0; int8_t button3State = 0;

#define ACTIVATED LOW

// for a common anode LED, connect the common pin to +5V // for common cathode, connect the common to ground // set to false if using a common cathode LED #define commonAnode true

// our RGB -> eye-recognized gamma color byte gammatable[256];

DFRobot_LCD lcd(16,2); DFRobot_TCS34725 tcs = DFRobot_TCS34725(0x50, TCS34725_GAIN_60X);

bool ledEnabled=false; int lightsMode=0;

// make some custom characters: byte light_on[8] = { 0b00100, 0b00100, 0b01110, 0b11111, 0b11111, 0b01110, 0b00000, 0b10101 };

byte light_off[8] = { 0b00100, 0b00100, 0b01110, 0b10001, 0b10001, 0b01110, 0b00000, 0b00000 };

byte rgb_on[8] = { 0b00000, 0b10101, 0b00000, 0b01110, 0b01110, 0b01110, 0b11111, 0b11111 };

byte rgb_off[8] = { 0b00000, 0b00000, 0b00000, 0b01110, 0b01010, 0b01010, 0b10001, 0b11111 };

void setup() {

lcd.init(); // create a new character lcd.customSymbol(0, light_on); lcd.customSymbol(1, light_off); lcd.customSymbol(2, rgb_on); lcd.customSymbol(3, rgb_off);

pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW);

pinMode(button1Pin, INPUT); pinMode(button2Pin, INPUT); pinMode(button3Pin, INPUT); digitalWrite(button1Pin, HIGH); digitalWrite(button2Pin, HIGH); digitalWrite(button3Pin, HIGH); pinMode(redpin, OUTPUT); pinMode(greenpin, OUTPUT); pinMode(bluepin, OUTPUT);

analogWrite(redpin,0); analogWrite(greenpin,0); analogWrite(bluepin,0); // thanks PhilB for this gamma table! it helps convert RGB colors to what humans see for (int i=0; i<256; i++) { float x = i; x /= 255; x = pow(x, 2.5); x *= 255; if (commonAnode) { gammatable[i] = 255 - x; } else { gammatable[i] = x; } } }

void loop() {

button1State = digitalRead(button1Pin); button2State = digitalRead(button2Pin); button3State = digitalRead(button3Pin);

int btn=0; if(button1State==LOW){ btn=1; } if(button2State==LOW){ btn=2; } if(button3State==LOW){ btn=3; lightsMode++; if(lightsMode==4){ lightsMode=0; } }

uint16_t clear, red, green, blue; tcs.getRGBC(&red, &green, &blue, &clear); // Figure out some basic hex code for visualization uint32_t sum = clear; float r, g, b; r = red; r /= sum; g = green; g /= sum; b = blue; b /= sum; r *= 255; g *= 255; b *= 255; String redHex,greenHex,blueHex; redHex = String((int)r, HEX); greenHex = String((int)g, HEX); blueHex = String((int)b, HEX); lcd.setRGB(r,g,b); //Set lcd backlight RGB Value lcd.setCursor(0,0); // print values on lcd lcd.print("#"); lcd.print(redHex); lcd.print(greenHex); lcd.print(blueHex); lcd.print(" "); lcd.setCursor(0,1); lcd.print("rgb("); lcd.print((int)r); lcd.print(","); lcd.print((int)g); lcd.print(","); lcd.print((int)b); lcd.print(") "); if(lightsMode==0){ ledEnabled=false; lcd.setCursor(15,0); lcd.write((unsigned char)1);//light off lcd.setCursor(14,0); lcd.write((unsigned char)2);//rgb led on //Set the color of RGB led indicator analogWrite(redpin, round(gammatable[(int)r]/4)); analogWrite(greenpin, round(gammatable[(int)g]/4)); analogWrite(bluepin, round(gammatable[(int)b]/4)); } if(lightsMode==1){ ledEnabled=true; lcd.setCursor(15,0); lcd.write((unsigned char)0);//light on lcd.setCursor(14,0); lcd.write((unsigned char)2);//rgb led on //Set the color of RGB led indicator analogWrite(redpin, round(gammatable[(int)r]/4)); analogWrite(greenpin, round(gammatable[(int)g]/4)); analogWrite(bluepin, round(gammatable[(int)b]/4)); } if(lightsMode==2){ ledEnabled=true; lcd.setCursor(15,0); lcd.write((unsigned char)0);//light on lcd.setCursor(14,0); lcd.write((unsigned char)3);//rgb led off //Set the color of RGB led indicator analogWrite(redpin, 255); analogWrite(greenpin, 255); analogWrite(bluepin, 255); } if(lightsMode==3){ ledEnabled=false; lcd.setCursor(15,0); lcd.write((unsigned char)1);//light off lcd.setCursor(14,0); lcd.write((unsigned char)3);//rgb led off //Set the color of RGB led indicator analogWrite(redpin, 255); analogWrite(greenpin, 255); analogWrite(bluepin, 255); }

if(ledEnabled){ digitalWrite(ledPin, HIGH); }else{ digitalWrite(ledPin, LOW); } //delay(10); }

Step 5: Enjoy Your New Tool + Improvement Plans

Now you can go around and pick some nice colors :)

Currently only the 3rd button is used to cycle through lights as shown in the video.

Plan for near future is to implement functionality for other buttons:

  • button 1 should pick a color and store it in memory so you can cycle through last 10 colors
  • button 2 will bring up menu, containing color picker history and much more!
    • if in menu mode button 1 acts as select, button 3 will act as back/escape

I hope you enjoyed this tutorial and will have fun using this color picker!

Optics Contest

Participated in the
Optics Contest

Be the First to Share

    Recommendations

    • Made with Math Contest

      Made with Math Contest
    • Multi-Discipline Contest

      Multi-Discipline Contest
    • Robotics Contest

      Robotics Contest

    3 Discussions

    0
    None
    daniel.s.blubaugh

    8 months ago

    I have been trying to make this but I'm afraid it is simply not possible with your code. Something about the dfrobot vs the more readily available components. dfrobot is not sold in the states and ordering from their website makes everything about 3 times more expensive. I tried to do it with components readily available in the states unfortunately my coding experience is very limited and I'm struggling to make it do literally anything. Do you have any suggestions. I have never had so much trouble building anything off of instructables in my life. I have the tcs34725 but the get data command is different I know this is part of my problem. I have adapted your original designs to use 3.7 volt rechargeable battery as well but that should have no real effect on the coding. I don't see anywhere in your code that you assign addresses for the 2 I2C devices (necessary since I am going to replace the LCD with a ssd1306 OLED which makes more room for the battery and consumes less power plus the contrast makes it easier to read. Is there any advice you can give me. I'm struggling to get any output using your code even to a simple i2c lcd.

    1
    None
    jessyratfink

    10 months ago

    Great idea! The commercial versions are insanely expensive and this looks really professional. :)

    1 reply