9.8 KiB
Atur Timer - Wio Terminal
Dalam bagian pelajaran ini, Anda akan memanggil kode serverless Anda untuk memahami ucapan, dan mengatur timer pada Wio Terminal berdasarkan hasilnya.
Atur Timer
Teks yang dihasilkan dari panggilan speech-to-text perlu dikirim ke kode serverless Anda untuk diproses oleh LUIS, yang akan mengembalikan jumlah detik untuk timer. Jumlah detik ini dapat digunakan untuk mengatur timer.
Mikrokontroler secara bawaan tidak mendukung multiple threads di Arduino, sehingga tidak ada kelas timer standar seperti yang mungkin Anda temukan saat coding di Python atau bahasa tingkat tinggi lainnya. Sebagai gantinya, Anda dapat menggunakan pustaka timer yang bekerja dengan mengukur waktu yang telah berlalu di fungsi loop
, dan memanggil fungsi ketika waktu habis.
Tugas - Kirim teks ke fungsi serverless
-
Buka proyek
smart-timer
di VS Code jika belum terbuka. -
Buka file header
config.h
dan tambahkan URL untuk aplikasi fungsi Anda:const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
Ganti
<URL>
dengan URL untuk aplikasi fungsi Anda yang diperoleh pada langkah terakhir dari pelajaran sebelumnya, mengarah ke alamat IP mesin lokal Anda yang menjalankan aplikasi fungsi. -
Buat file baru di folder
src
bernamalanguage_understanding.h
. File ini akan digunakan untuk mendefinisikan kelas yang mengirimkan ucapan yang dikenali ke aplikasi fungsi Anda untuk dikonversi menjadi detik menggunakan LUIS. -
Tambahkan hal berikut di bagian atas file ini:
#pragma once #include <Arduino.h> #include <ArduinoJson.h> #include <HTTPClient.h> #include <WiFiClient.h> #include "config.h"
Ini mencakup beberapa file header yang diperlukan.
-
Definisikan kelas bernama
LanguageUnderstanding
, dan deklarasikan sebuah instance dari kelas ini:class LanguageUnderstanding { public: private: }; LanguageUnderstanding languageUnderstanding;
-
Untuk memanggil aplikasi fungsi Anda, Anda perlu mendeklarasikan klien WiFi. Tambahkan hal berikut ke bagian
private
dari kelas:WiFiClient _client;
-
Di bagian
public
, deklarasikan metode bernamaGetTimerDuration
untuk memanggil aplikasi fungsi:int GetTimerDuration(String text) { }
-
Dalam metode
GetTimerDuration
, tambahkan kode berikut untuk membangun JSON yang akan dikirim ke aplikasi fungsi:DynamicJsonDocument doc(1024); doc["text"] = text; String body; serializeJson(doc, body);
Ini mengonversi teks yang diteruskan ke metode
GetTimerDuration
menjadi JSON berikut:{ "text" : "<text>" }
di mana
<text>
adalah teks yang diteruskan ke fungsi. -
Di bawah ini, tambahkan kode berikut untuk membuat panggilan ke aplikasi fungsi:
HTTPClient httpClient; httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL); int httpResponseCode = httpClient.POST(body);
Ini membuat permintaan POST ke aplikasi fungsi, mengirimkan body JSON dan mendapatkan kode respons.
-
Tambahkan kode 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); }
Kode ini memeriksa kode respons. Jika 200 (berhasil), maka jumlah detik untuk timer diambil dari body respons. Jika tidak, pesan kesalahan dikirim ke serial monitor dan jumlah detik diatur ke 0.
-
Tambahkan kode berikut di akhir metode ini untuk menutup koneksi HTTP dan mengembalikan jumlah detik:
httpClient.end(); return seconds;
-
Dalam file
main.cpp
, sertakan header baru ini:#include "speech_to_text.h"
-
Di akhir fungsi
processAudio
, panggil metodeGetTimerDuration
untuk mendapatkan durasi timer:int total_seconds = languageUnderstanding.GetTimerDuration(text);
Ini mengonversi teks dari panggilan ke kelas
SpeechToText
menjadi jumlah detik untuk timer.
Tugas - Atur Timer
Jumlah detik dapat digunakan untuk mengatur timer.
-
Tambahkan dependensi pustaka berikut ke file
platformio.ini
untuk menambahkan pustaka untuk mengatur timer:contrem/arduino-timer @ 2.3.0
-
Tambahkan directive include untuk pustaka ini ke file
main.cpp
:#include <arduino-timer.h>
-
Di atas fungsi
processAudio
, tambahkan kode berikut:auto timer = timer_create_default();
Kode ini mendeklarasikan timer bernama
timer
. -
Di bawah ini, tambahkan kode berikut:
void say(String text) { Serial.print("Saying "); Serial.println(text); }
Fungsi
say
ini nantinya akan mengonversi teks menjadi ucapan, tetapi untuk saat ini hanya akan menulis teks yang diteruskan ke serial monitor. -
Di bawah fungsi
say
, tambahkan kode berikut:bool timerExpired(void *announcement) { say((char *)announcement); return false; }
Ini adalah fungsi callback yang akan dipanggil ketika timer habis. Fungsi ini menerima pesan untuk diucapkan ketika timer habis. Timer dapat diatur untuk berulang, dan ini dapat dikontrol oleh nilai pengembalian dari callback ini - fungsi ini mengembalikan
false
, untuk memberi tahu timer agar tidak berjalan lagi. -
Tambahkan kode berikut di akhir fungsi
processAudio
:if (total_seconds == 0) { return; } int minutes = total_seconds / 60; int seconds = total_seconds % 60;
Kode ini memeriksa jumlah total detik, dan jika 0, keluar dari fungsi sehingga tidak ada timer yang diatur. Kemudian mengonversi jumlah total detik menjadi menit dan detik.
-
Di bawah kode ini, tambahkan hal berikut untuk membuat pesan yang akan diucapkan saat timer dimulai:
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.";
-
Di bawah ini, tambahkan kode serupa untuk membuat pesan yang akan diucapkan saat timer habis:
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.";
-
Setelah ini, ucapkan pesan timer dimulai:
say(begin_message);
-
Di akhir fungsi ini, mulai timer:
timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str()));
Ini memicu timer. Timer diatur menggunakan milidetik, sehingga jumlah total detik dikalikan dengan 1.000 untuk dikonversi menjadi milidetik. Fungsi
timerExpired
diteruskan sebagai callback, danend_message
diteruskan sebagai argumen untuk diteruskan ke callback. Callback ini hanya menerima argumenvoid *
, sehingga string dikonversi dengan tepat. -
Terakhir, timer perlu tick, dan ini dilakukan di fungsi
loop
. Tambahkan kode berikut di akhir fungsiloop
:timer.tick();
-
Bangun kode ini, unggah ke Wio Terminal Anda, dan uji melalui serial monitor. Setelah Anda melihat
Ready
di serial monitor, tekan tombol C (yang di sisi kiri, paling dekat dengan sakelar daya), dan berbicaralah. 4 detik audio akan direkam, dikonversi menjadi teks, lalu dikirim ke aplikasi fungsi Anda, dan timer akan diatur. Pastikan aplikasi fungsi Anda berjalan secara lokal.Anda akan melihat kapan timer dimulai, dan kapan berakhir.
--- 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 dapat menemukan kode ini di folder code-timer/wio-terminal.
😀 Program timer Anda berhasil!
Penafian:
Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI Co-op Translator. Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.