O protocolo I2C foi criado pela Philips Semicondutors com o intuito de conectar dispositivos de baixa velocidade. Ele funciona utilizando apenas dois fios para a comunicação: o SCL (Serial Clock) e o SDA (Serial Data). Para fazer essa comunicação, o Microcontrolador é declarado Master (Mestre), e os demais sensores como Slaves (Escravos). E isso é alcançável graças ao uso dos endereços, que são únicos. Como todos os TCS34725 têm o mesmo endereço, surge a ideia de conectar dois sensores I₂C na mesma placa Arduino Uno, utilizando o CI Demultiplexador CD4051.
O circuito será o seguinte:

O código será o seguinte:
//inclui as bibliotecas
#include <Wire.h>
#include "Adafruit_TCS34725.h"
//indica o endereço dos sensores
Adafruit_TCS34725 sensTCS1 = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_300MS, TCS34725_GAIN_1X);
Adafruit_TCS34725 sensTCS2 = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_300MS, TCS34725_GAIN_1X);
//Configura os pinos que irão se conectar ao Chip CD4051
const int pinAddA = 5;
const int pinAddB = 6;
const int pinAddC = 7;
void setup() {
Serial.begin(9600);
pinMode(pinAddA, OUTPUT); //define as portas como saída
pinMode(pinAddB, OUTPUT);
pinMode(pinAddC, OUTPUT);
selSens1(); //chama a função para escolher o sensor 1
if (sensTCS1.begin()) {
Serial.println("Sensor1 conectado"); // verifica se o sensor se conectou com sucesso
} else {
Serial.println("Sensor1 com problema");
}
selSens2(); //chama a função para escolher o sensor 2
if (sensTCS2.begin()) {
Serial.println("Sensor2 conectado"); // verifica se o sensor se conectou com sucesso
} else {
Serial.println("Sensor2 com problema");
}
}
void loop() {
//declara os variáveis locais
uint16_t r1, g1, b1, c1, TemperaturaDaCor1, LUX1;
uint16_t r2, g2, b2, c2, TemperaturaDaCor2, LUX2;
selSens1(); //chama a função para selecionar o sensor 1
sensTCS1.getRawData(&r1, &g1, &b1, &c1); //recebe os valores de R,G,B e luminosidade
TemperaturaDaCor1 = sensTCS1.calculateColorTemperature(r1, g1, b1); //calcula a temperatura da cor
LUX1 = sensTCS1.calculateLux(r1, g1, b1);
if (c1 < 5000) { //se a luminosidade for menor do que 5000
if (r1 > b1 && r1 > g1 && r1 > 100) { //compara os valores de R , G e B para mostrar qual cor está na frente do sensor
Serial.println("Sens1 : Vermelho");
delay(100);
}
else if (g1 > r1 && g1 > b1 && g1 > 100 ) {
Serial.println("Sens1 : Verde");
delay(100);
}
else if (b1 > r1 && b1 > g1 && b1 > 100) {
Serial.println("Sens1 : Azul");
delay(100);
}
}
selSens2(); //chama a função para selecionar o sensor 2
sensTCS2.getRawData(&r2, &g2, &b2, &c2); //recebe os valores de R,G,B e luminosidade
TemperaturaDaCor2 = sensTCS1.calculateColorTemperature(r2, g2, b2);
LUX2 = sensTCS2.calculateLux(r2, g2, b2);
if (c2 < 5000) { //se a luminosidade for menor do que 5000
if (r2 > b2 && r2 > g2 && r2 > 100) { //compara os valores de R , G e B para mostrar qual cor está na frente do sensor
Serial.println("Sens2 : Vermelho");
delay(100);
}
else if (g2 > r2 && g2 > b2 && g2 > 100 ) {
Serial.println("Sens2 : Verde");
delay(100);
}
else if (b2 > r2 && b2 > g2 && b2 > 100) {
Serial.println("Sens2 : Azul");
delay(100);
}
}
}
void selSens1() { //função responsável por selecionar o sensor 1
digitalWrite(pinAddA, LOW);
digitalWrite(pinAddB, LOW);
digitalWrite(pinAddC, LOW);
}
void selSens2() { //função responsável por selecionar o sensor 2
digitalWrite(pinAddA, HIGH);
digitalWrite(pinAddB, LOW);
digitalWrite(pinAddC, LOW);
}

De acordo com os 3 pinos do chip que estão conectados, é possível selecionar qual sensor será lido naquele momento.

|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!