Partage
  • Partager sur Facebook
  • Partager sur Twitter

[ARDUINO] Serial.read() toujours actif

Sujet résolu
    14 octobre 2019 à 11:59:01

    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".

    Vous comprenez ce que je veux dire ?

    Merci ^^ bonne journée

    • Partager sur Facebook
    • Partager sur Twitter

    Développeur Web & Skript

      14 octobre 2019 à 13:44:16

      Salut,

      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

      • Partager sur Facebook
      • Partager sur Twitter
      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
        14 octobre 2019 à 17:36:10

        Bonjour,

        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;
          }
        }
        • Partager sur Facebook
        • Partager sur Twitter

        En recherche d'emploi.

          17 octobre 2019 à 8:15:41

          Bonjour, merci beaucoup à vous deux.

          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

          • Partager sur Facebook
          • Partager sur Twitter

          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.
          • Editeur
          • Markdown