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/cs/6-consumer/lessons/3-spoken-feedback/wio-terminal-set-timer.md

9.9 KiB

Nastavení časovače - Wio Terminal

V této části lekce zavoláte svůj serverless kód, abyste porozuměli řeči, a na základě výsledků nastavíte časovač na svém Wio Terminalu.

Nastavení časovače

Text, který se vrátí z volání převodu řeči na text, je třeba odeslat do vašeho serverless kódu, aby jej zpracoval LUIS a vrátil počet sekund pro časovač. Tento počet sekund lze použít k nastavení časovače.

Mikrokontroléry nemají nativní podporu pro více vláken v Arduino, takže zde nejsou standardní třídy časovačů, jaké byste mohli najít při programování v Pythonu nebo jiných vyšších programovacích jazycích. Místo toho můžete použít knihovny časovačů, které fungují měřením uplynulého času ve funkci loop a voláním funkcí, když čas vyprší.

Úkol - odeslání textu do serverless funkce

  1. Otevřete projekt smart-timer ve VS Code, pokud již není otevřený.

  2. Otevřete hlavičkový soubor config.h a přidejte URL pro vaši funkci:

    const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
    

    Nahraďte <URL> URL adresou vaší funkce, kterou jste získali v posledním kroku předchozí lekce, a která ukazuje na IP adresu vašeho lokálního počítače, kde běží funkce.

  3. Vytvořte nový soubor ve složce src s názvem language_understanding.h. Tento soubor bude použit k definování třídy, která odešle rozpoznanou řeč do vaší funkce a převede ji na sekundy pomocí LUIS.

  4. Přidejte následující na začátek tohoto souboru:

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

    To zahrnuje potřebné hlavičkové soubory.

  5. Definujte třídu s názvem LanguageUnderstanding a deklarujte instanci této třídy:

    class LanguageUnderstanding
    {
    public:
    private:
    };
    
    LanguageUnderstanding languageUnderstanding;
    
  6. Pro volání vaší funkce je třeba deklarovat WiFi klienta. Přidejte následující do sekce private třídy:

    WiFiClient _client;
    
  7. V sekci public deklarujte metodu s názvem GetTimerDuration pro volání funkce:

    int GetTimerDuration(String text)
    {
    }
    
  8. V metodě GetTimerDuration přidejte následující kód pro sestavení JSON, který bude odeslán do funkce:

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

    Tento kód převede text předaný metodě GetTimerDuration na následující JSON:

    {
        "text" : "<text>"
    }
    

    kde <text> je text předaný funkci.

  9. Pod tímto kódem přidejte následující kód pro volání funkce:

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

    Tento kód provede POST požadavek na funkci, předá JSON tělo a získá kód odpovědi.

  10. Přidejte následující kód pod tento blok:

    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 zkontroluje kód odpovědi. Pokud je 200 (úspěch), pak se počet sekund pro časovač získá z těla odpovědi. Jinak se do sériového monitoru odešle chyba a počet sekund se nastaví na 0.

  11. Přidejte následující kód na konec této metody pro uzavření HTTP připojení a vrácení počtu sekund:

    httpClient.end();
    
    return seconds;
    
  12. V souboru main.cpp zahrňte tento nový hlavičkový soubor:

    #include "speech_to_text.h"
    
  13. Na konci funkce processAudio zavolejte metodu GetTimerDuration, abyste získali dobu trvání časovače:

    int total_seconds = languageUnderstanding.GetTimerDuration(text);
    

    Tento kód převede text z volání třídy SpeechToText na počet sekund pro časovač.

Úkol - nastavení časovače

Počet sekund lze použít k nastavení časovače.

  1. Přidejte následující závislost knihovny do souboru platformio.ini, abyste přidali knihovnu pro nastavení časovače:

    contrem/arduino-timer @ 2.3.0
    
  2. Přidejte direktivu pro zahrnutí této knihovny do souboru main.cpp:

    #include <arduino-timer.h>
    
  3. Nad funkcí processAudio přidejte následující kód:

    auto timer = timer_create_default();
    

    Tento kód deklaruje časovač s názvem timer.

  4. Pod tímto kódem přidejte následující:

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

    Tato funkce say nakonec převede text na řeč, ale prozatím pouze zapíše předaný text do sériového monitoru.

  5. Pod funkcí say přidejte následující kód:

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

    Toto je zpětně volaná funkce, která bude volána, když časovač vyprší. Je jí předána zpráva, která se má říct, když časovač vyprší. Časovače se mohou opakovat, a to lze ovládat návratovou hodnotou této funkce - zde vrací false, aby časovač neběžel znovu.

  6. Přidejte následující kód na konec funkce processAudio:

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

    Tento kód zkontroluje celkový počet sekund, a pokud je 0, vrátí se z funkce, aby se žádné časovače nenastavily. Poté převede celkový počet sekund na minuty a sekundy.

  7. Pod tento kód přidejte následující pro vytvoření zprávy, která se má říct při spuštění časovače:

    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. Pod tento kód přidejte podobný kód pro vytvoření zprávy, která se má říct, když č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.";
    
  9. Poté řekněte zprávu o spuštění časovače:

    say(begin_message);
    
  10. Na konci této funkce spusťte časovač:

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

    Tento kód spustí časovač. Časovač je nastaven pomocí milisekund, takže celkový počet sekund je vynásoben 1 000 pro převod na milisekundy. Funkce timerExpired je předána jako zpětně volaná funkce a end_message je předána jako argument pro zpětné volání. Toto zpětné volání přijímá pouze argumenty typu void *, takže řetězec je odpovídajícím způsobem převeden.

  11. Nakonec je třeba, aby časovač "tiknul", což se provádí ve funkci loop. Přidejte následující kód na konec funkce loop:

    timer.tick();
    
  12. Sestavte tento kód, nahrajte jej do svého Wio Terminalu a otestujte jej prostřednictvím sériového monitoru. Jakmile uvidíte Ready v sériovém monitoru, stiskněte tlačítko C (to vlevo, nejblíže k vypínači) a mluvte. 4 sekundy zvuku budou zachyceny, převedeny na text, poté odeslány do vaší funkce a časovač bude nastaven. Ujistěte se, že vaše funkce běží lokálně.

    Uvidíte, kdy časovač začne a kdy 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 najdete ve složce code-timer/wio-terminal.

😀 Váš program časovače byl úspěšný!


Prohlášení:
Tento dokument byl přeložen pomocí služby pro automatický překlad Co-op Translator. I když se snažíme o přesnost, mějte na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro důležité informace se doporučuje profesionální lidský překlad. Nenese odpovědnost za žádné nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.