10 KiB
Configurar un temporizador - Wio Terminal
En esta parte de la lección, llamarás a tu código sin servidor para interpretar el habla y configurar un temporizador en tu Wio Terminal basado en los resultados.
Configurar un temporizador
El texto que se obtiene de la llamada de conversión de voz a texto necesita ser enviado a tu código sin servidor para ser procesado por LUIS, devolviendo el número de segundos para el temporizador. Este número de segundos se puede usar para configurar un temporizador.
Los microcontroladores no tienen soporte nativo para múltiples hilos en Arduino, por lo que no existen clases estándar de temporizador como las que podrías encontrar al programar en Python u otros lenguajes de alto nivel. En su lugar, puedes usar bibliotecas de temporizador que funcionan midiendo el tiempo transcurrido en la función loop
y llamando a funciones cuando el tiempo se agota.
Tarea - enviar el texto a la función sin servidor
-
Abre el proyecto
smart-timer
en VS Code si aún no está abierto. -
Abre el archivo de encabezado
config.h
y agrega la URL de tu aplicación de funciones:const char *TEXT_TO_TIMER_FUNCTION_URL = "<URL>";
Reemplaza
<URL>
con la URL de tu aplicación de funciones que obtuviste en el último paso de la lección anterior, apuntando a la dirección IP de tu máquina local que está ejecutando la aplicación de funciones. -
Crea un nuevo archivo en la carpeta
src
llamadolanguage_understanding.h
. Este se usará para definir una clase que enviará el habla reconocida a tu aplicación de funciones para convertirla en segundos usando LUIS. -
Agrega lo siguiente al inicio de este archivo:
#pragma once #include <Arduino.h> #include <ArduinoJson.h> #include <HTTPClient.h> #include <WiFiClient.h> #include "config.h"
Esto incluye algunos archivos de encabezado necesarios.
-
Define una clase llamada
LanguageUnderstanding
y declara una instancia de esta clase:class LanguageUnderstanding { public: private: }; LanguageUnderstanding languageUnderstanding;
-
Para llamar a tu aplicación de funciones, necesitas declarar un cliente WiFi. Agrega lo siguiente a la sección
private
de la clase:WiFiClient _client;
-
En la sección
public
, declara un método llamadoGetTimerDuration
para llamar a la aplicación de funciones:int GetTimerDuration(String text) { }
-
En el método
GetTimerDuration
, agrega el siguiente código para construir el JSON que se enviará a la aplicación de funciones:DynamicJsonDocument doc(1024); doc["text"] = text; String body; serializeJson(doc, body);
Esto convierte el texto pasado al método
GetTimerDuration
en el siguiente JSON:{ "text" : "<text>" }
donde
<text>
es el texto pasado a la función. -
Debajo de esto, agrega el siguiente código para realizar la llamada a la aplicación de funciones:
HTTPClient httpClient; httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL); int httpResponseCode = httpClient.POST(body);
Esto realiza una solicitud POST a la aplicación de funciones, pasando el cuerpo JSON y obteniendo el código de respuesta.
-
Agrega el siguiente código debajo de esto:
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); }
Este código verifica el código de respuesta. Si es 200 (éxito), entonces el número de segundos para el temporizador se obtiene del cuerpo de la respuesta. De lo contrario, se envía un error al monitor serial y el número de segundos se establece en 0.
-
Agrega el siguiente código al final de este método para cerrar la conexión HTTP y devolver el número de segundos:
httpClient.end(); return seconds;
-
En el archivo
main.cpp
, incluye este nuevo encabezado:#include "speech_to_text.h"
-
Al final de la función
processAudio
, llama al métodoGetTimerDuration
para obtener la duración del temporizador:int total_seconds = languageUnderstanding.GetTimerDuration(text);
Esto convierte el texto de la llamada a la clase
SpeechToText
en el número de segundos para el temporizador.
Tarea - configurar un temporizador
El número de segundos se puede usar para configurar un temporizador.
-
Agrega la siguiente dependencia de biblioteca al archivo
platformio.ini
para agregar una biblioteca para configurar un temporizador:contrem/arduino-timer @ 2.3.0
-
Agrega una directiva de inclusión para esta biblioteca al archivo
main.cpp
:#include <arduino-timer.h>
-
Sobre la función
processAudio
, agrega el siguiente código:auto timer = timer_create_default();
Este código declara un temporizador llamado
timer
. -
Debajo de esto, agrega el siguiente código:
void say(String text) { Serial.print("Saying "); Serial.println(text); }
Esta función
say
eventualmente convertirá texto a voz, pero por ahora solo escribirá el texto pasado en el monitor serial. -
Debajo de la función
say
, agrega el siguiente código:bool timerExpired(void *announcement) { say((char *)announcement); return false; }
Esta es una función de callback que se llamará cuando un temporizador expire. Se le pasa un mensaje para decir cuando el temporizador expire. Los temporizadores pueden repetirse, y esto se controla con el valor de retorno de este callback - este devuelve
false
, para indicar que el temporizador no debe ejecutarse nuevamente. -
Agrega el siguiente código al final de la función
processAudio
:if (total_seconds == 0) { return; } int minutes = total_seconds / 60; int seconds = total_seconds % 60;
Este código verifica el número total de segundos, y si es 0, retorna de la llamada a la función para que no se configuren temporizadores. Luego convierte el número total de segundos en minutos y segundos.
-
Debajo de este código, agrega lo siguiente para crear un mensaje que indique que el temporizador ha comenzado:
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.";
-
Debajo de esto, agrega un código similar para crear un mensaje que indique que el temporizador ha expirado:
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.";
-
Después de esto, di el mensaje de inicio del temporizador:
say(begin_message);
-
Al final de esta función, inicia el temporizador:
timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str()));
Esto activa el temporizador. El temporizador se configura usando milisegundos, por lo que el número total de segundos se multiplica por 1,000 para convertirlo a milisegundos. La función
timerExpired
se pasa como el callback, y elend_message
se pasa como un argumento para pasar al callback. Este callback solo acepta argumentosvoid *
, por lo que la cadena se convierte adecuadamente. -
Finalmente, el temporizador necesita tickear, y esto se hace en la función
loop
. Agrega el siguiente código al final de la funciónloop
:timer.tick();
-
Compila este código, súbelo a tu Wio Terminal y pruébalo a través del monitor serial. Una vez que veas
Ready
en el monitor serial, presiona el botón C (el que está en el lado izquierdo, más cerca del interruptor de encendido) y habla. Se capturarán 4 segundos de audio, se convertirán a texto, luego se enviarán a tu aplicación de funciones y se configurará un temporizador. Asegúrate de que tu aplicación de funciones esté ejecutándose localmente.Verás cuándo comienza el temporizador y cuándo termina.
--- 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.
💁 Puedes encontrar este código en la carpeta code-timer/wio-terminal.
😀 ¡Tu programa de temporizador fue un éxito!
Descargo de responsabilidad:
Este documento ha sido traducido utilizando el servicio de traducción automática Co-op Translator. Aunque nos esforzamos por garantizar la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse como la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que puedan surgir del uso de esta traducción.