9.7 KiB
Aseta ajastin - Wio Terminal
Tässä oppitunnin osassa kutsut palvelutonta koodiasi puheen ymmärtämiseksi ja asetat ajastimen Wio Terminal -laitteellesi tulosten perusteella.
Aseta ajastin
Puheesta tekstiksi -kutsusta palautuva teksti täytyy lähettää palveluttomaan koodiisi, jossa LUIS käsittelee sen ja palauttaa ajastimen sekuntimäärän. Tätä sekuntimäärää voidaan käyttää ajastimen asettamiseen.
Mikrokontrollereilla ei ole natiivisti tukea useille säikeille Arduinossa, joten ei ole olemassa standardeja ajastinluokkia, kuten Pythonissa tai muissa korkeamman tason kielissä. Sen sijaan voit käyttää ajastinkirjastoja, jotka toimivat mittaamalla kulunutta aikaa loop
-funktiossa ja kutsumalla funktioita, kun aika on kulunut.
Tehtävä - lähetä teksti palveluttomaan funktioon
-
Avaa
smart-timer
-projekti VS Codessa, jos se ei ole jo auki. -
Avaa
config.h
-otsikkotiedosto ja lisää URL funktiosovelluksellesi:const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
Korvaa
<URL>
funktiosovelluksesi URL-osoitteella, jonka sait viimeisen oppitunnin viimeisessä vaiheessa, osoittaen paikallisen koneesi IP-osoitteeseen, jossa funktiosovellus toimii. -
Luo uusi tiedosto
src
-kansioon nimeltälanguage_understanding.h
. Tätä käytetään luokan määrittämiseen, joka lähettää tunnistetun puheen funktiosovelluksellesi ja muuntaa sen sekunneiksi LUIS:n avulla. -
Lisää tämän tiedoston alkuun seuraava:
#pragma once #include <Arduino.h> #include <ArduinoJson.h> #include <HTTPClient.h> #include <WiFiClient.h> #include "config.h"
Tämä sisältää tarvittavat otsikkotiedostot.
-
Määritä luokka nimeltä
LanguageUnderstanding
ja julista tämän luokan instanssi:class LanguageUnderstanding { public: private: }; LanguageUnderstanding languageUnderstanding;
-
Funktiosovelluksen kutsumiseksi sinun täytyy julistaa WiFi-asiakas. Lisää seuraava luokan
private
-osioon:WiFiClient _client;
-
Julista
public
-osiossa metodi nimeltäGetTimerDuration
, joka kutsuu funktiosovellusta:int GetTimerDuration(String text) { }
-
Lisää
GetTimerDuration
-metodiin seuraava koodi JSON:n rakentamiseksi, joka lähetetään funktiosovellukseen:DynamicJsonDocument doc(1024); doc["text"] = text; String body; serializeJson(doc, body);
Tämä muuntaa
GetTimerDuration
-metodille välitetyn tekstin seuraavaksi JSON:ksi:{ "text" : "<text>" }
missä
<text>
on funktiolle välitetty teksti. -
Lisää tämän alle seuraava koodi funktiosovelluksen kutsumiseksi:
HTTPClient httpClient; httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL); int httpResponseCode = httpClient.POST(body);
Tämä tekee POST-pyynnön funktiosovellukseen, välittää JSON-rungon ja saa vastauskoodin.
-
Lisää tämän alle seuraava koodi:
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); }
Tämä koodi tarkistaa vastauskoodin. Jos se on 200 (onnistuminen), ajastimen sekuntimäärä haetaan vastausrungosta. Muussa tapauksessa virhe lähetetään sarjamonitoriin ja sekuntimääräksi asetetaan 0.
-
Lisää tämän metodin loppuun seuraava koodi HTTP-yhteyden sulkemiseksi ja sekuntimäärän palauttamiseksi:
httpClient.end(); return seconds;
-
Lisää
main.cpp
-tiedostoon tämän uuden otsikon sisällytys:#include "speech_to_text.h"
-
Kutsu
processAudio
-funktion lopussaGetTimerDuration
-metodia ajastimen keston saamiseksi:int total_seconds = languageUnderstanding.GetTimerDuration(text);
Tämä muuntaa
SpeechToText
-luokan kutsusta saadun tekstin ajastimen sekuntimääräksi.
Tehtävä - aseta ajastin
Sekuntimäärää voidaan käyttää ajastimen asettamiseen.
-
Lisää seuraava kirjastoriippuvuus
platformio.ini
-tiedostoon ajastinkirjaston lisäämiseksi:contrem/arduino-timer @ 2.3.0
-
Lisää sisällytysohje tälle kirjastolle
main.cpp
-tiedostoon:#include <arduino-timer.h>
-
Lisää
processAudio
-funktion yläpuolelle seuraava koodi:auto timer = timer_create_default();
Tämä koodi julistaa ajastimen nimeltä
timer
. -
Lisää tämän alle seuraava koodi:
void say(String text) { Serial.print("Saying "); Serial.println(text); }
Tämä
say
-funktio muuntaa tekstin puheeksi tulevaisuudessa, mutta toistaiseksi se vain kirjoittaa välitetyn tekstin sarjamonitoriin. -
Lisää
say
-funktion alle seuraava koodi:bool timerExpired(void *announcement) { say((char *)announcement); return false; }
Tämä on palautefunktio, joka kutsutaan, kun ajastin päättyy. Sille välitetään viesti, joka sanotaan ajastimen päättyessä. Ajastimet voivat toistua, ja tämä voidaan hallita palautearvon avulla - tämä palauttaa
false
, mikä kertoo ajastimelle, ettei sitä ajeta uudelleen. -
Lisää seuraava koodi
processAudio
-funktion loppuun:if (total_seconds == 0) { return; } int minutes = total_seconds / 60; int seconds = total_seconds % 60;
Tämä koodi tarkistaa sekuntien kokonaismäärän, ja jos se on 0, se palaa funktiokutsusta, jotta ajastimia ei aseteta. Se muuntaa sekuntien kokonaismäärän minuuteiksi ja sekunneiksi.
-
Lisää tämän koodin alle seuraava koodi viestin luomiseksi, joka sanotaan ajastimen käynnistyessä:
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.";
-
Lisää tämän alle vastaava koodi viestin luomiseksi, joka sanotaan ajastimen päättyessä:
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.";
-
Tämän jälkeen sano ajastimen käynnistysviesti:
say(begin_message);
-
Lisää tämän funktion loppuun ajastimen käynnistys:
timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str()));
Tämä käynnistää ajastimen. Ajastin asetetaan millisekunteina, joten sekuntien kokonaismäärä kerrotaan 1 000:lla millisekunneiksi muuntamiseksi.
timerExpired
-funktio välitetään palautefunktiona, jaend_message
välitetään argumenttina palautefunktiolle. Tämä palautefunktio hyväksyy vainvoid *
-argumentteja, joten merkkijono muunnetaan asianmukaisesti. -
Lopuksi ajastimen täytyy "tikittää", ja tämä tehdään
loop
-funktiossa. Lisää seuraava koodiloop
-funktion loppuun:timer.tick();
-
Rakenna tämä koodi, lataa se Wio Terminal -laitteeseesi ja testaa sitä sarjamonitorin kautta. Kun näet
Ready
sarjamonitorissa, paina C-painiketta (vasemmalla puolella, lähimpänä virtakytkintä) ja puhu. 4 sekuntia ääntä tallennetaan, muunnetaan tekstiksi, lähetetään funktiosovellukseesi ja ajastin asetetaan. Varmista, että funktiosovelluksesi toimii paikallisesti.Näet, milloin ajastin käynnistyy ja milloin se päättyy.
--- 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.
💁 Löydät tämän koodin code-timer/wio-terminal -kansiosta.
😀 Ajastinohjelmasi onnistui!
Vastuuvapauslauseke:
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua Co-op Translator. Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.