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-timerv VS Code, če še ni odprt. -
Odprite glavno datoteko
config.hin 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
srcz 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
LanguageUnderstandingin 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
GetTimerDurationza klic funkcijske aplikacije:int GetTimerDuration(String text) { } -
V metodi
GetTimerDurationdodajte 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.cppvključite to novo glavično datoteko:#include "speech_to_text.h" -
Na koncu funkcije
processAudiopokličite metodoGetTimerDuration, da pridobite trajanje časovnika:int total_seconds = languageUnderstanding.GetTimerDuration(text);To pretvori besedilo iz klica razreda
SpeechToTextv š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
processAudiododajte 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
saybo na koncu pretvorila besedilo v govor, trenutno pa bo samo zapisala posredovano besedilo na serijski monitor. -
Pod funkcijo
saydodajte 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
processAudiododajte 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
timerExpiredje posredovana kot povratni klic, argumentend_messagepa je posredovan za prenos povratnemu klicu. Ta povratni klic sprejema samo argumente tipavoid *, zato je niz ustrezno pretvorjen. -
Na koncu funkcije
loopdodajte naslednjo kodo:timer.tick(); -
Sestavite to kodo, naložite jo na svoj Wio Terminal in jo preizkusite prek serijskega monitorja. Ko vidite
Readyna 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.