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

9.9 KiB

Tetapkan Pemasa - Wio Terminal

Dalam bahagian pelajaran ini, anda akan memanggil kod tanpa pelayan anda untuk memahami ucapan, dan menetapkan pemasa pada Wio Terminal berdasarkan hasilnya.

Tetapkan Pemasa

Teks yang kembali daripada panggilan ucapan ke teks perlu dihantar ke kod tanpa pelayan anda untuk diproses oleh LUIS, mendapatkan kembali bilangan saat untuk pemasa. Bilangan saat ini boleh digunakan untuk menetapkan pemasa.

Mikrokontroler tidak secara asli menyokong pelbagai benang dalam Arduino, jadi tiada kelas pemasa standard seperti yang mungkin anda temui semasa menulis kod dalam Python atau bahasa tahap tinggi lain. Sebaliknya, anda boleh menggunakan perpustakaan pemasa yang berfungsi dengan mengukur masa yang berlalu dalam fungsi loop, dan memanggil fungsi apabila masa tamat.

Tugas - hantar teks ke fungsi tanpa pelayan

  1. Buka projek smart-timer dalam VS Code jika ia belum dibuka.

  2. Buka fail header config.h dan tambahkan URL untuk aplikasi fungsi anda:

    const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
    

    Gantikan <URL> dengan URL untuk aplikasi fungsi anda yang diperoleh dalam langkah terakhir pelajaran sebelumnya, menunjuk kepada alamat IP mesin tempatan anda yang menjalankan aplikasi fungsi.

  3. Buat fail baru dalam folder src bernama language_understanding.h. Fail ini akan digunakan untuk mendefinisikan kelas bagi menghantar ucapan yang dikenali ke aplikasi fungsi anda untuk ditukar kepada saat menggunakan LUIS.

  4. Tambahkan perkara berikut di bahagian atas fail ini:

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

    Ini termasuk beberapa fail header yang diperlukan.

  5. Definisikan kelas bernama LanguageUnderstanding, dan isytiharkan satu instans kelas ini:

    class LanguageUnderstanding
    {
    public:
    private:
    };
    
    LanguageUnderstanding languageUnderstanding;
    
  6. Untuk memanggil aplikasi fungsi anda, anda perlu mengisytiharkan klien WiFi. Tambahkan perkara berikut ke bahagian private dalam kelas:

    WiFiClient _client;
    
  7. Dalam bahagian public, isytiharkan kaedah bernama GetTimerDuration untuk memanggil aplikasi fungsi:

    int GetTimerDuration(String text)
    {
    }
    
  8. Dalam kaedah GetTimerDuration, tambahkan kod berikut untuk membina JSON yang akan dihantar ke aplikasi fungsi:

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

    Ini menukar teks yang dihantar ke kaedah GetTimerDuration menjadi JSON berikut:

    {
        "text" : "<text>"
    }
    

    di mana <text> adalah teks yang dihantar ke fungsi.

  9. Di bawah ini, tambahkan kod berikut untuk membuat panggilan aplikasi fungsi:

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

    Ini membuat permintaan POST ke aplikasi fungsi, menghantar badan JSON dan mendapatkan kod respons.

  10. Tambahkan kod berikut di bawah ini:

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

    Kod ini memeriksa kod respons. Jika ia adalah 200 (berjaya), maka bilangan saat untuk pemasa diambil daripada badan respons. Jika tidak, ralat dihantar ke monitor serial dan bilangan saat ditetapkan kepada 0.

  11. Tambahkan kod berikut ke akhir kaedah ini untuk menutup sambungan HTTP dan mengembalikan bilangan saat:

    httpClient.end();
    
    return seconds;
    
  12. Dalam fail main.cpp, sertakan header baru ini:

    #include "speech_to_text.h"
    
  13. Pada akhir fungsi processAudio, panggil kaedah GetTimerDuration untuk mendapatkan tempoh pemasa:

    int total_seconds = languageUnderstanding.GetTimerDuration(text);
    

    Ini menukar teks daripada panggilan ke kelas SpeechToText menjadi bilangan saat untuk pemasa.

Tugas - tetapkan pemasa

Bilangan saat boleh digunakan untuk menetapkan pemasa.

  1. Tambahkan kebergantungan perpustakaan berikut ke fail platformio.ini untuk menambahkan perpustakaan bagi menetapkan pemasa:

    contrem/arduino-timer @ 2.3.0
    
  2. Tambahkan arahan sertakan untuk perpustakaan ini ke fail main.cpp:

    #include <arduino-timer.h>
    
  3. Di atas fungsi processAudio, tambahkan kod berikut:

    auto timer = timer_create_default();
    

    Kod ini mengisytiharkan pemasa bernama timer.

  4. Di bawah ini, tambahkan kod berikut:

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

    Fungsi say ini akhirnya akan menukar teks kepada ucapan, tetapi buat masa ini ia hanya akan menulis teks yang dihantar ke monitor serial.

  5. Di bawah fungsi say, tambahkan kod berikut:

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

    Ini adalah fungsi panggilan balik yang akan dipanggil apabila pemasa tamat. Ia dihantar mesej untuk diucapkan apabila pemasa tamat. Pemasa boleh berulang, dan ini boleh dikawal oleh nilai pulangan fungsi panggilan balik ini - ini mengembalikan false, untuk memberitahu pemasa agar tidak berjalan lagi.

  6. Tambahkan kod berikut ke akhir fungsi processAudio:

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

    Kod ini memeriksa jumlah bilangan saat, dan jika ia adalah 0, kembali daripada panggilan fungsi supaya tiada pemasa ditetapkan. Ia kemudian menukar jumlah bilangan saat menjadi minit dan saat.

  7. Di bawah kod ini, tambahkan perkara berikut untuk mencipta mesej untuk diucapkan apabila pemasa dimulakan:

    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. Di bawah ini, tambahkan kod serupa untuk mencipta mesej untuk diucapkan apabila pemasa tamat:

    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. Selepas ini, ucapkan mesej pemasa dimulakan:

    say(begin_message);
    
  10. Pada akhir fungsi ini, mulakan pemasa:

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

    Ini mencetuskan pemasa. Pemasa ditetapkan menggunakan milisaat, jadi jumlah bilangan saat didarabkan dengan 1,000 untuk ditukar kepada milisaat. Fungsi timerExpired dihantar sebagai panggilan balik, dan end_message dihantar sebagai argumen untuk dihantar ke panggilan balik. Panggilan balik ini hanya mengambil argumen void *, jadi string ditukar dengan sewajarnya.

  11. Akhir sekali, pemasa perlu berdetik, dan ini dilakukan dalam fungsi loop. Tambahkan kod berikut di akhir fungsi loop:

    timer.tick();
    
  12. Bina kod ini, muat naik ke Wio Terminal anda dan uji melalui monitor serial. Sebaik sahaja anda melihat Ready dalam monitor serial, tekan butang C (yang di sebelah kiri, paling dekat dengan suis kuasa), dan bercakap. 4 saat audio akan ditangkap, ditukar kepada teks, kemudian dihantar ke aplikasi fungsi anda, dan pemasa akan ditetapkan. Pastikan aplikasi fungsi anda berjalan secara tempatan.

    Anda akan melihat apabila pemasa dimulakan, dan apabila ia tamat.

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

💁 Anda boleh menemui kod ini dalam folder code-timer/wio-terminal.

😀 Program pemasa anda berjaya!


Penafian:
Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI Co-op Translator. Walaupun kami berusaha untuk memastikan ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.