Skip to main content
ESPBoards

Usa ChatGPT en el microcontrolador ESP32 con la API de OpenAI

Agrega capacidades de procesamiento de lenguaje natural a tu proyecto ESP32 integrando ChatGPT mediante la API de OpenAI. Instrucciones paso a paso con ejemplos de código.


Introducción: Usando ChatGPT para Mejorar los Microcontroladores ESP32 en Proyectos IoT #

La serie de microcontroladores ESP32 se ha vuelto popular entre los entusiastas de IoT y aficionados debido a su bajo consumo de energía, conectividad WiFi y Bluetooth integradas, y potentes capacidades de procesamiento. Con la adición de ChatGPT, puedes crear aplicaciones más sofisticadas e interactivas, como chatbots o asistentes de voz, que pueden generar respuestas similares a las humanas a entradas de texto.

En este artículo, exploraremos el potencial de usar ChatGPT en microcontroladores ESP32 y proporcionaremos instrucciones sobre cómo configurarlo. También revisaremos los beneficios y desafíos de esta integración.

¿Qué es ChatGPT? #

ChatGPT es un modelo avanzado de procesamiento de lenguaje natural (NLP) desarrollado por OpenAI que puede generar respuestas similares a las humanas a partir del texto que proporcionas. Utiliza un algoritmo de aprendizaje automático, lo que le permite entender el contexto y el significado del texto y recordar lo que se ha dicho anteriormente.

Probablemente hayas oído hablar de ello, ya que ChatGPT ha ganado 100 millones de usuarios en 2 meses desde su lanzamiento, convirtiéndose en la aplicación de consumo de más rápido crecimiento de la historia y ha estado en tendencia en toda la internet recientemente.

Si bien ChatGPT fue diseñado originalmente para aplicaciones de conversación, como chatbots, integrar ChatGPT con dispositivos IoT puede dar lugar a dispositivos más sofisticados que pueden entender y responder a entradas en lenguaje natural.

Por ejemplo, imagina que tienes un sistema de hogar inteligente que puede controlar varios dispositivos, como luces, termostatos y cámaras de seguridad. En lugar de utilizar una aplicación móvil o comandos de voz, podrías usar ChatGPT para comunicarte con el sistema en lenguaje natural y con contexto. Podrías decirle al dispositivo "Me siento un poco caliente" y él verificaría la temperatura en tu habitación; si está demasiado alta, sugeriría aumentarla y, si tienes las ventanas abiertas, también podría sugerir cerrarlas.

Lo que necesitas saber sobre la API de ChatGPT antes de comenzar a desarrollar #

Si no has utilizado la API de ChatGPT antes, o solo has experimentado un poco y no has revisado la documentación, hay algunas cosas a tener en cuenta al usar la API de ChatGPT.

  1. Límite de caracteres: La longitud máxima del texto de respuesta que puede generar la API depende del plan de precios al que estés suscrito. Por ejemplo, el plan gratuito tiene un límite de 2048 caracteres por solicitud, mientras que los planes de pago pueden manejar mayores cantidades de texto. Asegúrate de consultar la documentación y los detalles del plan antes de usar la API.

  2. Precios: Los precios de OpenAI para la API de ChatGPT pueden ser bastante elevados, especialmente para volúmenes más grandes de texto o una frecuencia más alta de solicitudes. Asegúrate de revisar los planes de precios y cualquier costo potencial antes de integrar la API en tu proyecto.

  3. Ética y sesgo: Es importante estar consciente de las implicaciones éticas de usar tecnología como ChatGPT. El texto generado por IA puede tener sesgos inherentes basados en los datos de entrenamiento en los que fue entrenado, lo que puede llevar a un lenguaje discriminatorio o a estereotipos dañinos. Es fundamental usar la API de manera responsable y con un enfoque crítico hacia el texto generado.

  4. Disponibilidad de la API: La API de ChatGPT de OpenAI es generalmente confiable, pero puede haber períodos ocasionales de inactividad o mantenimiento que pueden afectar la disponibilidad de la API. Es importante tener un plan de respaldo en caso de que la API se vuelva temporalmente no disponible.

Vale la pena mencionar que OpenAI ofrece un nivel gratuito para su API de GPT-3, que permite hasta 100,000 tokens por mes. Sin embargo, si necesitas más que eso, es posible que debas actualizar a un plan de pago. Un token puede representar una palabra o un signo de puntuación o símbolo, como una coma o un punto. Por lo tanto, el número de palabras representadas por 100,000 tokens puede variar según el idioma y el texto que se esté analizando.

Puedes encontrar más información en el sitio web de OpenAI:

Usando ChatGPT con ESP32 #

Integrar ChatGPT con microcontroladores ESP32 puede abrir un espacio para una amplia gama de aplicaciones IoT mejoradas, como chatbots, asistentes de voz e interfaces de lenguaje natural. Usaremos la API de ChatGPT en el ESP32.

Aquí están los pasos que necesitaremos seguir para obtener respuestas de ChatGPT en tu aplicación utilizando el microcontrolador ESP32:

  1. Regístrate en el sitio web de OpenAI e instala las bibliotecas necesarias en el ESP32.
  2. Crea un nuevo proyecto en la API de OpenAI y genera una clave de API.
  3. Usa la clave de API para autenticar las solicitudes a la API de OpenAI.
  4. Envía la entrada de texto a la API de OpenAI utilizando solicitudes HTTP y recibe una respuesta en formato JSON.
  5. Analiza la respuesta y utilízala para controlar el microcontrolador ESP32.

Ejemplo de código para llamar a la API de ChatGPT desde ESP32 #

En esta etapa, deberías tener instalada la biblioteca del núcleo de Arduino para ESP32 y tener la clave de API de OpenAI lista.

  1. Primero, necesitamos incluir las bibliotecas necesarias para que el ESP32 se comunique a través de Wi-Fi, realice solicitudes HTTP y analice datos JSON.
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
  1. Define las credenciales de la red para la red Wi-Fi a la que se conectará el ESP32 y la clave de API para la API de OpenAI.
const char* ssid     = "your_SSID";
const char* password = "your_PASSWORD";
const char* apiKey = "your_API_KEY";

Ten en cuenta que los valores de ssid, password y apiKey deben ser reemplazados con los valores apropiados de tu red y tu clave de API de OpenAI.

  1. Define la función setup(), que es donde el ESP32 se conecta a la red Wi-Fi y envía una solicitud POST HTTP a la API de OpenAI.
void setup() {
//
}
  1. Dentro de la función setup(), primero inicializaremos el puerto Serial.
  // Initialize Serial
Serial.begin(9600);
  1. A continuación, nos conectaremos a la red Wi-Fi.
// Connect to Wi-Fi network
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
  1. Continúa completando la función setup() para enviar la solicitud POST HTTP al endpoint de la API de OpenAI para el endpoint de completions, utilizando la biblioteca HTTPClient.
  // Send request to OpenAI API
String inputText = "Hello, ChatGPT!";
String apiUrl = "https://api.openai.com/v1/completions";
String payload = "{\"prompt\":\"" + inputText + "\",\"max_tokens\":100, \"model\": \"text-davinci-003\"}";

HTTPClient http;
http.begin(apiUrl);
http.addHeader("Content-Type", "application/json");
http.addHeader("Authorization", "Bearer " + String(apiKey));

La cadena inputText define el prompt para la API, que en este ejemplo es "¡Hola, ChatGPT!". La cadena apiUrl especifica el endpoint para las completions. La cadena payload es un objeto JSON que contiene el prompt y otros parámetros, como el número máximo de tokens a generar y el modelo a utilizar. En nuestro caso, estamos usando el modelo "Text-Davinci-003" y permitimos un máximo de 100 tokens.

Luego, se inicializa el objeto HTTPClient, y la función begin() se utiliza para especificar la URL del endpoint de la API.

A continuación, añadimos los encabezados HTTP, como Content-Type, donde especificamos que nos comunicaremos utilizando datos JSON, y el encabezado de Autenticación para autenticar la API de ChatGPT con la API_KEY.

  1. Finalmente, utilizamos la función http.POST() para enviar la solicitud POST HTTP al servicio de la API de OpenAI.
int httpResponseCode = http.POST(payload);
if (httpResponseCode == 200) {
String response = http.getString();

// Parse JSON response
DynamicJsonDocument jsonDoc(1024);
deserializeJson(jsonDoc, response);
String outputText = jsonDoc["choices"][0]["text"];
Serial.println(outputText);
} else {
Serial.printf("Error %i \n", httpResponseCode);
}

La función http.POST() devolverá el código de respuesta HTTP. En caso de que sea HTTP 200, analizaremos el JSON y lo imprimiremos en el puerto Serial.

Si se devuelve otro código HTTP que no sea 200, imprimiremos "Error: CÓDIGO HTTP", por ejemplo, si tu token de API no es válido, imprimirá "Error: 401".

  1. Necesitamos proporcionar la función loop(). No hace nada, pero es simplemente un marcador de posición para cualquier otro código que se pueda agregar al programa en el futuro.
void loop() {
//
}

Y el resultado final debería verse así: #

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

// Replace with your network credentials
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";

// Replace with your OpenAI API key
const char* apiKey = "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";

void setup() {
// Initialize Serial
Serial.begin(9600);

// Connect to Wi-Fi network
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi ..");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(1000);
}
Serial.println(WiFi.localIP());

// Send request to OpenAI API
String inputText = "Hello, ChatGPT!";
String apiUrl = "https://api.openai.com/v1/completions";
String payload = "{\"prompt\":\"" + inputText + "\",\"max_tokens\":100, \"model\": \"text-davinci-003\"}";

HTTPClient http;
http.begin(apiUrl);
http.addHeader("Content-Type", "application/json");
http.addHeader("Authorization", "Bearer " + String(apiKey));

int httpResponseCode = http.POST(payload);
if (httpResponseCode == 200) {
String response = http.getString();

// Parse JSON response
DynamicJsonDocument jsonDoc(1024);
deserializeJson(jsonDoc, response);
String outputText = jsonDoc["choices"][0]["text"];
Serial.println(outputText);
} else {
Serial.printf("Error %i \n", httpResponseCode);
}
}

void loop() {
// do nothing
}

Solución de problemas #

En caso de que encuentres problemas, aquí hay algunas cosas que puedes verificar:

  • Asegúrate de haber ingresado correctamente tus credenciales de red, la clave de API de OpenAI y la cadena del prompt de entrada en el código.
  • Verifica la conectividad de tu red Wi-Fi. Asegúrate de que tu ESP32 esté conectado a la red Wi-Fi correcta y que tenga una señal fuerte.
  • Comprueba que has incluido todas las bibliotecas necesarias en tu IDE de Arduino. El código requiere las siguientes bibliotecas: WiFi, HTTPClient y ArduinoJson.
  • Verifica que la URL del endpoint de la API sea correcta y que sea accesible desde tu red.
  • Comprueba que el payload para la solicitud POST HTTP esté correctamente formateado, incluyendo la cadena del prompt y cualquier otro parámetro.
  • El objeto DynamicJsonDocument en este código se utiliza para almacenar la respuesta JSON de la API de OpenAI. Ten en cuenta que el tamaño de la respuesta debe caber dentro de la capacidad del objeto DynamicJsonDocument, que se establece en 1024 bytes en este ejemplo. Si la respuesta es más grande que la capacidad del objeto DynamicJsonDocument, resultará en un error de análisis.

Dado que la respuesta para nuestro prompt proporcionado probablemente sea menor a 1024 bytes, este tamaño de DynamicJsonDocument debería ser suficiente para este ejemplo específico. Sin embargo, si la respuesta es más grande, el objeto DynamicJsonDocument debe ser dimensionado en consecuencia. El tamaño del objeto DynamicJsonDocument debe ser al menos igual al tamaño de la respuesta para asegurarse de que el JSON se pueda analizar correctamente.

Alternativamente, si la respuesta es demasiado grande para caber dentro de la capacidad del objeto DynamicJsonDocument, el usuario puede cambiar a un objeto StaticJsonDocument, que tiene una capacidad fija determinada en tiempo de compilación.

Si aún tienes problemas, intenta solo conectarte al WiFi. Puedes encontrar instrucciones para una conexión WiFi simple en nuestro post de Ejemplos de Código Hello World.

ChatGPT en ESP32 usando el ESP-IDF #

En caso de que prefieras programar tu ESP32 con ESP-IDF y no con el núcleo de Arduino, los pasos y la lógica son exactamente los mismos, pero hay cambios debido al diferente marco. Consulta la documentación de ESP-IDF.

Si encuentras algún problema, consulta la sección de Solución de problemas en el ejemplo anterior, utilizando el IDE de Arduino.

En caso de que elijas el ejemplo posterior que utiliza el marco ESP-IDF y tengas la versión más reciente de ESP32, como el ESP32-C5, te recomendamos encarecidamente considerar el uso de Wi-Fi de 5 GHz. Puedes encontrar las instrucciones en nuestra publicación de blog "¿Puede el ESP32 conectarse a Wi-Fi de 5GHz? Explorando opciones de conectividad Wi-Fi con ESP32".

Siguientes pasos y consideraciones #

Para utilizar este ejemplo en una aplicación del mundo real, el código necesitaría ser modificado para incluir algún tipo de entrada del usuario, como un micrófono o entrada de texto. La lógica para enviar solicitudes a la API de ChatGPT debería trasladarse de la función de configuración a la función de bucle para permitir una comunicación continua con la API.

Sin embargo, también hay algunos desafíos al usar ChatGPT con un ESP32. Uno de los principales desafíos podría ser la potencia de procesamiento necesaria. ChatGPT requiere una cantidad significativa de recursos computacionales, y la limitada potencia de procesamiento del ESP32 puede no ser suficiente para manejar consultas más complejas o completaciones de texto más largas.

Conclusión #

Usar la API de OpenAI para introducir funcionalidades similares a ChatGPT en proyectos de ESP32 puede proporcionar una forma más sencilla de crear aplicaciones más sofisticadas, especialmente si necesitan comprensión del lenguaje y contexto, como chatbots, asistentes de voz, etc.

En esta publicación, hemos proporcionado un ejemplo sobre cómo utilizar la API de OpenAI en el microcontrolador ESP32 para beneficiarse del popular procesador de lenguaje natural. Pasamos por instrucciones paso a paso sobre cómo llamar a la API de OpenAI desde el ESP32, utilizando el IDE de Arduino junto con la biblioteca Arduino Core para ESP32.

Además, hemos proporcionado un ejemplo similar utilizando el marco ESP-IDF para aquellos que prefieren esta solución.

Usar ChatGPT con ESP32 conlleva ciertos desafíos, como la necesidad de una alta potencia de procesamiento, pero los beneficios de utilizar ChatGPT con ESP32 superan los desafíos, especialmente al considerar su potencial para mejorar la experiencia del usuario de los dispositivos IoT.

Recursos Adicionales #

Además de los recursos externos mencionados anteriormente, aquí hay algunos más que podrían interesarte:

  • OpenAI GPT-3 Playground: Este es un entorno basado en la web donde puedes experimentar con el modelo GPT-3 de OpenAI, lo que te puede dar una mejor comprensión de cómo interactuar con la API.
  • ChatGPT chatbot: Chatbot con interfaz web, lanzado en noviembre de 2022, que ha ganado mucha popularidad desde entonces.