10 KiB
Postavite mjerač vremena - Wio Terminal
U ovom dijelu lekcije pozvat ćete svoj serverless kod kako biste razumjeli govor i postavili mjerač vremena na svom Wio Terminalu na temelju rezultata.
Postavite mjerač vremena
Tekst koji se vraća iz poziva za pretvaranje govora u tekst treba poslati vašem serverless kodu kako bi ga obradio LUIS, koji će vratiti broj sekundi za mjerač vremena. Ovaj broj sekundi može se koristiti za postavljanje mjerača vremena.
Mikrokontroleri nemaju ugrađenu podršku za višestruke niti u Arduino okruženju, pa ne postoje standardne klase za mjerače vremena kao što ih možete pronaći u Pythonu ili drugim jezicima višeg nivoa. Umjesto toga, možete koristiti biblioteke za mjerače vremena koje rade mjerenjem proteklog vremena u funkciji loop
i pozivanjem funkcija kada vrijeme istekne.
Zadatak - pošaljite tekst serverless funkciji
-
Otvorite projekt
smart-timer
u VS Code-u ako već nije otvoren. -
Otvorite datoteku zaglavlja
config.h
i dodajte URL za svoju funkcijsku aplikaciju:const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
Zamijenite
<URL>
s URL-om za vašu funkcijsku aplikaciju koji ste dobili u posljednjem koraku prethodne lekcije, ukazujući na IP adresu vašeg lokalnog računala na kojem se pokreće funkcijska aplikacija. -
Kreirajte novu datoteku u mapi
src
pod nazivomlanguage_understanding.h
. Ova datoteka će se koristiti za definiranje klase koja će slati prepoznati govor vašoj funkcijskoj aplikaciji kako bi se pretvorio u sekunde pomoću LUIS-a. -
Dodajte sljedeće na vrh ove datoteke:
#pragma once #include <Arduino.h> #include <ArduinoJson.h> #include <HTTPClient.h> #include <WiFiClient.h> #include "config.h"
Ovo uključuje potrebne datoteke zaglavlja.
-
Definirajte klasu pod nazivom
LanguageUnderstanding
i deklarirajte instancu ove klase:class LanguageUnderstanding { public: private: }; LanguageUnderstanding languageUnderstanding;
-
Za pozivanje funkcijske aplikacije trebate deklarirati WiFi klijent. Dodajte sljedeće u privatni dio klase:
WiFiClient _client;
-
U javnom dijelu klase deklarirajte metodu pod nazivom
GetTimerDuration
za pozivanje funkcijske aplikacije:int GetTimerDuration(String text) { }
-
U metodi
GetTimerDuration
dodajte sljedeći kod za izradu JSON-a koji će se poslati funkcijskoj aplikaciji:DynamicJsonDocument doc(1024); doc["text"] = text; String body; serializeJson(doc, body);
Ovo pretvara tekst proslijeđen metodi
GetTimerDuration
u sljedeći JSON:{ "text" : "<text>" }
gdje je
<text>
tekst proslijeđen funkciji. -
Ispod ovoga dodajte sljedeći kod za pozivanje funkcijske aplikacije:
HTTPClient httpClient; httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL); int httpResponseCode = httpClient.POST(body);
Ovo šalje POST zahtjev funkcijskoj aplikaciji, prosljeđujući JSON tijelo i dobivajući odgovor.
-
Dodajte sljedeći kod ispod ovoga:
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); }
Ovaj kod provjerava kod odgovora. Ako je 200 (uspjeh), tada se broj sekundi za mjerač vremena dohvaća iz tijela odgovora. Inače, greška se šalje na serijski monitor, a broj sekundi postavlja se na 0.
-
Dodajte sljedeći kod na kraj ove metode kako biste zatvorili HTTP vezu i vratili broj sekundi:
httpClient.end(); return seconds;
-
U datoteci
main.cpp
uključite ovo novo zaglavlje:#include "speech_to_text.h"
-
Na kraju funkcije
processAudio
pozovite metoduGetTimerDuration
kako biste dobili trajanje mjerača vremena:int total_seconds = languageUnderstanding.GetTimerDuration(text);
Ovo pretvara tekst iz poziva klasi
SpeechToText
u broj sekundi za mjerač vremena.
Zadatak - postavite mjerač vremena
Broj sekundi može se koristiti za postavljanje mjerača vremena.
-
Dodajte sljedeću ovisnost biblioteke u datoteku
platformio.ini
kako biste dodali biblioteku za postavljanje mjerača vremena:contrem/arduino-timer @ 2.3.0
-
Dodajte direktivu za uključivanje ove biblioteke u datoteku
main.cpp
:#include <arduino-timer.h>
-
Iznad funkcije
processAudio
dodajte sljedeći kod:auto timer = timer_create_default();
Ovaj kod deklarira mjerač vremena pod nazivom
timer
. -
Ispod ovoga dodajte sljedeći kod:
void say(String text) { Serial.print("Saying "); Serial.println(text); }
Ova funkcija
say
će na kraju pretvarati tekst u govor, ali za sada će samo ispisivati proslijeđeni tekst na serijski monitor. -
Ispod funkcije
say
dodajte sljedeći kod:bool timerExpired(void *announcement) { say((char *)announcement); return false; }
Ovo je funkcija povratnog poziva koja će se pozvati kada mjerač vremena istekne. Prosljeđuje se poruka koja će se izgovoriti kada mjerač vremena istekne. Mjerači vremena mogu se ponavljati, a to se kontrolira povratnom vrijednošću ove funkcije povratnog poziva - ovdje vraća
false
, što znači da se mjerač vremena neće ponovno pokrenuti. -
Dodajte sljedeći kod na kraj funkcije
processAudio
:if (total_seconds == 0) { return; } int minutes = total_seconds / 60; int seconds = total_seconds % 60;
Ovaj kod provjerava ukupan broj sekundi, i ako je 0, vraća se iz funkcijskog poziva kako se ne bi postavili mjerači vremena. Zatim pretvara ukupan broj sekundi u minute i sekunde.
-
Ispod ovog koda dodajte sljedeće kako biste stvorili poruku koja će se izgovoriti kada mjerač vremena započne:
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.";
-
Ispod ovoga dodajte sličan kod za stvaranje poruke koja će se izgovoriti kada mjerač vremena istekne:
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.";
-
Nakon ovoga, izgovorite poruku o pokretanju mjerača vremena:
say(begin_message);
-
Na kraju ove funkcije pokrenite mjerač vremena:
timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str()));
Ovo pokreće mjerač vremena. Mjerač vremena postavlja se u milisekundama, pa se ukupan broj sekundi množi s 1.000 kako bi se pretvorio u milisekunde. Funkcija
timerExpired
prosljeđuje se kao povratni poziv, aend_message
se prosljeđuje kao argument za povratni poziv. Ova funkcija povratnog poziva prihvaća samo argumente tipavoid *
, pa se string odgovarajuće pretvara. -
Na kraju, mjerač vremena treba otkucavati, a to se radi u funkciji
loop
. Dodajte sljedeći kod na kraj funkcijeloop
:timer.tick();
-
Sastavite ovaj kod, prenesite ga na svoj Wio Terminal i testirajte ga putem serijskog monitora. Kada vidite
Ready
na serijskom monitoru, pritisnite tipku C (onu na lijevoj strani, najbližu prekidaču za napajanje) i govorite. Snimit će se 4 sekunde zvuka, pretvoriti u tekst, poslati vašoj funkcijskoj aplikaciji i postaviti mjerač vremena. Provjerite radi li vaša funkcijska aplikacija lokalno.Vidjet ćete kada mjerač vremena započne i kada završi.
--- 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.
💁 Ovaj kod možete pronaći u mapi code-timer/wio-terminal.
😀 Vaš program za mjerač vremena bio je uspješan!
Odricanje od odgovornosti:
Ovaj dokument je preveden pomoću AI usluge za prevođenje Co-op Translator. Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja mogu proizaći iz korištenja ovog prijevoda.