voilà - mine de rien on a tout ce qu'il nous faut pour travailler. une fonction dans la boucle attend une action utilisateur et la capture au plus vite. le reste ne dépend plus que de vous. Généralement on veut construire un chaine de caractère tant qu'on n'a pas reçu le marqueur de fin de chaîne et lorsqu'on a notre message on voudra effectuer une action.
Pour cela on va modifier un peu la fonction ecouter() pour qu'elle construise la chaine de caractères petit à petit, et qu'elle nous dise si oui ou non on est encore en attente de notre marqueur de fin.
Pour simplifier on va travailler avec un buffer global qui mémorise tout ce qu'on tape. Bien sûr il aura une taille limitée, à vous de le dimensionner correctement en fonction de ce que vous attendez et dans le code d'éviter un débordement de tableau. La tactique adoptée ici c'est que toutes les lettres reçues après la fin du tableau sont ignorées et on ne conserve que le début du message.
Voici un petit code à essayer.
const byte tailleMessageMax = 50;
char message[tailleMessageMax + 1]; // +1 car on doit avoir un caractère de fin de chaîne en C, le '\0'
const char marqueurDeFin = '#';
boolean ecouter()
{
static byte indexMessage = 0; // static pour se souvenir de cette variable entre 2 appels consécutifs. initialisée qu'une seule fois.
boolean messageEnCours = true;
while (Serial.available() && messageEnCours) {
int c = Serial.read();
if (c != -1) {
Serial.print(F("Octet lu: 0x")); Serial.print(c, HEX); // ici c est un entier, on affiche le code ASCII en Hexadécimal
Serial.print(F("\t[")); Serial.print((char) c); Serial.println(F("]"));
switch (c) {
case marqueurDeFin:
Serial.println(F("Fin de chaine"));
message[indexMessage] = '\0'; // on termine la c-string
indexMessage = 0; // on se remet au début pour la prochaine fois
messageEnCours = false;
break;
default:
if (indexMessage <= tailleMessageMax - 1) message[indexMessage++] = (char) c; // on stocke le caractère et on passe à la case suivante
else Serial.println(F("j'ignore!"));
break;
}
}
}
return messageEnCours;
}
void setup() {
Serial.begin(115200);
}
void loop() {
if (! ecouter()) {
// on a reçu le marqueur de fin
Serial.print(F("Phrase: [")); Serial.print(message); Serial.println(F("]"));
}
// ici on peut faire autre chose
}
Le marqueur de fin de chaîne a été mis à '#' dans le code, donc si vous tapez coucou# le tableau de caractère message va contenir le mot "coucou" (enlevez le CR LF dans la console pour éviter de recevoir aussi ces caractères qui ne s'impriment pas. On pourrait aussi dire que l'on veut '\n' comme marqueur de fin)
de la même façon avec un clavier à membrane, on construit notre message au fil de l'eau
#include <Keypad.h>
const byte ROWS = 4; //4 rangées
const byte COLS = 4; //4 colonnes
char keys[ROWS][COLS] = { //les symboles, déclarés par leur code ASCII dans le tableau à 2 dimension
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = { 34, 36, 38, 40 }; // On connecte ROW0, ROW1, ROW2 and ROW3 à ces pins (je suis sur un MEGA)
byte colPins[COLS] = {41, 39, 37, 35}; // On connecte COL0, COL1, COL2 and COL3 à ces pins (je suis sur un MEGA)
Keypad membraneKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS); //On initialise une instance de la classe Keypad
const byte tailleMessageMax = 50;
char message[tailleMessageMax + 1]; // +1 car on doit avoir un caractère de fin de chaîne en C, le '\0'
const char marqueurDeFin = '#';
boolean ecouter()
{
static byte indexMessage = 0; // static pour se souvenir de cette variable entre 2 appels consécutifs. initialisée qu'une seule fois.
boolean messageEnCours = true;
char c = membraneKeypad.getKey();
if (c != NO_KEY) {
Serial.print(F("Octet lu: 0x")); Serial.print((byte) c, HEX); // on convertit c en entier, on affiche le code ASCII en Hexadécimal
Serial.print(F(" caractere: [")); Serial.print(c); Serial.println(F("]"));
if (c == marqueurDeFin) {
Serial.println(F("Fin de chaine"));
message[indexMessage] = '\0'; // on termine la c-string
indexMessage = 0; // on se remet au début pour la prochaine fois
messageEnCours = false;
} else if (indexMessage <= tailleMessageMax - 1) message[indexMessage++] = (char) c; // on stocke le caractère et on passe à la case suivante
else Serial.println(F("j'ignore!"));
}
return messageEnCours;
}
void setup() {
Serial.begin(115200);
}
void loop() {
if (! ecouter()) {
// on a reçu le marqueur de fin
Serial.print(F("Phrase: [")); Serial.print(message); Serial.println(F("]"));
}
// ici on peut faire autre chose
}
et si je tape 123# sur mon clavier, la console dira
[sub][color=blue][nobbc]Octet lu: 0x31 caractere: [1]
Octet lu: 0x32 caractere: [2]
Octet lu: 0x33 caractere: [3]
Octet lu: 0x23 caractere: [#]
Fin de chaine
Phrase: [123][/nobbc]
[/color][/sub]
