Lampe Pantone (lampe qui reconnait les couleurs)

Hello !
Voici mon dernier projet: une lampe Pantone. Le concept est simple: on insère unecarte postale Pantone de la couleur désirée et la lampe la reconnait et la retransmet aussitôt via ses leds RGB :slight_smile: Voici une vidéo présentant ma lampe https://vimeo.com/61349578


Matériels


  • Un Arduino
  • Un capteur de couleurs TCS230D (10€ sur eBay)
  • 4 Leds RGB avec 12 résistances
  • Fils électrique
  • 2 Shift Register (74HC595)
  • Cartes postales Pantone (15$ sur Amazon)
  • Une boite en bois pour le support (5€ chez Loisirs & Création)
  • Tubes à essai avec support (6€ chez Loisirs & Création)

Montage



Code source


#include <rgbconverter.h>
#include <timerone.h>
#define _useTimer1
#include <shiftpwm.h>
 
/* Color Sensor Pins */
#define S0     6
#define S1     4
#define S2     7
#define S3     5
#define OUT    2
 
/* LED Pins  */
#define LEDROUGE   5
#define LEDVERT    6
#define LEDBLEU    3
 
int   g_count = 0;    // Count the frequecy
int   g_array[3];     // Store the RGB value
int   g_flag = 0;     // Filter of RGB queue
float g_SF[3];        // Save the RGB Scale factor
 
/* ShiftPWM Config */
const int ShiftPWM_latchPin=8;
const bool ShiftPWM_invertOutputs = false; 
const bool ShiftPWM_balanceLoad = false;
unsigned char maxBrightness = 255;
unsigned char pwmFrequency = 75;
int numRegisters = 2;
int numRGBleds = numRegisters*8/3;
 
// Init TSC230 and setting Frequency.
void TSC_Init()
{
  // Set output pin
  pinMode (LEDVERT,OUTPUT); 
  pinMode (LEDROUGE,OUTPUT);
  pinMode (LEDBLEU,OUTPUT); 
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(OUT, INPUT);
   
  // Output frequency scaling 2%
  digitalWrite(S0, LOW);  
  digitalWrite(S1, HIGH); 
}
  
// Select the filter color 
void TSC_FilterColor(int Level01, int Level02)
{
  if(Level01 != 0)
    Level01 = HIGH;
  
  if(Level02 != 0)
    Level02 = HIGH;
  
  digitalWrite(S2, Level01); 
  digitalWrite(S3, Level02); 
}
  
void TSC_Count()
{
  g_count ++ ;
}
  
void TSC_Callback()
{
  switch(g_flag)
  {
    case 0: 
         Serial.println("->WB Start");
         TSC_WB(LOW, LOW); //Filter without Red
         break;
    case 1:
         Serial.print("->Frequency R=");
         Serial.println(g_count);
         g_array[0] = g_count;
         TSC_WB(HIGH, HIGH); //Filter without Green
         break;
    case 2:
         Serial.print("->Frequency G=");
         Serial.println(g_count);
         g_array[1] = g_count;
         TSC_WB(LOW, HIGH); //Filter without Blue
         break;
  
    case 3:
         Serial.print("->Frequency B=");
         Serial.println(g_count);
         Serial.println("->WB End");
         g_array[2] = g_count;
         TSC_WB(HIGH, LOW); //Clear(no filter)   
         break;
   default:
         g_count = 0;
         break;
  }
}
  
void TSC_WB(int Level0, int Level1)      //White Balance
{
  g_count = 0;
  g_flag ++;
  TSC_FilterColor(Level0, Level1);
  Timer1.setPeriod(1000000);             // Set 1s period
}
  
void setup()
{
  TSC_Init();
  Serial.begin(9600);
  Timer1.initialize(1000);
  Timer1.attachInterrupt(TSC_Callback);  
  attachInterrupt(0, TSC_Count, RISING);
  delay(5000);
  g_SF[0] = 255.0/ g_array[0];     //R Scale factor
  g_SF[1] = 255.0/ g_array[1];    //G Scale factor
  g_SF[2] = 255.0/ g_array[2];    //B Scale factor
   
  ShiftPWM.SetAmountOfRegisters(numRegisters);
  ShiftPWM.SetPinGrouping(1);
  ShiftPWM.Start(pwmFrequency,maxBrightness);
}
  
void loop()
{
   ShiftPWM.SetAll(0);
   g_flag = 0;
   int valR = int(g_array[0] * g_SF[0]);
   int valG = int(g_array[1] * g_SF[1]);
   int valB = int(g_array[2] * g_SF[2]);
   ledRVBpwm(valR,valG,valB);
   delay(5000);
}
 
 
void ledRVBpwm(int pwmRed, int pwmGreen, int pwmBlue) {
 if(pwmRed > 255)
   pwmRed = 255;
 if(pwmGreen > 255)
   pwmGreen = 255;
 if(pwmBlue > 255)
   pwmBlue = 255;
    
   // RGB to HSV conversion
   byte r = pwmRed;
   byte g = pwmGreen;
   byte b = pwmBlue;
   double hsv[3];
   byte rgb[3];
   RGBConverter color;
   color.rgbToHsv(r,g,b,hsv);
    
   // Saturate the color thanks to HSV
   color.hsvToRgb(hsv[0],1,1,rgb);
   ShiftPWM.SetAllRGB(rgb[0],rgb[1],rgb[2]);
}

Pour quelques détails sur le projet c'est ici:
http://www.adrienbaptiste.com/developpement/lampe-pantone-arduino-capteur-de-couleurs-rgb-leds/1005







Joli projet, bravo.

Bonjour

Pour améliorer l'effet de lumière dans les tubes, tu pourrais les remplir d'eau.