Bonjour, j'ai actuellement un programme Arduino. Quand je le lance il m'écrit en boucle "Erreur saisie" parce que je n'ai rien mis dans ma variable Serial.read() du coup.
Je vous montre le code :
void setup()
{
Serial.begin(9600);
Serial.print("Quelle valeur voulez vous afficher ?");
Serial.println();
}
void loop()
{
if (Serial.read() == 'T') {
Serial.print ("La température est de 25°C");
Serial.println();
}
else if (Serial.read() == 'H') {
Serial.print ("L'humidité est de 50%");
Serial.println();
}
else {
Serial.print ("Erreur saisie");
Serial.println();
}
}
Je voudrais que dès que je tape "T" ou "H", le programme me dise la température ou l'humidité. Si c'est une autre valeur que "T "ou "H", je voudrais qu'il me dise "Erreur saisie".
Déjà, il serait sans doute utile d'afficher le message "quelle valeur voulez vous afficher?" à chaque fois que tu attends une introduction de la part de l'utilisateur, car, autrement, il ne saura pas forcément ce qu'il doit faire pour obtenir les affichages suivants.
De plus, tu te retrouves à faire deux lectures de saisies par boucle, alors que le but est ... de faire une saisie et de prévoir trois cas particuliers en fonction de son résultat.
ton code devrait donc ressembler d'avantage à quelque chose comme
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.begin(9600);
Serial.print("Quelle valeur voulez vous afficher ?");
Serial.println();
char recup = Serial.read();
if ( recup == 'T') {
Serial.print ("La température est de 25°C");
Serial.println();
}
else if (recup == 'H') {
Serial.print ("L'humidité est de 50%");
Serial.println();
}
else {
Serial.print ("Erreur saisie");
Serial.println();
}
}
Et, du coup, il devrait être possible d'utiliser la notion de "tests à choix multiple" pour déterminer ce que l'utilisateur veut faire, sous une forme proche de
void loop()
{
Serial.print("Quelle valeur voulez vous afficher ?");
Serial.println();
char recup = Serial.read();
switch(recup){
case 'T':
Serial.print ("La température est de 25°C");
break;
case 'H':
Serial.print ("L'humidité est de 50%");
break;
default:
Serial.print ("Erreur saisie");
Serial.print ("Veuillez choisir ''T''ou ''H'' uniquement");
}
Serial.println();
}
De cette manière, chaque fois que l'utilisateur effectuera un choix, le retour à la ligne de la dernière ligne sera systématiquement effectué après l'affichage correspondant au choix de l'utilisateur
- Edité par koala01 14 octobre 2019 à 13:45:08
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
Attention la fonction loop() est faite pour être appelée à la plus haute fréquence possible. Il s'ensuit que l'on de peut rien y faire de bloquant. D'ailleurs il doit y avoir très peu de fonction Arduino qui soient bloquantes. En particulier la fonction Serial.read() ne va pas attendre une réponse mais va retourner le dernièr caractère reçu ou bien la valeur -1 quand la réception est vide.
Et en fonction des capacité d'affichage, il ne faut pas s'emballer à écrire des textes successifs sans action de l'opérateur ou des "timeout"
void setup()
{
Serial.begin(9600);
}
enum EtatCourant {
Initialisation,
AttenteReponse,
ReponduTemp,
ReponduHumid,
} etat = Initialisation;
void loop()
{
switch ( etat ) {
case Initialisation:
Serial.print("Quelle valeur voulez vous afficher ?");
Serial.println();
etat = AttenteReponse;
break;
case AttenteReponse:
switch ( Serial.read() ) {
case 'T':
Serial.print ("La température est de 25°C");
Serial.println();
etat = ReponduTemp;
break;
case 'H':
Serial.print ("L'humidité est de 50%");
Serial.println();
etat = ReponduHumid;
break;
case -1: // rien reçu il faut attendre
case '\n': // ignorer terminateur
break;
default:
Serial.print ("Erreur saisie");
Serial.println();
break;
}
break;
case ReponduTemp:
// et maintenant peut être attendre un peu avant de continuer
break;
case ReponduHumid:
// et maintenant peut être attendre un peu avant de continuer
break;
}
}
Le programme fonctionne. Voici juste le code que j'utilise donc maintenant (le code de Dalfab avec 2 modifs) :
void setup()
{
Serial.begin(9600);
}
enum EtatCourant {
Initialisation,
AttenteReponse,
ReponduTemp,
ReponduHumid,
} etat = Initialisation;
void loop()
{
switch ( etat ) {
case Initialisation:
Serial.print("Quelle valeur voulez vous afficher ?");
Serial.println();
etat = AttenteReponse;
break;
case AttenteReponse:
switch ( Serial.read() ) {
case 'T':
Serial.print ("La température est de 25°C");
Serial.println();
etat = AttenteReponse;
break;
case 'H':
Serial.print ("L'humidité est de 50%");
Serial.println();
etat = AttenteReponse;
break;
case -1: // rien reçu il faut attendre
case '\n': // ignorer terminateur
break;
default:
Serial.print ("Erreur saisie");
Serial.println();
break;
}
break;
Les 2 derniers case ne me servent pas. J'ai donc modifié les ReponduTemp et ReponduHumid dans mon case AttenteReponse et j'ai supprimé ces variables dans l'enum EtatCourant.
Merci, de votre aide.
A bientôt
Développeur Web & Skript
[ARDUINO] Serial.read() toujours actif
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Développeur Web & Skript
En recherche d'emploi.
Développeur Web & Skript