You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/fr/6-consumer/lessons/3-spoken-feedback/wio-terminal-set-timer.md

11 KiB

Régler un minuteur - Wio Terminal

Dans cette partie de la leçon, vous allez appeler votre code serverless pour comprendre la parole et régler un minuteur sur votre Wio Terminal en fonction des résultats.

Régler un minuteur

Le texte renvoyé par l'appel de conversion de la parole en texte doit être envoyé à votre code serverless pour être traité par LUIS, qui renverra le nombre de secondes pour le minuteur. Ce nombre de secondes peut être utilisé pour régler un minuteur.

Les microcontrôleurs ne prennent pas en charge nativement les threads multiples dans Arduino, donc il n'existe pas de classes de minuteur standard comme celles que vous pourriez trouver en codant en Python ou dans d'autres langages de haut niveau. À la place, vous pouvez utiliser des bibliothèques de minuteurs qui fonctionnent en mesurant le temps écoulé dans la fonction loop et en appelant des fonctions lorsque le temps est écoulé.

Tâche - envoyer le texte à la fonction serverless

  1. Ouvrez le projet smart-timer dans VS Code s'il n'est pas déjà ouvert.

  2. Ouvrez le fichier d'en-tête config.h et ajoutez l'URL de votre application de fonction :

    const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
    

    Remplacez <URL> par l'URL de votre application de fonction que vous avez obtenue à la dernière étape de la leçon précédente, en pointant vers l'adresse IP de votre machine locale qui exécute l'application de fonction.

  3. Créez un nouveau fichier dans le dossier src appelé language_understanding.h. Ce fichier sera utilisé pour définir une classe qui enverra la parole reconnue à votre application de fonction pour être convertie en secondes à l'aide de LUIS.

  4. Ajoutez ce qui suit en haut de ce fichier :

    #pragma once
    
    #include <Arduino.h>
    #include <ArduinoJson.h>
    #include <HTTPClient.h>
    #include <WiFiClient.h>
    
    #include "config.h"
    

    Cela inclut certains fichiers d'en-tête nécessaires.

  5. Définissez une classe appelée LanguageUnderstanding et déclarez une instance de cette classe :

    class LanguageUnderstanding
    {
    public:
    private:
    };
    
    LanguageUnderstanding languageUnderstanding;
    
  6. Pour appeler votre application de fonction, vous devez déclarer un client WiFi. Ajoutez ce qui suit à la section private de la classe :

    WiFiClient _client;
    
  7. Dans la section public, déclarez une méthode appelée GetTimerDuration pour appeler l'application de fonction :

    int GetTimerDuration(String text)
    {
    }
    
  8. Dans la méthode GetTimerDuration, ajoutez le code suivant pour construire le JSON à envoyer à l'application de fonction :

    DynamicJsonDocument doc(1024);
    doc["text"] = text;
    
    String body;
    serializeJson(doc, body);
    

    Cela convertit le texte passé à la méthode GetTimerDuration en JSON suivant :

    {
        "text" : "<text>"
    }
    

    <text> est le texte passé à la fonction.

  9. En dessous, ajoutez le code suivant pour effectuer l'appel à l'application de fonction :

    HTTPClient httpClient;
    httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL);
    
    int httpResponseCode = httpClient.POST(body);
    

    Cela effectue une requête POST à l'application de fonction, en passant le corps JSON et en obtenant le code de réponse.

  10. Ajoutez le code suivant en dessous :

    int seconds = 0;
    if (httpResponseCode == 200)
    {
        String result = httpClient.getString();
        Serial.println(result);
    
        DynamicJsonDocument doc(1024);
        deserializeJson(doc, result.c_str());
    
        JsonObject obj = doc.as<JsonObject>();
        seconds = obj["seconds"].as<int>();
    }
    else
    {
        Serial.print("Failed to understand text - error ");
        Serial.println(httpResponseCode);
    }
    

    Ce code vérifie le code de réponse. S'il est 200 (succès), alors le nombre de secondes pour le minuteur est récupéré à partir du corps de la réponse. Sinon, une erreur est envoyée au moniteur série et le nombre de secondes est défini sur 0.

  11. Ajoutez le code suivant à la fin de cette méthode pour fermer la connexion HTTP et retourner le nombre de secondes :

    httpClient.end();
    
    return seconds;
    
  12. Dans le fichier main.cpp, incluez ce nouvel en-tête :

    #include "speech_to_text.h"
    
  13. À la fin de la fonction processAudio, appelez la méthode GetTimerDuration pour obtenir la durée du minuteur :

    int total_seconds = languageUnderstanding.GetTimerDuration(text);
    

    Cela convertit le texte de l'appel à la classe SpeechToText en nombre de secondes pour le minuteur.

Tâche - régler un minuteur

Le nombre de secondes peut être utilisé pour régler un minuteur.

  1. Ajoutez la dépendance de bibliothèque suivante au fichier platformio.ini pour ajouter une bibliothèque permettant de régler un minuteur :

    contrem/arduino-timer @ 2.3.0
    
  2. Ajoutez une directive d'inclusion pour cette bibliothèque dans le fichier main.cpp :

    #include <arduino-timer.h>
    
  3. Au-dessus de la fonction processAudio, ajoutez le code suivant :

    auto timer = timer_create_default();
    

    Ce code déclare un minuteur appelé timer.

  4. En dessous, ajoutez le code suivant :

    void say(String text)
    {
        Serial.print("Saying ");
        Serial.println(text);
    }
    

    Cette fonction say convertira éventuellement le texte en parole, mais pour l'instant, elle écrira simplement le texte passé au moniteur série.

  5. En dessous de la fonction say, ajoutez le code suivant :

    bool timerExpired(void *announcement)
    {
        say((char *)announcement);
        return false;
    }
    

    Il s'agit d'une fonction de rappel qui sera appelée lorsqu'un minuteur expirera. Elle reçoit un message à dire lorsque le minuteur expire. Les minuteurs peuvent se répéter, et cela peut être contrôlé par la valeur de retour de ce rappel - ici, cela retourne false pour indiquer que le minuteur ne doit pas se répéter.

  6. Ajoutez le code suivant à la fin de la fonction processAudio :

    if (total_seconds == 0)
    {
        return;
    }
    
    int minutes = total_seconds / 60;
    int seconds = total_seconds % 60;
    

    Ce code vérifie le nombre total de secondes, et s'il est 0, retourne de l'appel de fonction pour qu'aucun minuteur ne soit réglé. Il convertit ensuite le nombre total de secondes en minutes et secondes.

  7. En dessous de ce code, ajoutez ce qui suit pour créer un message à dire lorsque le minuteur démarre :

    String begin_message;
    if (minutes > 0)
    {
        begin_message += minutes;
        begin_message += " minute ";
    }
    if (seconds > 0)
    {
        begin_message += seconds;
        begin_message += " second ";
    }
    
    begin_message += "timer started.";
    
  8. En dessous, ajoutez un code similaire pour créer un message à dire lorsque le minuteur a expiré :

    String end_message("Times up on your ");
    if (minutes > 0)
    {
        end_message += minutes;
        end_message += " minute ";
    }
    if (seconds > 0)
    {
        end_message += seconds;
        end_message += " second ";
    }
    
    end_message += "timer.";
    
  9. Après cela, dites le message de démarrage du minuteur :

    say(begin_message);
    
  10. À la fin de cette fonction, démarrez le minuteur :

    timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str()));
    

    Cela déclenche le minuteur. Le minuteur est réglé en utilisant des millisecondes, donc le nombre total de secondes est multiplié par 1 000 pour convertir en millisecondes. La fonction timerExpired est passée comme rappel, et le end_message est passé comme argument au rappel. Ce rappel ne prend que des arguments de type void *, donc la chaîne est convertie de manière appropriée.

  11. Enfin, le minuteur doit avancer, et cela se fait dans la fonction loop. Ajoutez le code suivant à la fin de la fonction loop :

    timer.tick();
    
  12. Compilez ce code, téléversez-le sur votre Wio Terminal et testez-le via le moniteur série. Une fois que vous voyez Ready dans le moniteur série, appuyez sur le bouton C (celui sur le côté gauche, le plus proche de l'interrupteur d'alimentation), et parlez. 4 secondes d'audio seront capturées, converties en texte, puis envoyées à votre application de fonction, et un minuteur sera réglé. Assurez-vous que votre application de fonction s'exécute localement.

    Vous verrez quand le minuteur démarre et quand il se termine.

    --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time
    --- More details at http://bit.ly/pio-monitor-filters
    --- Miniterm on /dev/cu.usbmodem1101  9600,8,N,1 ---
    --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
    Connecting to WiFi..
    Connected!
    Got access token.
    Ready.
    Starting recording...
    Finished recording
    Sending speech...
    Speech sent!
    {"RecognitionStatus":"Success","DisplayText":"Set a 2 minute and 27 second timer.","Offset":4700000,"Duration":35300000}
    Set a 2 minute and 27 second timer.
    {"seconds": 147}
    2 minute 27 second timer started.
    Times up on your 2 minute 27 second timer.
    

💁 Vous pouvez trouver ce code dans le dossier code-timer/wio-terminal.

😀 Votre programme de minuteur a été un succès !

Avertissement :
Ce document a été traduit à l'aide du service de traduction automatique Co-op Translator. Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de recourir à une traduction humaine professionnelle. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.