10 KiB
Indstil en timer - Wio Terminal
I denne del af lektionen vil du kalde din serverløse kode for at forstå talen og indstille en timer på din Wio Terminal baseret på resultaterne.
Indstil en timer
Teksten, der kommer tilbage fra tale-til-tekst-kaldet, skal sendes til din serverløse kode for at blive behandlet af LUIS, som returnerer antallet af sekunder for timeren. Dette antal sekunder kan bruges til at indstille en timer.
Mikrocontrollere har ikke indbygget understøttelse af flere tråde i Arduino, så der findes ingen standard timer-klasser, som du måske kender fra programmering i Python eller andre højere niveau-sprog. I stedet kan du bruge timer-biblioteker, der fungerer ved at måle forløbet tid i loop
-funktionen og kalde funktioner, når tiden er udløbet.
Opgave - send teksten til den serverløse funktion
-
Åbn
smart-timer
-projektet i VS Code, hvis det ikke allerede er åbent. -
Åbn header-filen
config.h
og tilføj URL'en til din function app:const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
Erstat
<URL>
med URL'en til din function app, som du fik i sidste trin af den sidste lektion, og som peger på IP-adressen for din lokale maskine, der kører function app'en. -
Opret en ny fil i
src
-mappen kaldetlanguage_understanding.h
. Denne fil vil blive brugt til at definere en klasse, der sender den genkendte tale til din function app for at blive konverteret til sekunder ved hjælp af LUIS. -
Tilføj følgende øverst i denne fil:
#pragma once #include <Arduino.h> #include <ArduinoJson.h> #include <HTTPClient.h> #include <WiFiClient.h> #include "config.h"
Dette inkluderer nogle nødvendige header-filer.
-
Definer en klasse kaldet
LanguageUnderstanding
, og deklarér en instans af denne klasse:class LanguageUnderstanding { public: private: }; LanguageUnderstanding languageUnderstanding;
-
For at kalde din function app skal du deklarere en WiFi-klient. Tilføj følgende til den private sektion af klassen:
WiFiClient _client;
-
I den offentlige sektion skal du deklarere en metode kaldet
GetTimerDuration
for at kalde function app'en:int GetTimerDuration(String text) { }
-
I metoden
GetTimerDuration
skal du tilføje følgende kode for at opbygge JSON, der skal sendes til function app'en:DynamicJsonDocument doc(1024); doc["text"] = text; String body; serializeJson(doc, body);
Dette konverterer teksten, der sendes til metoden
GetTimerDuration
, til følgende JSON:{ "text" : "<text>" }
hvor
<text>
er teksten, der sendes til funktionen. -
Tilføj følgende kode nedenfor for at lave kaldet til function app'en:
HTTPClient httpClient; httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL); int httpResponseCode = httpClient.POST(body);
Dette laver en POST-anmodning til function app'en, sender JSON-indholdet og modtager svarkoden.
-
Tilføj følgende kode nedenfor dette:
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); }
Denne kode kontrollerer svarkoden. Hvis den er 200 (succes), hentes antallet af sekunder for timeren fra svarindholdet. Ellers sendes en fejl til den serielle monitor, og antallet af sekunder sættes til 0.
-
Tilføj følgende kode til slutningen af denne metode for at lukke HTTP-forbindelsen og returnere antallet af sekunder:
httpClient.end(); return seconds;
-
I filen
main.cpp
skal du inkludere denne nye header:#include "speech_to_text.h"
-
I slutningen af funktionen
processAudio
skal du kalde metodenGetTimerDuration
for at få timerens varighed:int total_seconds = languageUnderstanding.GetTimerDuration(text);
Dette konverterer teksten fra kaldet til klassen
SpeechToText
til antallet af sekunder for timeren.
Opgave - indstil en timer
Antallet af sekunder kan bruges til at indstille en timer.
-
Tilføj følgende biblioteksafhængighed til filen
platformio.ini
for at tilføje et bibliotek til at indstille en timer:contrem/arduino-timer @ 2.3.0
-
Tilføj en include-direktiv for dette bibliotek til filen
main.cpp
:#include <arduino-timer.h>
-
Over funktionen
processAudio
skal du tilføje følgende kode:auto timer = timer_create_default();
Denne kode deklarerer en timer kaldet
timer
. -
Nedenfor dette skal du tilføje følgende kode:
void say(String text) { Serial.print("Saying "); Serial.println(text); }
Denne
say
-funktion vil til sidst konvertere tekst til tale, men for nu vil den blot skrive den modtagne tekst til den serielle monitor. -
Nedenfor
say
-funktionen skal du tilføje følgende kode:bool timerExpired(void *announcement) { say((char *)announcement); return false; }
Dette er en callback-funktion, der vil blive kaldt, når en timer udløber. Den modtager en besked, der skal siges, når timeren udløber. Timere kan gentages, og dette kan styres af returværdien af denne callback - denne returnerer
false
for at fortælle timeren, at den ikke skal køre igen. -
Tilføj følgende kode til slutningen af funktionen
processAudio
:if (total_seconds == 0) { return; } int minutes = total_seconds / 60; int seconds = total_seconds % 60;
Denne kode kontrollerer det samlede antal sekunder, og hvis det er 0, returneres fra funktionskaldet, så ingen timere indstilles. Det konverterer derefter det samlede antal sekunder til minutter og sekunder.
-
Nedenfor denne kode skal du tilføje følgende for at oprette en besked, der skal siges, når timeren starter:
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.";
-
Nedenfor dette skal du tilføje lignende kode for at oprette en besked, der skal siges, når timeren er udløbet:
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.";
-
Efter dette skal du sige beskeden om, at timeren er startet:
say(begin_message);
-
I slutningen af denne funktion skal du starte timeren:
timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str()));
Dette aktiverer timeren. Timeren indstilles ved hjælp af millisekunder, så det samlede antal sekunder ganges med 1.000 for at konvertere til millisekunder. Funktionen
timerExpired
sendes som callback, ogend_message
sendes som et argument til callbacken. Denne callback accepterer kunvoid *
-argumenter, så strengen konverteres passende. -
Endelig skal timeren "tikke", og dette gøres i funktionen
loop
. Tilføj følgende kode til slutningen af funktionenloop
:timer.tick();
-
Byg denne kode, upload den til din Wio Terminal, og test den via den serielle monitor. Når du ser
Ready
i den serielle monitor, skal du trykke på C-knappen (den til venstre, tættest på tænd/sluk-knappen) og tale. 4 sekunders lyd vil blive optaget, konverteret til tekst, sendt til din function app, og en timer vil blive indstillet. Sørg for, at din function app kører lokalt.Du vil se, hvornår timeren starter, og hvornår den slutter.
--- 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.
💁 Du kan finde denne kode i code-timer/wio-terminal-mappen.
😀 Dit timer-program var en succes!
Ansvarsfraskrivelse:
Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten Co-op Translator. Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.