9.9 KiB
Nastavenie časovača - Wio Terminal
V tejto časti lekcie zavoláte svoj serverless kód na rozpoznanie reči a nastavíte časovač na vašom Wio Terminal na základe výsledkov.
Nastavenie časovača
Text, ktorý sa vráti z volania prevodu reči na text, je potrebné poslať do vášho serverless kódu, aby ho spracoval LUIS a vrátil počet sekúnd pre časovač. Tento počet sekúnd sa potom použije na nastavenie časovača.
Mikrokontroléry nemajú natívnu podporu pre viacvláknové spracovanie v Arduino, takže neexistujú štandardné triedy časovačov, ako by ste mohli nájsť pri programovaní v Pythone alebo iných vyšších programovacích jazykoch. Namiesto toho môžete použiť knižnice časovačov, ktoré fungujú na základe merania uplynutého času vo funkcii loop
a volania funkcií, keď čas vyprší.
Úloha - odoslanie textu do serverless funkcie
-
Otvorte projekt
smart-timer
vo VS Code, ak ešte nie je otvorený. -
Otvorte hlavičkový súbor
config.h
a pridajte URL adresu pre vašu funkciu:const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
Nahraďte
<URL>
URL adresou vašej funkcie, ktorú ste získali v poslednom kroku predchádzajúcej lekcie, ukazujúcou na IP adresu vášho lokálneho počítača, na ktorom beží funkcia. -
Vytvorte nový súbor v priečinku
src
s názvomlanguage_understanding.h
. Tento súbor bude použitý na definovanie triedy, ktorá odošle rozpoznanú reč do vašej funkcie na konverziu na sekundy pomocou LUIS. -
Pridajte na začiatok tohto súboru nasledujúci kód:
#pragma once #include <Arduino.h> #include <ArduinoJson.h> #include <HTTPClient.h> #include <WiFiClient.h> #include "config.h"
Tento kód obsahuje potrebné hlavičkové súbory.
-
Definujte triedu s názvom
LanguageUnderstanding
a deklarujte inštanciu tejto triedy:class LanguageUnderstanding { public: private: }; LanguageUnderstanding languageUnderstanding;
-
Na volanie vašej funkcie je potrebné deklarovať WiFi klienta. Pridajte nasledujúci kód do sekcie
private
triedy:WiFiClient _client;
-
V sekcii
public
deklarujte metódu s názvomGetTimerDuration
na volanie funkcie:int GetTimerDuration(String text) { }
-
V metóde
GetTimerDuration
pridajte nasledujúci kód na vytvorenie JSON, ktorý sa odošle do funkcie:DynamicJsonDocument doc(1024); doc["text"] = text; String body; serializeJson(doc, body);
Tento kód konvertuje text odovzdaný do metódy
GetTimerDuration
na nasledujúci JSON:{ "text" : "<text>" }
kde
<text>
je text odovzdaný do funkcie. -
Pod týmto kódom pridajte nasledujúci kód na volanie funkcie:
HTTPClient httpClient; httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL); int httpResponseCode = httpClient.POST(body);
Tento kód vykoná POST požiadavku na funkciu, odosiela JSON telo a získava kód odpovede.
-
Pridajte nasledujúci kód pod tento:
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); }
Tento kód kontroluje kód odpovede. Ak je 200 (úspech), počet sekúnd pre časovač sa získa z tela odpovede. V opačnom prípade sa do sériového monitora odošle chyba a počet sekúnd sa nastaví na 0.
-
Pridajte nasledujúci kód na koniec tejto metódy na uzavretie HTTP pripojenia a vrátenie počtu sekúnd:
httpClient.end(); return seconds;
-
V súbore
main.cpp
zahrňte tento nový hlavičkový súbor:#include "speech_to_text.h"
-
Na konci funkcie
processAudio
zavolajte metóduGetTimerDuration
na získanie trvania časovača:int total_seconds = languageUnderstanding.GetTimerDuration(text);
Tento kód konvertuje text z volania triedy
SpeechToText
na počet sekúnd pre časovač.
Úloha - nastavenie časovača
Počet sekúnd sa môže použiť na nastavenie časovača.
-
Pridajte nasledujúcu závislosť knižnice do súboru
platformio.ini
, aby ste pridali knižnicu na nastavenie časovača:contrem/arduino-timer @ 2.3.0
-
Pridajte direktívu
include
pre túto knižnicu do súborumain.cpp
:#include <arduino-timer.h>
-
Nad funkciu
processAudio
pridajte nasledujúci kód:auto timer = timer_create_default();
Tento kód deklaruje časovač s názvom
timer
. -
Pod tento kód pridajte nasledujúci kód:
void say(String text) { Serial.print("Saying "); Serial.println(text); }
Táto funkcia
say
nakoniec prevedie text na reč, ale zatiaľ len zapíše odovzdaný text do sériového monitora. -
Pod funkciu
say
pridajte nasledujúci kód:bool timerExpired(void *announcement) { say((char *)announcement); return false; }
Toto je spätná volacia funkcia, ktorá sa zavolá, keď časovač vyprší. Funkcia dostane správu, ktorú má oznámiť, keď časovač vyprší. Časovače môžu byť opakované, čo sa riadi návratovou hodnotou tejto funkcie - táto funkcia vráti
false
, aby časovač nebežal znova. -
Pridajte nasledujúci kód na koniec funkcie
processAudio
:if (total_seconds == 0) { return; } int minutes = total_seconds / 60; int seconds = total_seconds % 60;
Tento kód kontroluje celkový počet sekúnd a ak je 0, vráti sa z funkcie, aby sa žiadne časovače nenastavili. Potom konvertuje celkový počet sekúnd na minúty a sekundy.
-
Pod tento kód pridajte nasledujúci kód na vytvorenie správy, ktorá sa oznámi, keď sa časovač spustí:
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 tento kód pridajte podobný kód na vytvorenie správy, ktorá sa oznámi, keď časovač vyprší:
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 tomto kóde oznámte správu o spustení časovača:
say(begin_message);
-
Na konci tejto funkcie spustite časovač:
timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str()));
Tento kód spustí časovač. Časovač je nastavený v milisekundách, takže celkový počet sekúnd sa vynásobí 1 000 na konverziu na milisekundy. Funkcia
timerExpired
je odovzdaná ako spätná volacia funkcia aend_message
je odovzdaná ako argument pre spätnú volaciu funkciu. Táto funkcia prijíma iba argumenty typuvoid *
, takže reťazec je vhodne konvertovaný. -
Nakoniec je potrebné, aby časovač tikotal, a to sa vykonáva vo funkcii
loop
. Pridajte nasledujúci kód na koniec funkcieloop
:timer.tick();
-
Zostavte tento kód, nahrajte ho do vášho Wio Terminal a otestujte ho cez sériový monitor. Keď uvidíte
Ready
v sériovom monitore, stlačte tlačidlo C (to na ľavej strane, najbližšie k vypínaču) a hovorte. 4 sekundy zvuku sa zachytia, prevedú na text, potom sa odošlú do vašej funkcie a nastaví sa časovač. Uistite sa, že vaša funkcia beží lokálne.Uvidíte, kedy sa časovač spustí a kedy skončí.
--- 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.
💁 Tento kód nájdete v priečinku code-timer/wio-terminal.
😀 Váš program časovača bol úspešný!
Upozornenie:
Tento dokument bol preložený pomocou služby na automatický preklad Co-op Translator. Hoci sa snažíme o presnosť, upozorňujeme, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre dôležité informácie odporúčame profesionálny ľudský preklad. Nezodpovedáme za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.