10 KiB
Bir Zamanlayıcı Ayarla - Wio Terminal
Bu dersin bu bölümünde, konuşmayı anlamak için sunucusuz kodunuzu çağıracak ve sonuçlara göre Wio Terminal üzerinde bir zamanlayıcı ayarlayacaksınız.
Bir Zamanlayıcı Ayarla
Konuşmadan metne dönüşüm çağrısından gelen metin, LUIS tarafından işlenmek üzere sunucusuz kodunuza gönderilmelidir ve zamanlayıcı için saniye sayısı geri alınmalıdır. Bu saniye sayısı bir zamanlayıcı ayarlamak için kullanılabilir.
Mikrodenetleyiciler, Arduino'da birden fazla iş parçacığını doğal olarak desteklemez, bu nedenle Python veya diğer üst düzey dillerde bulabileceğiniz standart zamanlayıcı sınıfları yoktur. Bunun yerine, loop fonksiyonunda geçen zamanı ölçerek ve zaman dolduğunda fonksiyonları çağırarak çalışan zamanlayıcı kütüphanelerini kullanabilirsiniz.
Görev - Metni Sunucusuz Fonksiyona Gönder
-
smart-timerprojesini VS Code'da açın (eğer zaten açık değilse). -
config.hbaşlık dosyasını açın ve fonksiyon uygulamanızın URL'sini ekleyin:const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";<URL>'yi, bir önceki dersin son adımında elde ettiğiniz, fonksiyon uygulamanızın URL'siyle değiştirin. Bu URL, yerel makinenizde çalışan fonksiyon uygulamasının IP adresine işaret etmelidir. -
srcklasöründelanguage_understanding.hadında yeni bir dosya oluşturun. Bu dosya, tanınan konuşmayı fonksiyon uygulamanıza göndermek ve LUIS kullanarak saniyelere dönüştürmek için bir sınıf tanımlamak amacıyla kullanılacaktır. -
Bu dosyanın en üstüne aşağıdaki kodu ekleyin:
#pragma once #include <Arduino.h> #include <ArduinoJson.h> #include <HTTPClient.h> #include <WiFiClient.h> #include "config.h"Bu, gerekli başlık dosyalarını içerir.
-
LanguageUnderstandingadında bir sınıf tanımlayın ve bu sınıfın bir örneğini bildirin:class LanguageUnderstanding { public: private: }; LanguageUnderstanding languageUnderstanding; -
Fonksiyon uygulamanızı çağırmak için bir WiFi istemcisi bildirmeniz gerekir. Sınıfın
privatebölümüne aşağıdaki kodu ekleyin:WiFiClient _client; -
Sınıfın
publicbölümünde, fonksiyon uygulamasını çağırmak içinGetTimerDurationadında bir yöntem bildirin:int GetTimerDuration(String text) { } -
GetTimerDurationyönteminde, fonksiyon uygulamasına gönderilecek JSON'u oluşturmak için aşağıdaki kodu ekleyin:DynamicJsonDocument doc(1024); doc["text"] = text; String body; serializeJson(doc, body);Bu,
GetTimerDurationyöntemine geçirilen metni aşağıdaki JSON'a dönüştürür:{ "text" : "<text>" }Burada
<text>, fonksiyona geçirilen metindir. -
Bunun altına, fonksiyon uygulaması çağrısını yapmak için aşağıdaki kodu ekleyin:
HTTPClient httpClient; httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL); int httpResponseCode = httpClient.POST(body);Bu, JSON gövdesini göndererek ve yanıt kodunu alarak fonksiyon uygulamasına bir POST isteği yapar.
-
Bunun altına aşağıdaki kodu ekleyin:
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); }Bu kod, yanıt kodunu kontrol eder. Eğer kod 200 (başarılı) ise, zamanlayıcı için saniye sayısı yanıt gövdesinden alınır. Aksi takdirde, seri monitöre bir hata gönderilir ve saniye sayısı 0 olarak ayarlanır.
-
Bu yöntemin sonuna aşağıdaki kodu ekleyerek HTTP bağlantısını kapatın ve saniye sayısını döndürün:
httpClient.end(); return seconds; -
main.cppdosyasında bu yeni başlığı dahil edin:#include "speech_to_text.h" -
processAudiofonksiyonunun sonunda, zamanlayıcı süresini almak içinGetTimerDurationyöntemini çağırın:int total_seconds = languageUnderstanding.GetTimerDuration(text);Bu,
SpeechToTextsınıfından gelen metni zamanlayıcı için saniye sayısına dönüştürür.
Görev - Bir Zamanlayıcı Ayarla
Saniye sayısı bir zamanlayıcı ayarlamak için kullanılabilir.
-
platformio.inidosyasına bir zamanlayıcı ayarlamak için bir kütüphane eklemek üzere aşağıdaki bağımlılığı ekleyin:contrem/arduino-timer @ 2.3.0 -
Bu kütüphane için bir include direktifi ekleyin:
#include <arduino-timer.h> -
processAudiofonksiyonunun üstüne aşağıdaki kodu ekleyin:auto timer = timer_create_default();Bu kod,
timeradında bir zamanlayıcı tanımlar. -
Bunun altına aşağıdaki kodu ekleyin:
void say(String text) { Serial.print("Saying "); Serial.println(text); }Bu
sayfonksiyonu, sonunda metni konuşmaya dönüştürecek, ancak şimdilik sadece geçirilen metni seri monitöre yazacaktır. -
sayfonksiyonunun altına aşağıdaki kodu ekleyin:bool timerExpired(void *announcement) { say((char *)announcement); return false; }Bu, bir zamanlayıcı sona erdiğinde çağrılacak bir geri çağırma fonksiyonudur. Zamanlayıcı sona erdiğinde söylenecek bir mesaj alır. Zamanlayıcılar tekrar edebilir ve bu geri çağırmanın dönüş değeri ile kontrol edilebilir - bu, zamanlayıcının tekrar çalışmaması için
falsedöndürür. -
processAudiofonksiyonunun sonuna aşağıdaki kodu ekleyin:if (total_seconds == 0) { return; } int minutes = total_seconds / 60; int seconds = total_seconds % 60;Bu kod, toplam saniye sayısını kontrol eder ve eğer 0 ise, fonksiyon çağrısından döner, böylece zamanlayıcılar ayarlanmaz. Ardından toplam saniye sayısını dakika ve saniyeye dönüştürür.
-
Bu kodun altına, zamanlayıcı başlatıldığında söylenecek bir mesaj oluşturmak için aşağıdaki kodu ekleyin:
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."; -
Bunun altına, zamanlayıcı sona erdiğinde söylenecek benzer bir mesaj oluşturmak için aşağıdaki kodu ekleyin:
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."; -
Bundan sonra, zamanlayıcı başlatıldı mesajını söyleyin:
say(begin_message); -
Bu fonksiyonun sonunda zamanlayıcıyı başlatın:
timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str()));Bu, zamanlayıcıyı tetikler. Zamanlayıcı milisaniye cinsinden ayarlanır, bu nedenle toplam saniye sayısı milisaniyeye dönüştürmek için 1.000 ile çarpılır.
timerExpiredfonksiyonu geri çağırma olarak geçirilir veend_messagegeri çağırmaya iletilmek üzere bir argüman olarak geçirilir. Bu geri çağırma yalnızcavoid *argümanlarını alır, bu nedenle dize uygun şekilde dönüştürülür. -
Son olarak, zamanlayıcı tik atmalıdır ve bu
loopfonksiyonunda yapılır.loopfonksiyonunun sonuna aşağıdaki kodu ekleyin:timer.tick(); -
Bu kodu derleyin, Wio Terminal'inize yükleyin ve seri monitör üzerinden test edin. Seri monitörde
Readyyazısını gördüğünüzde, C düğmesine (sol tarafta, güç anahtarına en yakın olan) basın ve konuşun. 4 saniyelik ses kaydedilecek, metne dönüştürülecek, ardından fonksiyon uygulamanıza gönderilecek ve bir zamanlayıcı ayarlanacaktır. Fonksiyon uygulamanızın yerel olarak çalıştığından emin olun.Zamanlayıcı başladığında ve sona erdiğinde göreceksiniz.
--- 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.
💁 Bu kodu code-timer/wio-terminal klasöründe bulabilirsiniz.
😀 Zamanlayıcı programınız başarılı oldu!
Feragatname:
Bu belge, AI çeviri hizmeti Co-op Translator kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlık içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalar için sorumluluk kabul etmiyoruz.