uma adaptacao do coodigo encontrado em://http://www.elecfreaks.com/1666.html//e necessario a biblioteca Timer1 que pode ser baixada aqui://http://www.arduino.cc/playground/Code/Timer1// baixe renomei-a para TimerOne e adcione-a na pasta libriries da ide do arduino#include <TimerOne.h>#define OUT 2#define S2 5#define S3 6#define S0 3#define S1 4volatile int g_count =0;int g_flag = 0;int g_array[3] = {0};float g_SF[3] = {0};void setup(){ // Init TSC230 and setting Frequency. pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); pinMode(OUT, INPUT); digitalWrite(S0, LOW); // OUTPUT FREQUENCY SCALING 2% digitalWrite(S1, HIGH); Serial.begin(115200); Timer1.initialize(); // defaulte is 1s Timer1.attachInterrupt(TSC_Callback); attachInterrupt(0, TSC_Count, RISING); delay(4000); 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 estabeleceContato(); // aguarda contato com o processing}void loop(){ g_flag = 0; for(int i=0; i<3; i++) { int val = int(g_array[i] * g_SF[i]); val = constrain(val, 0, 255); Serial.write(val); } delay(4000);}// seta o filtrovoid TSC_FilterColor(int Level01, int Level02){ if(Level01 != 0) Level01 = HIGH; if(Level02 != 0) Level02 = HIGH; digitalWrite(S2, Level01); digitalWrite(S3, Level02);}// incrementa g_cont cada vex que a saida do sensor// vai do nivel baixo ao altovoid TSC_Count()// fincao chamada pela interrupcao{ g_count ++ ; // incrementa g_cont}void TSC_Callback(){ switch(g_flag) { case 0: TSC_WB(LOW, LOW); //Red break; case 1: g_array[0] = g_count; TSC_WB(HIGH, HIGH); //Green break; case 2: g_array[1] = g_count; TSC_WB(LOW, HIGH); //Blue break; case 3: 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) //balanceamento de branco{ g_count = 0; g_flag ++; TSC_FilterColor(Level0, Level1); Timer1.setPeriod(1000000); // define periodo de 1 segundo} void estabeleceContato() { while (Serial.available() <= 0) { Serial.write('A'); // envia A ate estabelecer contato delay(300); } }Codigo para o Processing:// Adaptado do exemplo SerialCallResponse que acompanha a IDE do Arduinoimport processing.serial.*; int comando =0; int y_01 = 55; Serial myPort; // porta serialint[] serialInArray = new int[3]; // vetor para armazenar o valores recebidosint serialCount = 0; // usado para contar o numero de bytes recebidosint[] buffer = new int[3];boolean firstContact = false; // Whether we've heard from the microcontrollervoid setup() { // imprime a lista de portas seriais println(Serial.list()); String portName = Serial.list()[0]; // substituir COM9 pela porta onde esta o Arduino myPort = new Serial(this, "COM9", 115200); size(800, 600); //janela, largura, altura smooth(); }void draw() { background(buffer[0],buffer[1],buffer[2]); }void serialEvent(Serial myPort) { // le os bytes da porta serial int inByte = myPort.read(); // se receber o primeiro byte e for 'A' if (firstContact == false) { if (inByte == 'A') { myPort.clear(); // Limpa o buffer da porta serial firstContact = true; // o primeiro contato ja ocorreu myPort.write('A'); // envia "A" para que o arduino // reconheca o primeiro contato } } else { // se nao for o primeiro byte adiciona-o ao vetor: serialInArray[serialCount] = inByte; serialCount++; // quando receber os 12 bytes armazena-os em buffer[i] if (serialCount > 2) { for(int i =0; i<3; i++) { buffer[i] = serialInArray[i]; } // envia comandos caso existam myPort.write(comando); // Reset serialCount: serialCount = 0; } }}