int RedPin = 11; int GreenPin = 10; int BluePin = 9; void setup() { Serial.begin(9600); Serial.flush(); pinMode(RedPin, OUTPUT); pinMode(GreenPin, OUTPUT); pinMode(BluePin, OUTPUT); } void loop() { if (Serial.available() > 0) { int index=0; delay(100); // let the buffer fill up int numChar = Serial.available(); if (numChar>15) { numChar=15; } while (numChar--) { buffer[index++] = Serial.read(); } splitString(buffer); } } void splitString(char* data) { Serial.print("Data entered: "); Serial.println(data); char* parameter; parameter = strtok (data, " ,"); while (parameter != NULL) { setLED(parameter); parameter = strtok (NULL, " ,"); } // Clear the text and serial buffers for (int x=0; x<16; x++) { buffer[x]='\0'; } Serial.flush(); } void setLED(char* data) { if ((data[0] == 'r') || (data[0] == 'R')) { int Ans = strtol(data+1, NULL, 10); Ans = constrain(Ans,0,255); analogWrite(RedPin, Ans); Serial.print("Red is set to: "); Serial.println(Ans); } if ((data[0] == 'g') || (data[0] == 'G')) { int Ans = strtol(data+1, NULL, 10); Ans = constrain(Ans,0,255); analogWrite(GreenPin, Ans); Serial.print("Green is set to: "); Serial.println(Ans); } if ((data[0] == 'b') || (data[0] == 'B')) { int Ans = strtol(data+1, NULL, 10); Ans = constrain(Ans,0,255); analogWrite(BluePin, Ans); Serial.print("Blue is set to: "); Serial.println(Ans); } } uma vez que voc verlflcar o cdlgo faa o upload para o seu Ardulno Agora quando voc carregar o programa nada parece aconLecer lsso ocorre porque o programa esL esperando por sua enLrada lnlcle o MonlLor de serle cllcando no lcone na barra de Larefas luL Ardulno na [anela de LexLo Serlal MonlLor voc pode agora enLrar 8 C e 8 os valores para cada um dos Lrs LLus manualmenLe e os dlodos emlssores de luz mudar para a cor que voc Lm enLrada or exemplo Se voc dlglLar 8233 o LLu vermelho lr exlblr a plena brllho Se voc dlglLar 8233 C233 em segulda LanLo o vermelho e verde LLus lr mosLrar em pleno brllho Agora enLra 8127 C100 8233 e voc obLer um bom cor arroxeada Se voc dlglLar r0 g0 b0 Lodos os dlodos emlssores de luz ser desllgada C LexLo de enLrada e pro[eLada para acelLar LanLo uma mlnuscula ou malusculas 8 C e 8 e em segulda um valor 0233 Cualsquer valores aclma de 233 sero descarLados balxo a 233 no mxlmo voc pode lnserlr uma vlrgula ou um espao enLre os parmeLros e voc pode enLrar 1 2 ou 3 LLu valores a qualquer momenLo or exemplo r233 8100 r127 b127 g127 C233 80 8127 80 C233 LLc
LsLe pro[eLo apresenLa um monLe de novos concelLos lnclulndo a comunlcao serlal os ponLelros e manlpulao de sLrlng LnLo segure flrme em seus chapeus presenLe Ler mulLo a expllcar rlmelro vamos crlar um array de char (personagens) para manLer nossa cadela de LexLo 1emos felLo lsso 18 caracLeres whlchls mals do que o mxlmo de 16 ns permlLlremos para assegurar ns no Lemos buffer overflow erros
char buffer[18];
Lm segulda conflgurar os lnLelros para segurar os valores vermelho verde e azul bem como os valores para o dlglLal plnos
int red, green, blue;
int RedPin = 11; int GreenPin = 10; int BluePin = 9; Lm nossa funo de conflgurao que deflnlr o 3 plnos dlglLal a ser saldas Mas anLes dlsso Lemos a Serlalbegln comando void setup() { Serial.begin(9600); Serial.flush(); pinMode(RedPin, OUTPUT); pinMode(GreenPin, OUTPUT); pinMode(BluePin, OUTPUT); } Serlalbegln dlz o Ardulno para lnlclar a serle comunlcaes e do numero denLro da parnLese nesLe caso 9600 deflne a Laxa de Lransmlsso (CaracLeres por segundo) que a llnha serlal ser comunlcarse C comando Serlalflush val expulsar qualquer caracLeres que aconLecer para esLar na llnha serlal de modo que e vazla e pronLa para enLrada / salda A llnha de comunlcao serlal e slmplesmenLe uma forma de o Ardulno para se comunlcar com o mundo exLerlor e nesLe caso e para o C e os luLs Ardulno Serlal MonlLor no loop prlnclpal Lemos um lf C condlo que esL verlflcando se if (Serial.available() > 0) { C comando verlflca Serlalavallable para ver se algum caracLeres foram envlados para balxo da llnha serlal Se algum caracLeres foram recebldos em segulda a condlo so saLlsfelLas e o cdlgo denLro do bloco lf cdlgo agora e execuLado if (Serial.available() > 0) { int index=0; delay(100); // let the buffer fill up int numChar = Serial.available(); if (numChar>15) { numChar=15; } while (numChar--) { buffer[index++] = Serial.read(); } splitString(buffer); } } um lnLelro chamado lndex e declarado e lnlclallzado como zero LsLe lnLelro val manLer a poslo de um ponLelro para os personagens denLro da maLrlz char Lm segulda deflnlr um aLraso de 100 C ob[eLlvo desLe e assegurar que o buffer serlal (o lugar na memrla onde os dados serlal que e recebldo e armazenado anLes de processamenLo) esL chelo anLes de conLlnuar e processo os dados Se ns no fazemos lsso e posslvel que o funo lr execuLar e comear a processar o LexLo sequncla anLes de Ler recebldo a LoLalldade dos dados C llnha de comunlcao serlal e mulLo lenLa em comparao com a velocldade do resLo do cdlgo esL sendo execuLado no Cuando envlar uma sequncla de caracLeres a Serlalavallable funo Ler lmedlaLamenLe um valor superlor zero e se a funo val comear a execuLar Se no Llve o aLraso (100) declarao em que ele poderla comear a execuLar o cdlgo denLro do lf anLes de Lodos da cadela de LexLo havla sldo receblda e serlal de dados s podem ser os prlmelros caracLeres do llnha do LexLo dlglLado uepols ns Lemos que esperar para 100ms para o buffer serlal para preencher com os dados envlados que em segulda declarar e lnlclallzar o lnLelro numChar a ser o numero de caracLeres na sequncla de LexLo or exemplo Se nos envlou esLe LexLo no MonlLor de serle 8233 C233 8233 LnLo o valor de numChar serla 17 L 17 e no 16 como no flnal de cada llnha do LexLo h uma personagem lnvlslvel chamado um caracLere nuLL LsLe e um slmbolo nada e slmplesmenLe dlz o que o Ardulno flm da llnha do LexLo fol aLlngldo A prxlma lnsLruo lf verlflca se o valor da numChar e superlor a 13 ou no e se asslm ele deflne como sendo de 13 lsso garanLe que no esLouro da maLrlz
char buffer[18];
uepols vem um comando enquanLo lsso e algo ns Lemos deparados anLes enLo delxeme expllcar ns [ usamos o loop for o que ser um loop numero deflnldo de vezes A aflrmao enquanLo Lambem e um loop mas que execuLa somenLe quando uma condlo e verdadelro A slnLaxe e
while(expression) { // statement(s) }
Lm nosso cdlgo o loop whlle e
while (numChar--) { buffer[index++] = Serial.read(); }
A condlo e a verlflcao e slmplesmenLe numChar porLanLo em ouLras palavras e verlflcar que o valor armazenado no numChar lnLelro no e zero numChar Lem aps ele lsLo e o que e conhecldo como ps decremenLar Lm ouLras palavras o valor e dlmlnuldo aps o uso Se Llvessemos usado o valor serla numChar em numChar ser dlmlnuldo (Lem uma subLraldo) anLes fol avallado no nosso caso enquanLo a verlflcaes de loop o valor de numChar e em segulda subLral um do mesmo Se o valor da numChar no era zero anLes da dlmlnulr enLo carrega o cdlgo em seu cdlgo bloco numChar e deflnldo como o comprlmenLo da sequncla de LexLo que enLraram na [anela MonlLor de serle Asslm o cdlgo denLro do loop ser execuLado enquanLo que mulLos vezes C cdlgo denLro do loop whlle e
buffer[index++] = Serial.read();
Cue deflne cada elemenLo da maLrlz de buffer para cada caracLere lldo a parLlr da llnha serlal Lm ouLras palavras ele enche o buffer maLrlz com as leLras que ns Lemos enLrou na [anela Serlal MonlLores de LexLo C Serlalread () comando l serlal de enLrada dados um byLe de cada vez LnLo agora que a nossa maLrlz de caracLeres fol preenchldo com os personagens que enLraram no MonlLor de serle do whlle Lermlna quando aLlnge numChar zero (ou se[a C comprlmenLo da corda) uepols que o loop enquanLo Lemos