Code Arduino

#include <LiquidCrystal.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 13
#define NUMPIXELS 1

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

int readButtonPin = 0; // Numéro de pin du bouton de lecture de couleur
int calibrateButtonPin = 1; //Numéro de pin du bouton de calibration
int processingPin = 8;
int colourArray[] = {0,0,0}; // code RGB de la couleur mesurée
int whiteArray[] = {0,0,0}; // résultats mesurés pour le blanc lors de la calibration
int blackArray[] = {0,0,0}; // résultats mesurés pour le noir lors de la calibration
int ConvertedArray[] = {0,0,0}; // coulourArray  pondéré pour que le total soit 100
int r = 255;
int g = 255;
int b = 255;

//moyenne sur plusieurs lectures
int avgRead;
int calibrationDone = 0;
void setup(){

#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif

//démarrage LCD
lcd.begin(16, 2);
lcd.setCursor(0, 0);
//Pour les boutons
pinMode(processingPin, INPUT_PULLUP);
pinMode(readButtonPin, INPUT_PULLUP);
pinMode(calibrateButtonPin, INPUT_PULLUP);
//initialisation du moniteur série
Serial.begin(9600);

}

void loop(){ //boucle infinie, qui éxécute les fonctions de lecture et  calibrage avec les différents boutons

if (digitalRead(readButtonPin)==0){
checkColour();
}

if (digitalRead(calibrateButtonPin)==0){
calibration();
}
if (digitalRead(processingPin)==0){
sendProcessing();
}

}

void sendProcessing(){
lcd.clear();
lcd.setCursor(0,0);
if(calibrationDone==0){
lcd.print(“Calibrer”);
lcd.setCursor(0,1);
lcd.print(“avant mesures”);
delay(2000);
return;
}
while(digitalRead(processingPin)==1){
//affichage lcd acquisition
lcd.print(“acquisition”);
lcd.setCursor(0,1);
lcd.print(“par processing”);
//envoi à processing du pourcentage des couleurs + check des couleurs en temps réel
checkRGB();
delay(2000);
}

}
void calibration(){
calibrationDone=1;
//acquisition du blanc

// message à l’utilisateur par le moniteur Série

//affichage du texte sur l’écran
lcd.clear();
lcd.print(“calibration…”);
lcd.setCursor(0, 1);
lcd.print(“Mettez du blanc”);
delay(3000);

lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“3…”);
delay(1000);

lcd.clear();
lcd.print(“2…”);
delay(1000);

lcd.clear();
lcd.print(“1…”);
delay(1000);

lcd.clear();
lcd.print(“0!”);
delay(200);
lcd.clear();
lcd.print (“acquisition”);
// on allume chaque couleur une à la fois
//rouge d’abord
pixels.setPixelColor(0, pixels.Color(255,0,0)); //rouge
pixels.show();
delay(100);
whiteArray[0] = getReading(5); // une moyenne est prise sur le nombre de lectures indiqué entre parenthèses.
pixels.setPixelColor(0, pixels.Color(0,0,0));
pixels.show();
delay(100);
//ensuite vert
pixels.setPixelColor(0, pixels.Color(0,255,0));
pixels.show();
delay(100);
whiteArray[1] = getReading(5); // une moyenne est prise sur le nombre de lectures indiqué entre parenthèses.
pixels.setPixelColor(0, pixels.Color(0,0,0));
pixels.show();
delay(100);
//puis bleu
pixels.setPixelColor(0, pixels.Color(0,0,255));
pixels.show();
delay(100);
whiteArray[2] = getReading(5); // une moyenne est prise sur le nombre de lectures indiqué entre parenthèses.
pixels.setPixelColor(0, pixels.Color(0,0,0));
pixels.show();
delay(1000);

//message à l’utilisateur par l’écran LCD
lcd.clear();
lcd.print(“suite…”);
lcd.setCursor(0, 1);
lcd.print(“Mettez du noir”);
delay(3000);

lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“3…”);
delay(1000);

lcd.clear();
lcd.print(“2…”);
delay(1000);

lcd.clear();
lcd.print(“1…”);
delay(1000);

lcd.clear();
lcd.print(“0!”);
delay(200);
lcd.clear();
lcd.print (“acquisition”);

//rouge d’abord
pixels.setPixelColor(0, pixels.Color(255,0,0)); //rouge
pixels.show();
delay(100);
blackArray[0] = getReading(5); // une moyenne est prise sur le nombre de lectures indiqué entre parenthèses.
pixels.setPixelColor(0, pixels.Color(0,0,0));
pixels.show();
delay(100);
//ensuite vert
pixels.setPixelColor(0, pixels.Color(0,255,0));
pixels.show();
delay(100);
blackArray[1] = getReading(5); // une moyenne est prise sur le nombre de lectures indiqué entre parenthèses.
pixels.setPixelColor(0, pixels.Color(0,0,0));
pixels.show();
delay(100);
//puis bleu
pixels.setPixelColor(0, pixels.Color(0,0,255));
pixels.show();
delay(100);
blackArray[2] = getReading(5); // une moyenne est prise sur le nombre de lectures indiqué entre parenthèses.
pixels.setPixelColor(0, pixels.Color(0,0,0));
pixels.show();
delay(100);

// résultats de la calibration affichés au moniteur série
// (utile seulement pour déboguer).

lcd.clear();
lcd.setCursor(0,0);
lcd.print (“Blancs:”);
lcd.print(” R:”);
lcd.print (whiteArray[0]);
lcd.setCursor(0,1);
lcd.print (” G:”);
lcd.print (whiteArray[1]);
lcd.print (” B:”);
lcd.print (whiteArray[2]);
delay(5000);

lcd.clear();
lcd.setCursor(0,0);
lcd.print (“Noirs:”);
lcd.print(” R:”);
lcd.print (blackArray[0]);
lcd.setCursor(0,1);
lcd.print (” G:”);
lcd.print (blackArray[1]);
lcd.print (” B:”);
lcd.print (blackArray[2]);
delay(5000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“termine !”);
delay(2000);
lcd.clear();

}
void checkRGB(){
for (int i=0; i <= 2; i++){
if(i==0){r=255; g=0; b=0;}//en fonction de la boucle on choisit la couleur
if(i==1){r=0; g=255; b=0;}
if(i==2){r=0; g=0; b=255;}

pixels.setPixelColor(0, pixels.Color(r,g,b));
pixels.show();
delay(100); //on laisse à la photorésistance le temps de réagir
colourArray[i] = getReading(10); //on lit la photorésistance (moyenne sur plusieurs lectures)
float greyDiff = whiteArray[i] – blackArray[i]; // différence entre blanc et noir
colourArray[i] = (colourArray[i] – blackArray[i])/(greyDiff)*255; // conversion pour donner une valeur entre 0 et 255

if (colourArray[i] < 0){ // pas de valeur négative SVP
colourArray[i] = 0;
}
pixels.setPixelColor(0, pixels.Color(0,0,0));
pixels.show();
delay(100);
}
short total = colourArray[0] + colourArray[1] + colourArray[2];
ConvertedArray[0] = colourArray[0]*100/total; //Red
ConvertedArray[1] = colourArray[1]*100/total; //Green
ConvertedArray[2] = colourArray[2]*100/total; //Blue
Serial.print(ConvertedArray[0]);
Serial.print(ConvertedArray[1]);
Serial.println(ConvertedArray[2]);
Serial.println(” “);
}
void checkColour(){
lcd.clear();
lcd.setCursor(0,0);

for (int i=0; i <= 2; i++){
if(i==0){r=255; g=0; b=0;}//en fonction de la boucle on choisit la couleur
if(i==1){r=0; g=255; b=0;}
if(i==2){r=0; g=0; b=255;}

pixels.setPixelColor(0, pixels.Color(r,g,b));
pixels.show();
delay(100); //on laisse à la photorésistance le temps de réagir
colourArray[i] = getReading(10); //on lit la photorésistance (moyenne sur plusieurs lectures)
float greyDiff = whiteArray[i] – blackArray[i]; // différence entre blanc et noir
colourArray[i] = (colourArray[i] – blackArray[i])/(greyDiff)*255; // conversion pour donner une valeur entre 0 et 255

if (colourArray[i] < 0){ // pas de valeur négative SVP
colourArray[i] = 0;
}
pixels.setPixelColor(0, pixels.Color(0,0,0));
pixels.show();
delay(100);
}
// on écrit le code RGB au moniteur série

lcd.print(“R=”);
lcd.print(int(colourArray[0]));
lcd.print(” G=”);
lcd.print(int(colourArray[1]));
lcd.setCursor(0,1);
lcd.print(” B = “);
lcd.print(int(colourArray[2]));
delay(1000);
lcd.clear();

// de quelle couleur s’agit-il?

// pour la suite, pondérons les valeurs pour que le total des 3 donne 100
short total = colourArray[0] + colourArray[1] + colourArray[2];
ConvertedArray[0] = colourArray[0]*100/total;
ConvertedArray[1] = colourArray[1]*100/total;
ConvertedArray[2] = colourArray[2]*100/total;

// on écrit le code RGB pondérés au moniteur série
lcd.setCursor(0,0);
lcd.print(“R=”);
lcd.print(int(ConvertedArray[0]));
lcd.print(“%”);
lcd.print(” G =”);
lcd.print(int(ConvertedArray[1]));
lcd.print(“%”);
lcd.setCursor(0,1);
lcd.print(” B=”);
lcd.print(int(ConvertedArray[2]));
lcd.print(“%”);
delay(2000);
lcd.clear();
identificationCouleur();

}

// on essaie de nommer la couleur à partir du code RGB
void identificationCouleur(void){
// si les 3 valeurs sont trés élevées, c’est du blanc
if (colourArray[0] > 240 && colourArray[1] > 240 && colourArray[2] > 240) {
lcd.print(“Blanc”);
}

// si les 3 valeurs sont très basses, c’est du noir
else if (colourArray[0] < 30 && colourArray[1] < 30 && colourArray[2] < 30) {
lcd.print(“Noir”);
}

// si les 3 valeurs sont équivalentes, c’est du gris
else if (ConvertedArray[0] > 28 && ConvertedArray[0] < 38 && ConvertedArray[1] > 28 && ConvertedArray[1] < 38 && ConvertedArray[2] > 28 && ConvertedArray[2] < 38) {
lcd.print(“Gris”);
}

//plutôt rouge
else if (ConvertedArray[0] > 55) {
if (ConvertedArray[1] > 20) {
lcd.print(“Orange”);
}
else {
lcd.print(“Rouge”);
}

}

// plutôt vert
else if (ConvertedArray[1] > 55) {
lcd.print(“Vert”);
}

// plutôt bleu
else if (ConvertedArray[2] > 55) {
lcd.print(“Bleu”);
}

else if (ConvertedArray[0] + ConvertedArray[1] > 80) {
lcd.print(“Jaune”);
}

else if (ConvertedArray[0] + ConvertedArray[2] > 80) {
lcd.print(“Violet”);
}
else if (ConvertedArray[1] + ConvertedArray[2] > 80) {
lcd.print(“Turquoise”);
}

else{
lcd.print(“???”);
}

}

// lecture de la valeur de la photorésistance
// (on mesure plusieurs fois consécutives, et on retourne la moyenne)
int getReading(int times){
int reading;
int tally=0;

for(int i = 0;i < times;i++){
reading = analogRead(0);
tally = reading + tally;
delay(10);
}

return (tally)/times; // moyenne des mesures
}