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
-
Ouvrez le projet
smart-timer
dans VS Code s'il n'est pas déjà ouvert. -
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. -
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. -
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.
-
Définissez une classe appelée
LanguageUnderstanding
et déclarez une instance de cette classe :class LanguageUnderstanding { public: private: }; LanguageUnderstanding languageUnderstanding;
-
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;
-
Dans la section
public
, déclarez une méthode appeléeGetTimerDuration
pour appeler l'application de fonction :int GetTimerDuration(String text) { }
-
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>" }
où
<text>
est le texte passé à la fonction. -
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.
-
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.
-
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;
-
Dans le fichier
main.cpp
, incluez ce nouvel en-tête :#include "speech_to_text.h"
-
À la fin de la fonction
processAudio
, appelez la méthodeGetTimerDuration
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.
-
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
-
Ajoutez une directive d'inclusion pour cette bibliothèque dans le fichier
main.cpp
:#include <arduino-timer.h>
-
Au-dessus de la fonction
processAudio
, ajoutez le code suivant :auto timer = timer_create_default();
Ce code déclare un minuteur appelé
timer
. -
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. -
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. -
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.
-
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.";
-
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.";
-
Après cela, dites le message de démarrage du minuteur :
say(begin_message);
-
À 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 leend_message
est passé comme argument au rappel. Ce rappel ne prend que des arguments de typevoid *
, donc la chaîne est convertie de manière appropriée. -
Enfin, le minuteur doit avancer, et cela se fait dans la fonction
loop
. Ajoutez le code suivant à la fin de la fonctionloop
:timer.tick();
-
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.