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.
Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!