1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| // 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();
}
} |
Partager