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-timer
projesini VS Code'da açın (eğer zaten açık değilse). -
config.h
baş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. -
src
klasöründelanguage_understanding.h
adı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.
-
LanguageUnderstanding
adı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
private
bölümüne aşağıdaki kodu ekleyin:WiFiClient _client;
-
Sınıfın
public
bölümünde, fonksiyon uygulamasını çağırmak içinGetTimerDuration
adında bir yöntem bildirin:int GetTimerDuration(String text) { }
-
GetTimerDuration
yö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,
GetTimerDuration
yö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.cpp
dosyasında bu yeni başlığı dahil edin:#include "speech_to_text.h"
-
processAudio
fonksiyonunun sonunda, zamanlayıcı süresini almak içinGetTimerDuration
yöntemini çağırın:int total_seconds = languageUnderstanding.GetTimerDuration(text);
Bu,
SpeechToText
sı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.ini
dosyası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>
-
processAudio
fonksiyonunun üstüne aşağıdaki kodu ekleyin:auto timer = timer_create_default();
Bu kod,
timer
adı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
say
fonksiyonu, sonunda metni konuşmaya dönüştürecek, ancak şimdilik sadece geçirilen metni seri monitöre yazacaktır. -
say
fonksiyonunun 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
false
döndürür. -
processAudio
fonksiyonunun 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.
timerExpired
fonksiyonu geri çağırma olarak geçirilir veend_message
geri ç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
loop
fonksiyonunda yapılır.loop
fonksiyonunun 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
Ready
yazı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.