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

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

  1. Abre el proyecto smart-timer en VS Code si aún no está abierto.

  2. 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.

  3. Crea un nuevo archivo en la carpeta src llamado language_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.

  4. 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.

  5. Define una clase llamada LanguageUnderstanding y declara una instancia de esta clase:

    class LanguageUnderstanding
    {
    public:
    private:
    };
    
    LanguageUnderstanding languageUnderstanding;
    
  6. 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;
    
  7. En la sección public, declara un método llamado GetTimerDuration para llamar a la aplicación de funciones:

    int GetTimerDuration(String text)
    {
    }
    
  8. 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.

  9. 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.

  10. 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.

  11. 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;
    
  12. En el archivo main.cpp, incluye este nuevo encabezado:

    #include "speech_to_text.h"
    
  13. Al final de la función processAudio, llama al método GetTimerDuration 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.

  1. Agrega la siguiente dependencia de biblioteca al archivo platformio.ini para agregar una biblioteca para configurar un temporizador:

    contrem/arduino-timer @ 2.3.0
    
  2. Agrega una directiva de inclusión para esta biblioteca al archivo main.cpp:

    #include <arduino-timer.h>
    
  3. Sobre la función processAudio, agrega el siguiente código:

    auto timer = timer_create_default();
    

    Este código declara un temporizador llamado timer.

  4. 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.

  5. 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.

  6. 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.

  7. 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.";
    
  8. 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.";
    
  9. Después de esto, di el mensaje de inicio del temporizador:

    say(begin_message);
    
  10. 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 el end_message se pasa como un argumento para pasar al callback. Este callback solo acepta argumentos void *, por lo que la cadena se convierte adecuadamente.

  11. Finalmente, el temporizador necesita tickear, y esto se hace en la función loop. Agrega el siguiente código al final de la función loop:

    timer.tick();
    
  12. 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.