You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/hu/6-consumer/lessons/3-spoken-feedback/wio-terminal-set-timer.md

10 KiB

Állíts be egy időzítőt - Wio Terminal

Ebben a leckében a szerver nélküli kódodat fogod meghívni, hogy felismerje a beszédet, és az eredmények alapján beállítson egy időzítőt a Wio Terminal eszközön.

Időzítő beállítása

A beszédfelismerésből visszakapott szöveget el kell küldeni a szerver nélküli kódodnak, hogy a LUIS feldolgozza, és visszaadja az időzítőhöz szükséges másodpercek számát. Ez a másodpercek száma felhasználható az időzítő beállításához.

A mikrokontrollerek nem támogatják natívan a több szálat az Arduino környezetben, így nincsenek standard időzítő osztályok, mint például Pythonban vagy más magas szintű nyelvekben. Ehelyett olyan időzítő könyvtárakat használhatsz, amelyek az loop függvényben eltelt időt mérik, és funkciókat hívnak meg, amikor az idő lejár.

Feladat - küldd el a szöveget a szerver nélküli funkciónak

  1. Nyisd meg a smart-timer projektet a VS Code-ban, ha még nincs megnyitva.

  2. Nyisd meg a config.h fejlécfájlt, és add hozzá a funkció alkalmazás URL-jét:

    const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
    

    Cseréld ki a <URL> helyére azt az URL-t, amelyet az előző lecke utolsó lépésében kaptál, és amely a helyi géped IP-címére mutat, ahol a funkció alkalmazás fut.

  3. Hozz létre egy új fájlt a src mappában language_understanding.h néven. Ez a fájl egy osztályt fog definiálni, amely a felismert beszédet elküldi a funkció alkalmazásnak, hogy másodpercekké alakítsa át a LUIS segítségével.

  4. Add hozzá a következőket a fájl tetejéhez:

    #pragma once
    
    #include <Arduino.h>
    #include <ArduinoJson.h>
    #include <HTTPClient.h>
    #include <WiFiClient.h>
    
    #include "config.h"
    

    Ez néhány szükséges fejlécfájlt tartalmaz.

  5. Definiálj egy LanguageUnderstanding nevű osztályt, és deklarálj egy példányt ebből az osztályból:

    class LanguageUnderstanding
    {
    public:
    private:
    };
    
    LanguageUnderstanding languageUnderstanding;
    
  6. A funkció alkalmazás meghívásához deklarálj egy WiFi klienst. Add hozzá a következőt az osztály private szekciójához:

    WiFiClient _client;
    
  7. Az public szekcióban deklarálj egy GetTimerDuration nevű metódust, amely meghívja a funkció alkalmazást:

    int GetTimerDuration(String text)
    {
    }
    
  8. Az GetTimerDuration metódusban add hozzá a következő kódot, amely létrehozza a JSON-t, amit elküldesz a funkció alkalmazásnak:

    DynamicJsonDocument doc(1024);
    doc["text"] = text;
    
    String body;
    serializeJson(doc, body);
    

    Ez a kód a metódusnak átadott szöveget a következő JSON formátumba alakítja:

    {
        "text" : "<text>"
    }
    

    ahol <text> az átadott szöveg.

  9. Ez alatt add hozzá a következő kódot, amely meghívja a funkció alkalmazást:

    HTTPClient httpClient;
    httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL);
    
    int httpResponseCode = httpClient.POST(body);
    

    Ez egy POST kérést küld a funkció alkalmazásnak, átadva a JSON törzset, és visszakapja a válaszkódot.

  10. Add hozzá a következő kódot ez alatt:

    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);
    }
    

    Ez a kód ellenőrzi a válaszkódot. Ha az 200 (sikeres), akkor az időzítőhöz szükséges másodpercek száma kinyerésre kerül a válasz törzséből. Ellenkező esetben egy hibaüzenet kerül a soros monitorra, és a másodpercek száma 0-ra áll.

  11. Add hozzá a következő kódot a metódus végéhez, amely lezárja a HTTP kapcsolatot, és visszaadja a másodpercek számát:

    httpClient.end();
    
    return seconds;
    
  12. A main.cpp fájlban illeszd be az új fejlécet:

    #include "speech_to_text.h"
    
  13. A processAudio függvény végén hívd meg a GetTimerDuration metódust, hogy megkapd az időzítő időtartamát:

    int total_seconds = languageUnderstanding.GetTimerDuration(text);
    

    Ez a kód a SpeechToText osztályból származó szöveget másodpercekké alakítja az időzítő számára.

Feladat - időzítő beállítása

A másodpercek száma felhasználható egy időzítő beállításához.

  1. Add hozzá a következő könyvtárfüggőséget a platformio.ini fájlhoz, hogy egy időzítő könyvtárat adj hozzá:

    contrem/arduino-timer @ 2.3.0
    
  2. Add hozzá egy include direktívát ehhez a könyvtárhoz a main.cpp fájlban:

    #include <arduino-timer.h>
    
  3. A processAudio függvény felett add hozzá a következő kódot:

    auto timer = timer_create_default();
    

    Ez a kód egy timer nevű időzítőt deklarál.

  4. Ez alatt add hozzá a következő kódot:

    void say(String text)
    {
        Serial.print("Saying ");
        Serial.println(text);
    }
    

    Ez a say függvény végül szöveget fog beszéddé alakítani, de egyelőre csak a soros monitorra írja ki az átadott szöveget.

  5. A say függvény alatt add hozzá a következő kódot:

    bool timerExpired(void *announcement)
    {
        say((char *)announcement);
        return false;
    }
    

    Ez egy visszahívási függvény, amely akkor kerül meghívásra, amikor egy időzítő lejár. Egy üzenetet kap, amit lejáratkor ki kell mondani. Az időzítők ismételhetők, és ezt a visszatérési érték szabályozza - itt false-t ad vissza, hogy az időzítő ne fusson újra.

  6. Add hozzá a következő kódot a processAudio függvény végéhez:

    if (total_seconds == 0)
    {
        return;
    }
    
    int minutes = total_seconds / 60;
    int seconds = total_seconds % 60;
    

    Ez a kód ellenőrzi az összes másodpercet, és ha az 0, visszatér a függvényből, így nem állít be időzítőt. Ezután az összes másodpercet percekké és másodpercekké alakítja.

  7. Ez alatt add hozzá a következőt, hogy létrehozz egy üzenetet, amit az időzítő indításakor kell kimondani:

    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.";
    
  8. Ez alatt add hozzá hasonló kódot, hogy létrehozz egy üzenetet, amit az időzítő lejáratakor kell kimondani:

    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.";
    
  9. Ezután mondd ki az időzítő indítási üzenetét:

    say(begin_message);
    
  10. A függvény végén indítsd el az időzítőt:

    timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str()));
    

    Ez elindítja az időzítőt. Az időzítőt milliszekundumokban kell beállítani, így az összes másodpercet 1,000-rel szorozzuk, hogy milliszekundumokká alakítsuk. A timerExpired függvény kerül átadásra visszahívásként, és az end_message kerül átadásra argumentumként a visszahívásnak. Ez a visszahívás csak void * típusú argumentumokat fogad, így a szöveg megfelelően kerül átalakításra.

  11. Végül az időzítőnek tickelnie kell, és ezt a loop függvény végén kell megtenni. Add hozzá a következő kódot a loop függvény végéhez:

    timer.tick();
    
  12. Fordítsd le a kódot, töltsd fel a Wio Terminal eszközre, és teszteld a soros monitoron keresztül. Amint a soros monitorban megjelenik a Ready, nyomd meg a C gombot (a bal oldali gombot, amely a legközelebb van a bekapcsoló kapcsolóhoz), és beszélj. 4 másodpercnyi hangot rögzít, szöveggé alakít, majd elküldi a funkció alkalmazásnak, és beállít egy időzítőt. Győződj meg róla, hogy a funkció alkalmazás helyileg fut.

    Látni fogod, mikor indul el az időzítő, és mikor jár le.

    --- 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.
    

💁 Ezt a kódot megtalálhatod a code-timer/wio-terminal mappában.

😀 Az időzítő programod sikeres volt!


Felelősség kizárása:
Ez a dokumentum az AI fordítási szolgáltatás, a Co-op Translator segítségével lett lefordítva. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely a fordítás használatából eredhet.