16 KiB
Ρύθμιση χρονοδιακόπτη - Wio Terminal
Σε αυτό το μέρος του μαθήματος, θα καλέσετε τον serverless κώδικά σας για να κατανοήσετε την ομιλία και να ρυθμίσετε έναν χρονοδιακόπτη στο Wio Terminal σας με βάση τα αποτελέσματα.
Ρύθμιση χρονοδιακόπτη
Το κείμενο που επιστρέφεται από την κλήση μετατροπής ομιλίας σε κείμενο πρέπει να σταλεί στον serverless κώδικά σας για να επεξεργαστεί από το LUIS, επιστρέφοντας τον αριθμό των δευτερολέπτων για τον χρονοδιακόπτη. Αυτός ο αριθμός δευτερολέπτων μπορεί να χρησιμοποιηθεί για τη ρύθμιση ενός χρονοδιακόπτη.
Οι μικροελεγκτές δεν υποστηρίζουν εγγενώς πολλαπλά νήματα στο Arduino, οπότε δεν υπάρχουν τυπικές κλάσεις χρονοδιακόπτη όπως αυτές που μπορεί να βρείτε όταν προγραμματίζετε σε Python ή άλλες γλώσσες υψηλότερου επιπέδου. Αντίθετα, μπορείτε να χρησιμοποιήσετε βιβλιοθήκες χρονοδιακόπτη που λειτουργούν μετρώντας τον χρόνο που έχει περάσει στη συνάρτηση loop
και καλώντας συναρτήσεις όταν ο χρόνος τελειώσει.
Εργασία - αποστολή του κειμένου στη serverless συνάρτηση
-
Ανοίξτε το έργο
smart-timer
στο VS Code, αν δεν είναι ήδη ανοιχτό. -
Ανοίξτε το αρχείο κεφαλίδας
config.h
και προσθέστε το URL για την εφαρμογή της συνάρτησής σας:const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
Αντικαταστήστε το
<URL>
με το URL για την εφαρμογή της συνάρτησής σας που αποκτήσατε στο τελευταίο βήμα του προηγούμενου μαθήματος, δείχνοντας στη διεύθυνση IP του τοπικού σας υπολογιστή που εκτελεί την εφαρμογή της συνάρτησης. -
Δημιουργήστε ένα νέο αρχείο στον φάκελο
src
με όνομαlanguage_understanding.h
. Αυτό θα χρησιμοποιηθεί για να ορίσετε μια κλάση που θα στέλνει την αναγνωρισμένη ομιλία στην εφαρμογή της συνάρτησής σας για να μετατραπεί σε δευτερόλεπτα χρησιμοποιώντας το LUIS. -
Προσθέστε τα παρακάτω στην κορυφή αυτού του αρχείου:
#pragma once #include <Arduino.h> #include <ArduinoJson.h> #include <HTTPClient.h> #include <WiFiClient.h> #include "config.h"
Αυτό περιλαμβάνει κάποια απαραίτητα αρχεία κεφαλίδας.
-
Ορίστε μια κλάση με όνομα
LanguageUnderstanding
και δηλώστε μια παρουσία αυτής της κλάσης:class LanguageUnderstanding { public: private: }; LanguageUnderstanding languageUnderstanding;
-
Για να καλέσετε την εφαρμογή των συναρτήσεών σας, πρέπει να δηλώσετε έναν WiFi client. Προσθέστε τα παρακάτω στην ενότητα
private
της κλάσης:WiFiClient _client;
-
Στην ενότητα
public
, δηλώστε μια μέθοδο με όνομαGetTimerDuration
για να καλέσετε την εφαρμογή των συναρτήσεων:int GetTimerDuration(String text) { }
-
Στη μέθοδο
GetTimerDuration
, προσθέστε τον παρακάτω κώδικα για να δημιουργήσετε το JSON που θα σταλεί στην εφαρμογή των συναρτήσεων:DynamicJsonDocument doc(1024); doc["text"] = text; String body; serializeJson(doc, body);
Αυτό μετατρέπει το κείμενο που περνά στη μέθοδο
GetTimerDuration
στο παρακάτω JSON:{ "text" : "<text>" }
όπου το
<text>
είναι το κείμενο που περνά στη συνάρτηση. -
Κάτω από αυτό, προσθέστε τον παρακάτω κώδικα για να κάνετε την κλήση στην εφαρμογή των συναρτήσεων:
HTTPClient httpClient; httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL); int httpResponseCode = httpClient.POST(body);
Αυτό κάνει μια POST αίτηση στην εφαρμογή των συναρτήσεων, περνώντας το σώμα JSON και λαμβάνοντας τον κωδικό απόκρισης.
-
Προσθέστε τον παρακάτω κώδικα κάτω από αυτό:
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.
-
Προσθέστε τον παρακάτω κώδικα στο τέλος αυτής της μεθόδου για να κλείσετε τη σύνδεση HTTP και να επιστρέψετε τον αριθμό των δευτερολέπτων:
httpClient.end(); return seconds;
-
Στο αρχείο
main.cpp
, συμπεριλάβετε αυτή τη νέα κεφαλίδα:#include "speech_to_text.h"
-
Στο τέλος της συνάρτησης
processAudio
, καλέστε τη μέθοδοGetTimerDuration
για να λάβετε τη διάρκεια του χρονοδιακόπτη:int total_seconds = languageUnderstanding.GetTimerDuration(text);
Αυτό μετατρέπει το κείμενο από την κλήση στη κλάση
SpeechToText
στον αριθμό των δευτερολέπτων για τον χρονοδιακόπτη.
Εργασία - ρύθμιση χρονοδιακόπτη
Ο αριθμός των δευτερολέπτων μπορεί να χρησιμοποιηθεί για τη ρύθμιση ενός χρονοδιακόπτη.
-
Προσθέστε την παρακάτω εξάρτηση βιβλιοθήκης στο αρχείο
platformio.ini
για να προσθέσετε μια βιβλιοθήκη για τη ρύθμιση χρονοδιακόπτη:contrem/arduino-timer @ 2.3.0
-
Προσθέστε μια οδηγία include για αυτή τη βιβλιοθήκη στο αρχείο
main.cpp
:#include <arduino-timer.h>
-
Πάνω από τη συνάρτηση
processAudio
, προσθέστε τον παρακάτω κώδικα:auto timer = timer_create_default();
Αυτός ο κώδικας δηλώνει έναν χρονοδιακόπτη με όνομα
timer
. -
Κάτω από αυτό, προσθέστε τον παρακάτω κώδικα:
void say(String text) { Serial.print("Saying "); Serial.println(text); }
Αυτή η συνάρτηση
say
θα μετατρέπει τελικά το κείμενο σε ομιλία, αλλά προς το παρόν θα γράφει απλώς το κείμενο που περνά στον σειριακό παρακολουθητή. -
Κάτω από τη συνάρτηση
say
, προσθέστε τον παρακάτω κώδικα:bool timerExpired(void *announcement) { say((char *)announcement); return false; }
Αυτή είναι μια συνάρτηση callback που θα καλείται όταν λήγει ένας χρονοδιακόπτης. Της περνάται ένα μήνυμα για να πει όταν λήγει ο χρονοδιακόπτης. Οι χρονοδιακόπτες μπορούν να επαναλαμβάνονται, και αυτό μπορεί να ελεγχθεί από την τιμή επιστροφής αυτής της callback - αυτή επιστρέφει
false
, για να πει στον χρονοδιακόπτη να μην εκτελεστεί ξανά. -
Προσθέστε τον παρακάτω κώδικα στο τέλος της συνάρτησης
processAudio
:if (total_seconds == 0) { return; } int minutes = total_seconds / 60; int seconds = total_seconds % 60;
Αυτός ο κώδικας ελέγχει τον συνολικό αριθμό δευτερολέπτων, και αν είναι 0, επιστρέφει από την κλήση της συνάρτησης ώστε να μην ρυθμιστούν χρονοδιακόπτες. Στη συνέχεια, μετατρέπει τον συνολικό αριθμό δευτερολέπτων σε λεπτά και δευτερόλεπτα.
-
Κάτω από αυτόν τον κώδικα, προσθέστε τα παρακάτω για να δημιουργήσετε ένα μήνυμα που θα λέει όταν ξεκινά ο χρονοδιακόπτης:
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.";
-
Κάτω από αυτό, προσθέστε παρόμοιο κώδικα για να δημιουργήσετε ένα μήνυμα που θα λέει όταν λήγει ο χρονοδιακόπτης:
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.";
-
Μετά από αυτό, πείτε το μήνυμα έναρξης του χρονοδιακόπτη:
say(begin_message);
-
Στο τέλος αυτής της συνάρτησης, ξεκινήστε τον χρονοδιακόπτη:
timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str()));
Αυτό ενεργοποιεί τον χρονοδιακόπτη. Ο χρονοδιακόπτης ρυθμίζεται χρησιμοποιώντας χιλιοστά του δευτερολέπτου, οπότε ο συνολικός αριθμός δευτερολέπτων πολλαπλασιάζεται με 1.000 για να μετατραπεί σε χιλιοστά του δευτερολέπτου. Η συνάρτηση
timerExpired
περνάται ως callback, και τοend_message
περνάται ως όρισμα για να περάσει στο callback. Αυτή η callback δέχεται μόνο ορίσματα τύπουvoid *
, οπότε η συμβολοσειρά μετατρέπεται κατάλληλα. -
Τέλος, ο χρονοδιακόπτης πρέπει να "χτυπά", και αυτό γίνεται στη συνάρτηση
loop
. Προσθέστε τον παρακάτω κώδικα στο τέλος της συνάρτησηςloop
:timer.tick();
-
Δημιουργήστε αυτόν τον κώδικα, ανεβάστε τον στο 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.
😀 Το πρόγραμμα του χρονοδιακόπτη σας ήταν επιτυχές!
Αποποίηση ευθύνης:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης Co-op Translator. Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.