// les pins de la led RVG
const byte rPin = 6;
const byte vPin = 5;
const byte bPin = 3;
byte rouge = 0, vert = 0, bleu = 0; // les composantes entre 0 et 255
const byte longeurMaxMessage = 30;
char message[longeurMaxMessage + 1]; // + 1 pour le caractère nul en fin de chaîne
bool messageDisponible(const char marqueurDeFin = '\n') {
static byte indiceEnCours = 0;
int r = Serial.read();
if (r == -1) return false; // Il n'y a rien à lire
if (r == marqueurDeFin) { // si c'est le marqueur de fin
message[indiceEnCours] = '\0'; // on termine la c-string
indiceEnCours = 0; // on se prépare pour la prochaine fois
return true; // on dit que le message est disponible
}
if (indiceEnCours < longeurMaxMessage) { // s'il y a encore de la place
message[indiceEnCours++] = r; // on stocke le caractère et incrémente l'indice
}
return false; // Le message n'est pas terminé
}
void gestionLed(byte r, byte v, byte b) {
analogWrite(rPin, r);
analogWrite(vPin, v);
analogWrite(bPin, b);
}
void traiterCommande(const char * element) {
Serial.print("Element \"");
Serial.print(element);
Serial.println("\"");
long valeur;
char * endPtr;
const char * debut = element;
while (*debut == ' ') debut++; // on saute les espace en début de chaîne
if (*(debut + 1) != '=') return; // On doit avoir un seul caractère suivi de =
switch (*debut) { // on regarde le premier caractère
case 'r':
case 'R':
Serial.println("\tRouge");
valeur = strtol(debut + 2, &endPtr, 10 );
if (endPtr == debut + 2) return; // on n'a pas réussi à lire un entier
if (valeur <= 0) rouge = 0;
else if (valeur > 255) rouge = 255;
else rouge = valeur;
Serial.write('\t'); Serial.println(rouge);
break;
case 'v':
case 'V':
Serial.println("\tVert");
valeur = strtol(debut + 2, &endPtr, 10 );
if (endPtr == debut + 2) return; // on n'a pas réussi à lire un entier
if (valeur <= 0) vert = 0;
else if (valeur > 255) vert = 255;
else vert = valeur;
Serial.write('\t'); Serial.println(vert);
break;
case 'b':
case 'B':
Serial.println("\tBleu");
valeur = strtol(debut + 2, &endPtr, 10 );
if (endPtr == debut + 2) return; // on n'a pas réussi à lire un entier
if (valeur <= 0) bleu = 0;
else if (valeur > 255) bleu = 255;
else bleu = valeur;
Serial.write('\t'); Serial.println(bleu);
break;
default: break;
}
}
void traiterMessage(const char separateur = ',') {
Serial.print("J'analyse \"");
Serial.print(message);
Serial.println("\"");
char * debutCommande = message;
char * virgulePtr;
do {
virgulePtr = strchr(debutCommande, separateur);
if (virgulePtr == nullptr) { // il n'y a plus de séparateur
traiterCommande(debutCommande);
break;
} else {
*virgulePtr = '\0'; // on coupe la chaîne à cet endroit
traiterCommande(debutCommande); // on effectue l'analyse
*virgulePtr = separateur; // on remet comme c'était
debutCommande = virgulePtr + 1; // on continue l'exploration après la virgule
}
} while (*debutCommande != '\0'); // on continue tant qu'on n'est pas au bout (pas de caractère nul pointé par debut)
gestionLed(rouge, vert, bleu); // on applique les changements
}
void setup() {
pinMode(rPin, OUTPUT);
pinMode(vPin, OUTPUT);
pinMode(bPin, OUTPUT);
Serial.begin(115200); Serial.println();
Serial.println("Entrez des commandes des couleur, par exemple pour du jaune -> r=255,v=255,b=0");
}
void loop() {
if (messageDisponible()) {
traiterMessage();
}
}