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

14 KiB

Настройване на таймер - Wio Terminal

В тази част от урока ще извикате вашия serverless код, за да разпознаете речта, и ще настроите таймер на вашия Wio Terminal въз основа на резултатите.

Настройване на таймер

Текстът, който се връща от преобразуването на реч в текст, трябва да бъде изпратен към вашия serverless код, за да бъде обработен от LUIS, който ще върне броя секунди за таймера. Този брой секунди може да се използва за настройване на таймер.

Микроконтролерите нямат вградена поддръжка за множество нишки в Arduino, така че няма стандартни класове за таймери, както може да срещнете при програмиране на Python или други езици от по-високо ниво. Вместо това можете да използвате библиотеки за таймери, които работят чрез измерване на изминалото време във функцията loop и извикване на функции, когато времето изтече.

Задача - изпратете текста към serverless функцията

  1. Отворете проекта smart-timer във VS Code, ако вече не е отворен.

  2. Отворете хедър файла config.h и добавете URL адреса за вашето приложение:

    const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
    

    Заменете <URL> с URL адреса на вашето приложение, който получихте в последната стъпка от предишния урок, сочещ към IP адреса на вашата локална машина, на която работи приложението.

  3. Създайте нов файл в папката src, наречен language_understanding.h. Този файл ще се използва за дефиниране на клас, който ще изпраща разпознатата реч към вашето приложение, за да бъде преобразувана в секунди чрез LUIS.

  4. Добавете следното в началото на този файл:

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

    Това включва необходимите хедър файлове.

  5. Дефинирайте клас, наречен LanguageUnderstanding, и декларирайте инстанция на този клас:

    class LanguageUnderstanding
    {
    public:
    private:
    };
    
    LanguageUnderstanding languageUnderstanding;
    
  6. За да извикате вашето приложение, трябва да декларирате WiFi клиент. Добавете следното в секцията private на класа:

    WiFiClient _client;
    
  7. В секцията public декларирайте метод, наречен GetTimerDuration, за да извикате приложението:

    int GetTimerDuration(String text)
    {
    }
    
  8. В метода GetTimerDuration добавете следния код, за да създадете JSON, който ще бъде изпратен към приложението:

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

    Това преобразува текста, предаден на метода GetTimerDuration, в следния JSON:

    {
        "text" : "<text>"
    }
    

    където <text> е текстът, предаден на функцията.

  9. Под това добавете следния код, за да извършите извикването към приложението:

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

    Това прави POST заявка към приложението, като предава JSON тялото и получава кода на отговора.

  10. Добавете следния код под това:

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

    Този код проверява кода на отговора. Ако е 200 (успех), броят секунди за таймера се извлича от тялото на отговора. В противен случай се изпраща грешка към серийния монитор и броят секунди се задава на 0.

  11. Добавете следния код в края на този метод, за да затворите HTTP връзката и да върнете броя секунди:

    httpClient.end();
    
    return seconds;
    
  12. Във файла main.cpp включете този нов хедър:

    #include "speech_to_text.h"
    
  13. В края на функцията processAudio извикайте метода GetTimerDuration, за да получите продължителността на таймера:

    int total_seconds = languageUnderstanding.GetTimerDuration(text);
    

    Това преобразува текста от извикването към класа SpeechToText в броя секунди за таймера.

Задача - настройване на таймер

Броят секунди може да се използва за настройване на таймер.

  1. Добавете следната зависимост към файла platformio.ini, за да добавите библиотека за настройване на таймер:

    contrem/arduino-timer @ 2.3.0
    
  2. Добавете директива за включване на тази библиотека във файла main.cpp:

    #include <arduino-timer.h>
    
  3. Над функцията processAudio добавете следния код:

    auto timer = timer_create_default();
    

    Този код декларира таймер, наречен timer.

  4. Под това добавете следния код:

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

    Тази функция say в крайна сметка ще преобразува текст в реч, но засега просто ще записва предадения текст в серийния монитор.

  5. Под функцията say добавете следния код:

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

    Това е функция за обратно извикване, която ще се извиква, когато таймерът изтече. Тя получава съобщение, което да се каже, когато таймерът изтече. Таймерите могат да се повтарят, а това се контролира от стойността, която връща тази функция - тук тя връща false, за да укаже, че таймерът не трябва да се изпълнява отново.

  6. Добавете следния код в края на функцията processAudio:

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

    Този код проверява общия брой секунди и ако е 0, връща от функцията, така че да не се настройват таймери. След това преобразува общия брой секунди в минути и секунди.

  7. Под този код добавете следното, за да създадете съобщение, което да се каже, когато таймерът започне:

    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. Под това добавете подобен код, за да създадете съобщение, което да се каже, когато таймерът изтече:

    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. След това кажете съобщението за стартиране на таймера:

    say(begin_message);
    
  10. В края на тази функция стартирайте таймера:

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

    Това задейства таймера. Таймерът се настройва с помощта на милисекунди, така че общият брой секунди се умножава по 1,000, за да се преобразува в милисекунди. Функцията timerExpired се предава като обратно извикване, а end_message се предава като аргумент към обратното извикване. Това обратно извикване приема само аргументи от тип void *, така че низът се преобразува съответно.

  11. Накрая, таймерът трябва да "тиктака", и това се прави във функцията loop. Добавете следния код в края на функцията loop:

    timer.tick();
    
  12. Създайте този код, качете го на вашия Wio Terminal и го тествайте чрез серийния монитор. След като видите Ready в серийния монитор, натиснете бутон C (този от лявата страна, най-близо до превключвателя за захранване) и говорете. Ще бъдат записани 4 секунди аудио, преобразувани в текст, след това изпратени към вашето приложение, и ще бъде настроен таймер. Уверете се, че вашето приложение работи локално.

    Ще видите кога таймерът започва и кога приключва.

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

💁 Можете да намерите този код в папката code-timer/wio-terminal.

😀 Вашата програма за таймер беше успешна!


Отказ от отговорност:
Този документ е преведен с помощта на AI услуга за превод Co-op Translator. Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.