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

301 lines
16 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "012b69d57d898d670adf61304f42a137",
"translation_date": "2025-08-27T20:28:56+00:00",
"source_file": "6-consumer/lessons/3-spoken-feedback/wio-terminal-set-timer.md",
"language_code": "el"
}
-->
# Ρύθμιση χρονοδιακόπτη - Wio Terminal
Σε αυτό το μέρος του μαθήματος, θα καλέσετε τον serverless κώδικά σας για να κατανοήσετε την ομιλία και να ρυθμίσετε έναν χρονοδιακόπτη στο Wio Terminal σας με βάση τα αποτελέσματα.
## Ρύθμιση χρονοδιακόπτη
Το κείμενο που επιστρέφεται από την κλήση μετατροπής ομιλίας σε κείμενο πρέπει να σταλεί στον serverless κώδικά σας για να επεξεργαστεί από το LUIS, επιστρέφοντας τον αριθμό των δευτερολέπτων για τον χρονοδιακόπτη. Αυτός ο αριθμός δευτερολέπτων μπορεί να χρησιμοποιηθεί για τη ρύθμιση ενός χρονοδιακόπτη.
Οι μικροελεγκτές δεν υποστηρίζουν εγγενώς πολλαπλά νήματα στο Arduino, οπότε δεν υπάρχουν τυπικές κλάσεις χρονοδιακόπτη όπως αυτές που μπορεί να βρείτε όταν προγραμματίζετε σε Python ή άλλες γλώσσες υψηλότερου επιπέδου. Αντίθετα, μπορείτε να χρησιμοποιήσετε βιβλιοθήκες χρονοδιακόπτη που λειτουργούν μετρώντας τον χρόνο που έχει περάσει στη συνάρτηση `loop` και καλώντας συναρτήσεις όταν ο χρόνος τελειώσει.
### Εργασία - αποστολή του κειμένου στη serverless συνάρτηση
1. Ανοίξτε το έργο `smart-timer` στο VS Code, αν δεν είναι ήδη ανοιχτό.
1. Ανοίξτε το αρχείο κεφαλίδας `config.h` και προσθέστε το URL για την εφαρμογή της συνάρτησής σας:
```cpp
const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
```
Αντικαταστήστε το `<URL>` με το URL για την εφαρμογή της συνάρτησής σας που αποκτήσατε στο τελευταίο βήμα του προηγούμενου μαθήματος, δείχνοντας στη διεύθυνση IP του τοπικού σας υπολογιστή που εκτελεί την εφαρμογή της συνάρτησης.
1. Δημιουργήστε ένα νέο αρχείο στον φάκελο `src` με όνομα `language_understanding.h`. Αυτό θα χρησιμοποιηθεί για να ορίσετε μια κλάση που θα στέλνει την αναγνωρισμένη ομιλία στην εφαρμογή της συνάρτησής σας για να μετατραπεί σε δευτερόλεπτα χρησιμοποιώντας το LUIS.
1. Προσθέστε τα παρακάτω στην κορυφή αυτού του αρχείου:
```cpp
#pragma once
#include <Arduino.h>
#include <ArduinoJson.h>
#include <HTTPClient.h>
#include <WiFiClient.h>
#include "config.h"
```
Αυτό περιλαμβάνει κάποια απαραίτητα αρχεία κεφαλίδας.
1. Ορίστε μια κλάση με όνομα `LanguageUnderstanding` και δηλώστε μια παρουσία αυτής της κλάσης:
```cpp
class LanguageUnderstanding
{
public:
private:
};
LanguageUnderstanding languageUnderstanding;
```
1. Για να καλέσετε την εφαρμογή των συναρτήσεών σας, πρέπει να δηλώσετε έναν WiFi client. Προσθέστε τα παρακάτω στην ενότητα `private` της κλάσης:
```cpp
WiFiClient _client;
```
1. Στην ενότητα `public`, δηλώστε μια μέθοδο με όνομα `GetTimerDuration` για να καλέσετε την εφαρμογή των συναρτήσεων:
```cpp
int GetTimerDuration(String text)
{
}
```
1. Στη μέθοδο `GetTimerDuration`, προσθέστε τον παρακάτω κώδικα για να δημιουργήσετε το JSON που θα σταλεί στην εφαρμογή των συναρτήσεων:
```cpp
DynamicJsonDocument doc(1024);
doc["text"] = text;
String body;
serializeJson(doc, body);
```
Αυτό μετατρέπει το κείμενο που περνά στη μέθοδο `GetTimerDuration` στο παρακάτω JSON:
```json
{
"text" : "<text>"
}
```
όπου το `<text>` είναι το κείμενο που περνά στη συνάρτηση.
1. Κάτω από αυτό, προσθέστε τον παρακάτω κώδικα για να κάνετε την κλήση στην εφαρμογή των συναρτήσεων:
```cpp
HTTPClient httpClient;
httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL);
int httpResponseCode = httpClient.POST(body);
```
Αυτό κάνει μια POST αίτηση στην εφαρμογή των συναρτήσεων, περνώντας το σώμα JSON και λαμβάνοντας τον κωδικό απόκρισης.
1. Προσθέστε τον παρακάτω κώδικα κάτω από αυτό:
```cpp
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.
1. Προσθέστε τον παρακάτω κώδικα στο τέλος αυτής της μεθόδου για να κλείσετε τη σύνδεση HTTP και να επιστρέψετε τον αριθμό των δευτερολέπτων:
```cpp
httpClient.end();
return seconds;
```
1. Στο αρχείο `main.cpp`, συμπεριλάβετε αυτή τη νέα κεφαλίδα:
```cpp
#include "speech_to_text.h"
```
1. Στο τέλος της συνάρτησης `processAudio`, καλέστε τη μέθοδο `GetTimerDuration` για να λάβετε τη διάρκεια του χρονοδιακόπτη:
```cpp
int total_seconds = languageUnderstanding.GetTimerDuration(text);
```
Αυτό μετατρέπει το κείμενο από την κλήση στη κλάση `SpeechToText` στον αριθμό των δευτερολέπτων για τον χρονοδιακόπτη.
### Εργασία - ρύθμιση χρονοδιακόπτη
Ο αριθμός των δευτερολέπτων μπορεί να χρησιμοποιηθεί για τη ρύθμιση ενός χρονοδιακόπτη.
1. Προσθέστε την παρακάτω εξάρτηση βιβλιοθήκης στο αρχείο `platformio.ini` για να προσθέσετε μια βιβλιοθήκη για τη ρύθμιση χρονοδιακόπτη:
```ini
contrem/arduino-timer @ 2.3.0
```
1. Προσθέστε μια οδηγία include για αυτή τη βιβλιοθήκη στο αρχείο `main.cpp`:
```cpp
#include <arduino-timer.h>
```
1. Πάνω από τη συνάρτηση `processAudio`, προσθέστε τον παρακάτω κώδικα:
```cpp
auto timer = timer_create_default();
```
Αυτός ο κώδικας δηλώνει έναν χρονοδιακόπτη με όνομα `timer`.
1. Κάτω από αυτό, προσθέστε τον παρακάτω κώδικα:
```cpp
void say(String text)
{
Serial.print("Saying ");
Serial.println(text);
}
```
Αυτή η συνάρτηση `say` θα μετατρέπει τελικά το κείμενο σε ομιλία, αλλά προς το παρόν θα γράφει απλώς το κείμενο που περνά στον σειριακό παρακολουθητή.
1. Κάτω από τη συνάρτηση `say`, προσθέστε τον παρακάτω κώδικα:
```cpp
bool timerExpired(void *announcement)
{
say((char *)announcement);
return false;
}
```
Αυτή είναι μια συνάρτηση callback που θα καλείται όταν λήγει ένας χρονοδιακόπτης. Της περνάται ένα μήνυμα για να πει όταν λήγει ο χρονοδιακόπτης. Οι χρονοδιακόπτες μπορούν να επαναλαμβάνονται, και αυτό μπορεί να ελεγχθεί από την τιμή επιστροφής αυτής της callback - αυτή επιστρέφει `false`, για να πει στον χρονοδιακόπτη να μην εκτελεστεί ξανά.
1. Προσθέστε τον παρακάτω κώδικα στο τέλος της συνάρτησης `processAudio`:
```cpp
if (total_seconds == 0)
{
return;
}
int minutes = total_seconds / 60;
int seconds = total_seconds % 60;
```
Αυτός ο κώδικας ελέγχει τον συνολικό αριθμό δευτερολέπτων, και αν είναι 0, επιστρέφει από την κλήση της συνάρτησης ώστε να μην ρυθμιστούν χρονοδιακόπτες. Στη συνέχεια, μετατρέπει τον συνολικό αριθμό δευτερολέπτων σε λεπτά και δευτερόλεπτα.
1. Κάτω από αυτόν τον κώδικα, προσθέστε τα παρακάτω για να δημιουργήσετε ένα μήνυμα που θα λέει όταν ξεκινά ο χρονοδιακόπτης:
```cpp
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.";
```
1. Κάτω από αυτό, προσθέστε παρόμοιο κώδικα για να δημιουργήσετε ένα μήνυμα που θα λέει όταν λήγει ο χρονοδιακόπτης:
```cpp
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.";
```
1. Μετά από αυτό, πείτε το μήνυμα έναρξης του χρονοδιακόπτη:
```cpp
say(begin_message);
```
1. Στο τέλος αυτής της συνάρτησης, ξεκινήστε τον χρονοδιακόπτη:
```cpp
timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str()));
```
Αυτό ενεργοποιεί τον χρονοδιακόπτη. Ο χρονοδιακόπτης ρυθμίζεται χρησιμοποιώντας χιλιοστά του δευτερολέπτου, οπότε ο συνολικός αριθμός δευτερολέπτων πολλαπλασιάζεται με 1.000 για να μετατραπεί σε χιλιοστά του δευτερολέπτου. Η συνάρτηση `timerExpired` περνάται ως callback, και το `end_message` περνάται ως όρισμα για να περάσει στο callback. Αυτή η callback δέχεται μόνο ορίσματα τύπου `void *`, οπότε η συμβολοσειρά μετατρέπεται κατάλληλα.
1. Τέλος, ο χρονοδιακόπτης πρέπει να "χτυπά", και αυτό γίνεται στη συνάρτηση `loop`. Προσθέστε τον παρακάτω κώδικα στο τέλος της συνάρτησης `loop`:
```cpp
timer.tick();
```
1. Δημιουργήστε αυτόν τον κώδικα, ανεβάστε τον στο Wio Terminal σας και δοκιμάστε τον μέσω του σειριακού παρακολουθητή. Μόλις δείτε το `Ready` στον σειριακό παρακολουθητή, πατήστε το κουμπί C (το κουμπί στην αριστερή πλευρά, πιο κοντά στον διακόπτη τροφοδοσίας) και μιλήστε. Θα καταγραφούν 4 δευτερόλεπτα ήχου, θα μετατραπούν σε κείμενο, θα σταλούν στην εφαρμογή της συνάρτησής σας και θα ρυθμιστεί ένας χρονοδιακόπτης. Βεβαιωθείτε ότι η εφαρμογή της συνάρτησής σας εκτελείται τοπικά.
Θα δείτε πότε ξεκινά ο χρονοδιακόπτης και πότε λήγει.
```output
--- 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](../../../../../6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal).
😀 Το πρόγραμμα του χρονοδιακόπτη σας ήταν επιτυχές!
---
**Αποποίηση ευθύνης**:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.