Hi everyone, I am currently doing a project to create an educational tool for blind children to learn about colours. I'm using Arduino Nano, TCS34725 and Mini MP3 Module. I would like to detect colour using the TCS34725, and play the respective colour name - if it detects red, the audio output will be 'red'. Does anybody know how my current code can be improved? As I'm unable to get it to have an audio output. Thank you very much!
#include "Wire.h"
#include "Adafruit_TCS34725.h"
#include "SoftwareSerial.h"
SoftwareSerial mySerial(10, 11);
define Start_Byte 0x7E
define Version_Byte 0xFF
define Command_Length 0x06
define End_Byte 0xEF
define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info]
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_1X);
void setup() {
// Serielle Kommunikation zur Ausgabe der Wert im seriellen Monitor
Serial.begin(9600);
Serial.println("Makerblog.at - MuMs Color Sensor");
mySerial.begin (9600);
// Überprüfen, ob Color Sensor sich auch zurückmeldet
if (tcs.begin()) {
// Alles OK
Serial.println("Sensor found");
} else {
// Kein Sensor gefunden. Programm an dieser Stelle einfrieren
Serial.println("TCS34725 Sensor not found");
while (1); // Halt!
}
}
// loop() wird wiederholt, solange der Arduino läuft
void loop() {
// Der Sensor liefert Werte für R, G, B und einen Clear-Wert zurück
uint16_t clearcol, red, green, blue;
float average, r, g, b;
delay(200); // Farbmessung dauert c. 50ms
tcs.getRawData(&red, &green, &blue, &clearcol);
average = (red+green+blue)/3;
r = red/average;
g = green/average;
b = blue/average;
/*
Serial.print(r);
Serial.print(" ");
Serial.print(g);
Serial.print(" ");
Serial.print(b);
Serial.println(" ");
*/
// Colour detection
if ((r < 1.20) && (r > 0.80) && (g < 1.20) && (g > 1.00) && (b > 0.90) && (b < 1.05)) { //no colour
Serial.println("No color detected");
}
if ((r > 1.75) && (r < 1.85) && (g < 0.67) && (g > 0.60) && (b < 0.65) && (b > 0.58)) { //red
Serial.println("red");
}
else if ((r < 0.75) && (r > 0.65) && (g > 1.54) && (g < 1.60) && (b < 0.77) && (b > 0.70)) { //green
Serial.println("green");
}
else if ((r < 0.75) && (r > 0.66) && (g < 1.27) && (g > 1.22) && (b > 1.04) && (b < 1.10)) { //blue
Serial.println("blue");
}
else if ((r > 1) && (r < 1.06) && (g > 1.20) && (g < 1.26) && (b < 0.78) && (b > 0.70)) { //yellow
Serial.println("yellow");
}
else if ((r > 1.8) && (r < 1.94) && (g < 0.72) && (g > 0.65) && (b < 0.5) && (b > 0.42)) { //orange
Serial.println("orange");
}
else if ((r < 0.88) && (r > 0.80) && (g < 1.1) && (g > 1.02) && (b > 1.1) && (b < 1.16)) { //purple
Serial.println("purple");
}
else if ((r > 1.05) && (r < 1.12) && (g > 0.95) && (g > 0.98) && (b < 0.95) && (b > 0.88)) { //brown
Serial.println("brown");
}
else if ((r > 0.83) && (r < 0.88) && (g > 1.09) && (g < 1.16) && (b < 1.04) && (b > 0.98)) { //white
Serial.println("white");
}
else if ((r > 1.12) && (r < 1.19) && (g < 0.97) && (g > 0.91) && (b < 0.94) && (b > 0.87)) { //pink
Serial.println("pink");
}
else if ((r < 0.98) && (r > 0.90) && (g < 1.22) && (g > 1.10) && (b > 0.9) && (b < 1.05)) { //black
Serial.println("black");
}
else if ((r > 0.85) && (r < 0.95) && (g < 1.2) && (g > 1.08) && (b < 1.02) && (b > 0.95)) { //Gray
Serial.println("gray");
}
}
void play(int a){
for(int i = 0; i < a; i++){
playFirst();
playNext();
}
}
void playFirst()
{
execute_CMD(0x3F, 0, 0);
setVolume(20);
execute_CMD(0x11,0,1);
}
void pause()
{
execute_CMD(0x0E,0,0);
delay(500);
}
void play1()
{
execute_CMD(0x0D,0,1);
delay(500);
}
void playNext()
{
execute_CMD(0x01,0,1);
delay(500);
}
void playPrevious()
{
execute_CMD(0x02,0,1);
delay(500);
}
void setVolume(int volume)
{
execute_CMD(0x06, 0, volume); // Set the volume (0x00~0x30)
delay(2000);
}
void execute_CMD(byte CMD, byte Par1, byte Par2)
// Excecute the command and parameters
{
// Calculate the checksum (2 bytes)
word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);
// Build the command line
byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge,
Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte};
//Send the command line to the module
for (byte k=0; k<10; k++)
{
mySerial.write( Command_line[k]);
}
}