9.3 KiB
Seadista taimer - Wio Terminal
Selles õppetunni osas kutsud oma serverivaba koodi, et mõista kõnet, ja seadistad tulemuste põhjal taimeri oma Wio Terminalis.
Taimeri seadistamine
Kõneteksti teisendamise kõnest tagastatud tekst tuleb saata serverivabale koodile, et LUIS seda töötleks ja tagastaks taimeri sekundite arvu. Seda sekundite arvu saab kasutada taimeri seadistamiseks.
Mikrokontrolleritel pole Arduino keskkonnas loomulikku mitme lõime tuge, seega pole standardseid taimeriklasse nagu Pythonis või teistes kõrgema taseme programmeerimiskeeltes. Selle asemel saab kasutada taimeri teeke, mis mõõdavad möödunud aega loop funktsioonis ja kutsuvad funktsioone, kui aeg on läbi.
Ülesanne - teksti saatmine serverivabale funktsioonile
-
Ava
smart-timerprojekt VS Code'is, kui see pole juba avatud. -
Ava
config.hpäisefail ja lisa oma funktsiooni rakenduse URL:const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";Asenda
<URL>funktsiooni rakenduse URL-iga, mille sa said eelmise õppetunni viimases etapis, viidates sinu kohaliku masina IP-aadressile, kus funktsiooni rakendus töötab. -
Loo
srckausta uus fail nimegalanguage_understanding.h. Seda kasutatakse klassi määratlemiseks, mis saadab tuvastatud kõne sinu funktsiooni rakendusele, et see teisendataks sekunditeks LUIS-i abil. -
Lisa faili algusesse järgmine:
#pragma once #include <Arduino.h> #include <ArduinoJson.h> #include <HTTPClient.h> #include <WiFiClient.h> #include "config.h"See sisaldab vajalikke päisefaile.
-
Määra klass nimega
LanguageUnderstandingja deklareeri selle klassi eksemplar:class LanguageUnderstanding { public: private: }; LanguageUnderstanding languageUnderstanding; -
Funktsiooni rakenduse kutsumiseks pead deklareerima WiFi kliendi. Lisa järgmine klassi
privatesektsiooni:WiFiClient _client; -
publicsektsiooni lisa meetod nimegaGetTimerDuration, et kutsuda funktsiooni rakendust:int GetTimerDuration(String text) { } -
GetTimerDurationmeetodis lisa järgmine kood JSON-i koostamiseks, mida funktsiooni rakendusele saata:DynamicJsonDocument doc(1024); doc["text"] = text; String body; serializeJson(doc, body);See teisendab
GetTimerDurationmeetodile edastatud teksti järgmisesse JSON-i:{ "text" : "<text>" }kus
<text>on meetodile edastatud tekst. -
Selle alla lisa järgmine kood funktsiooni rakenduse kutsumiseks:
HTTPClient httpClient; httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL); int httpResponseCode = httpClient.POST(body);See teeb POST-päringu funktsiooni rakendusele, edastades JSON-i keha ja saades vastuse koodi.
-
Lisa sellele alla järgmine kood:
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); }See kood kontrollib vastuse koodi. Kui see on 200 (õnnestumine), siis sekundite arv taimeri jaoks saadakse vastuse kehast. Vastasel juhul saadetakse veateade seeriamonitorile ja sekundite arv määratakse 0-ks.
-
Lisa meetodi lõppu järgmine kood, et sulgeda HTTP-ühendus ja tagastada sekundite arv:
httpClient.end(); return seconds; -
main.cppfailis lisa selle uue päise kaasamine:#include "speech_to_text.h" -
processAudiofunktsiooni lõpus kutsuGetTimerDurationmeetodit, et saada taimeri kestus:int total_seconds = languageUnderstanding.GetTimerDuration(text);See teisendab
SpeechToTextklassi kõne kõnest saadud teksti taimeri sekundite arvuks.
Ülesanne - taimeri seadistamine
Sekundite arvu saab kasutada taimeri seadistamiseks.
-
Lisa
platformio.inifaili järgmine teegi sõltuvus, et lisada taimeri seadistamise teek:contrem/arduino-timer @ 2.3.0 -
Lisa
main.cppfaili selle teegi kaasamise direktiiv:#include <arduino-timer.h> -
processAudiofunktsiooni kohal lisa järgmine kood:auto timer = timer_create_default();See kood deklareerib taimeri nimega
timer. -
Selle alla lisa järgmine kood:
void say(String text) { Serial.print("Saying "); Serial.println(text); }See
sayfunktsioon teisendab lõpuks teksti kõneks, kuid praegu kirjutab see edastatud teksti lihtsalt seeriamonitorile. -
sayfunktsiooni alla lisa järgmine kood:bool timerExpired(void *announcement) { say((char *)announcement); return false; }See on tagasikutse funktsioon, mida kutsutakse, kui taimer aegub. Sellele edastatakse sõnum, mida öelda, kui taimer aegub. Taimerid võivad korduda, ja seda saab kontrollida tagasikutse tagastusväärtusega - see tagastab
false, et öelda taimerile, et see ei käivitu uuesti. -
Lisa
processAudiofunktsiooni lõppu järgmine kood:if (total_seconds == 0) { return; } int minutes = total_seconds / 60; int seconds = total_seconds % 60;See kood kontrollib sekundite koguarvu ja kui see on 0, väljub funktsiooni kutsest, et taimerit ei seadistataks. Seejärel teisendab see sekundite koguarvu minutiteks ja sekunditeks.
-
Selle koodi alla lisa järgmine, et luua sõnum, mida öelda, kui taimer käivitub:
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."; -
Selle alla lisa sarnane kood, et luua sõnum, mida öelda, kui taimer aegub:
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."; -
Pärast seda ütle taimeri käivitamise sõnum:
say(begin_message); -
Funktsiooni lõpus käivita taimer:
timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str()));See käivitab taimeri. Taimer seadistatakse millisekundites, seega sekundite koguarv korrutatakse 1,000-ga, et teisendada millisekunditeks.
timerExpiredfunktsioon edastatakse tagasikutseks jaend_messageedastatakse argumendina tagasikutsele. See tagasikutse võtab ainultvoid *argumente, seega string teisendatakse vastavalt. -
Lõpuks peab taimer tiksuma, ja seda tehakse
loopfunktsioonis. Lisa järgmine koodloopfunktsiooni lõppu:timer.tick(); -
Koosta see kood, laadi see oma Wio Terminali ja testi seda seeriamonitori kaudu. Kui näed seeriamonitoris
Ready, vajuta C nuppu (vasakpoolne nupp, mis on kõige lähemal toitelülitile) ja räägi. 4 sekundit heli salvestatakse, teisendatakse tekstiks, saadetakse sinu funktsiooni rakendusele ja taimer seadistatakse. Veendu, et sinu funktsiooni rakendus töötab kohalikult.Näed, millal taimer käivitub ja millal see lõppeb.
--- 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.
💁 Selle koodi leiad code-timer/wio-terminal kaustast.
😀 Sinu taimeriprogramm oli edukas!
Lahtiütlus:
See dokument on tõlgitud AI tõlketeenuse Co-op Translator abil. Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valesti tõlgenduste eest.