9.7 KiB
Nastavitev časovnika - Wio Terminal
V tem delu lekcije boste poklicali svojo strežniško kodo, da prepoznate govor, in na podlagi rezultatov nastavili časovnik na svojem Wio Terminalu.
Nastavitev časovnika
Besedilo, ki ga prejmete iz klica za pretvorbo govora v besedilo, je treba poslati vaši strežniški kodi, da ga obdela LUIS in vrne število sekund za časovnik. To število sekund lahko uporabite za nastavitev časovnika.
Mikrokrmilniki v Arduino okolju nimajo naravne podpore za večnitnost, zato ni standardnih razredov za časovnike, kot jih lahko najdete pri programiranju v Pythonu ali drugih višjenivojskih jezikih. Namesto tega lahko uporabite knjižnice za časovnike, ki delujejo tako, da merijo pretečen čas v funkciji loop
in kličejo funkcije, ko čas poteče.
Naloga - pošljite besedilo strežniški funkciji
-
Odprite projekt
smart-timer
v VS Code, če še ni odprt. -
Odprite glavno datoteko
config.h
in dodajte URL za svojo funkcijsko aplikacijo:const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
Zamenjajte
<URL>
z URL-jem za svojo funkcijsko aplikacijo, ki ste ga pridobili v zadnjem koraku prejšnje lekcije, in kaže na IP-naslov vašega lokalnega računalnika, kjer se izvaja funkcijska aplikacija. -
Ustvarite novo datoteko v mapi
src
z imenomlanguage_understanding.h
. Ta datoteka bo uporabljena za definiranje razreda, ki bo pošiljal prepoznan govor vaši funkcijski aplikaciji za pretvorbo v sekunde z uporabo LUIS. -
Na vrh te datoteke dodajte naslednje:
#pragma once #include <Arduino.h> #include <ArduinoJson.h> #include <HTTPClient.h> #include <WiFiClient.h> #include "config.h"
To vključuje nekaj potrebnih glavičnih datotek.
-
Definirajte razred z imenom
LanguageUnderstanding
in deklarirajte primerek tega razreda:class LanguageUnderstanding { public: private: }; LanguageUnderstanding languageUnderstanding;
-
Za klic funkcijske aplikacije morate deklarirati WiFi odjemalca. Dodajte naslednje v zasebni del razreda:
WiFiClient _client;
-
V javnem delu razreda deklarirajte metodo z imenom
GetTimerDuration
za klic funkcijske aplikacije:int GetTimerDuration(String text) { }
-
V metodi
GetTimerDuration
dodajte naslednjo kodo za sestavo JSON-a, ki bo poslan funkcijski aplikaciji:DynamicJsonDocument doc(1024); doc["text"] = text; String body; serializeJson(doc, body);
To pretvori besedilo, posredovano metodi
GetTimerDuration
, v naslednji JSON:{ "text" : "<text>" }
kjer je
<text>
besedilo, posredovano funkciji. -
Pod tem dodajte naslednjo kodo za klic funkcijske aplikacije:
HTTPClient httpClient; httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL); int httpResponseCode = httpClient.POST(body);
To naredi POST zahtevo funkcijski aplikaciji, posreduje JSON telo in pridobi odzivno kodo.
-
Dodajte naslednjo kodo pod to:
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); }
Ta koda preveri odzivno kodo. Če je 200 (uspeh), se število sekund za časovnik pridobi iz odzivnega telesa. V nasprotnem primeru se napaka pošlje na serijski monitor in število sekund se nastavi na 0.
-
Na konec te metode dodajte naslednjo kodo za zaprtje HTTP povezave in vrnitev števila sekund:
httpClient.end(); return seconds;
-
V datoteki
main.cpp
vključite to novo glavično datoteko:#include "speech_to_text.h"
-
Na koncu funkcije
processAudio
pokličite metodoGetTimerDuration
, da pridobite trajanje časovnika:int total_seconds = languageUnderstanding.GetTimerDuration(text);
To pretvori besedilo iz klica razreda
SpeechToText
v število sekund za časovnik.
Naloga - nastavitev časovnika
Število sekund lahko uporabite za nastavitev časovnika.
-
Dodajte naslednjo odvisnost knjižnice v datoteko
platformio.ini
, da dodate knjižnico za nastavitev časovnika:contrem/arduino-timer @ 2.3.0
-
Dodajte direktivo za vključitev te knjižnice v datoteko
main.cpp
:#include <arduino-timer.h>
-
Nad funkcijo
processAudio
dodajte naslednjo kodo:auto timer = timer_create_default();
Ta koda deklarira časovnik z imenom
timer
. -
Pod to dodajte naslednjo kodo:
void say(String text) { Serial.print("Saying "); Serial.println(text); }
Funkcija
say
bo na koncu pretvorila besedilo v govor, trenutno pa bo samo zapisala posredovano besedilo na serijski monitor. -
Pod funkcijo
say
dodajte naslednjo kodo:bool timerExpired(void *announcement) { say((char *)announcement); return false; }
To je povratna funkcija, ki bo poklicana, ko časovnik poteče. Posreduje se sporočilo, ki ga je treba izgovoriti, ko časovnik poteče. Časovniki se lahko ponavljajo, kar je nadzorovano z vrnjeno vrednostjo te povratne funkcije - ta vrne
false
, kar pomeni, da se časovnik ne bo ponovno zagnal. -
Na konec funkcije
processAudio
dodajte naslednjo kodo:if (total_seconds == 0) { return; } int minutes = total_seconds / 60; int seconds = total_seconds % 60;
Ta koda preveri skupno število sekund in, če je 0, vrne iz klica funkcije, tako da časovniki niso nastavljeni. Nato pretvori skupno število sekund v minute in sekunde.
-
Pod to kodo dodajte naslednje za ustvarjanje sporočila, ki ga je treba izgovoriti, ko se časovnik zažene:
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.";
-
Pod to dodajte podobno kodo za ustvarjanje sporočila, ki ga je treba izgovoriti, ko časovnik poteče:
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.";
-
Po tem izgovorite sporočilo o začetku časovnika:
say(begin_message);
-
Na koncu te funkcije zaženite časovnik:
timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str()));
To sproži časovnik. Časovnik je nastavljen z uporabo milisekund, zato se skupno število sekund pomnoži z 1.000 za pretvorbo v milisekunde. Funkcija
timerExpired
je posredovana kot povratni klic, argumentend_message
pa je posredovan za prenos povratnemu klicu. Ta povratni klic sprejema samo argumente tipavoid *
, zato je niz ustrezno pretvorjen. -
Na koncu funkcije
loop
dodajte naslednjo kodo:timer.tick();
-
Sestavite to kodo, naložite jo na svoj Wio Terminal in jo preizkusite prek serijskega monitorja. Ko vidite
Ready
na serijskem monitorju, pritisnite gumb C (tisti na levi strani, najbližje stikalu za vklop) in govorite. 4 sekunde zvoka bodo zajete, pretvorjene v besedilo, nato poslane vaši funkcijski aplikaciji, in časovnik bo nastavljen. Prepričajte se, da se vaša funkcijska aplikacija izvaja lokalno.Videli boste, kdaj se časovnik začne in kdaj se konča.
--- 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.
💁 To kodo lahko najdete v mapi code-timer/wio-terminal.
😀 Vaš program za časovnik je bil uspešen!
Omejitev odgovornosti:
Ta dokument je bil preveden z uporabo storitve AI za prevajanje Co-op Translator. Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem izvirnem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki bi nastale zaradi uporabe tega prevoda.