Для электронщиков и радиолюбителей

Подключение ESP8266 к искусственному интеллекту Gemini

Подключение ESP8266 к искусственному интеллекту Gemini

За последний год системы искусственного интеллекта, такие как Gemini от Google, значительно изменили подход к разработке приложений и продолжают это делать с выходом каждой новой функции. В этой статье рассказывается о том, как можно взаимодействовать с API Gemini с помощью простого IoT-устройства — в данном случае используется ESP-12E, так как он наиболее популярен и стоит недорого. Однако изложенные принципы можно применить и к другим типам устройств, чтобы добавить в проекты элементы интеллектуальности.

Для простоты в этой вводной статье будет рассмотрено только, как отправить текст и получить ответ от API Gemini. Хотя, возможно, миру уже хватает чат-ботов, этот шаг является базовым для более сложных вещей (например, вызов функций, что гораздо полезнее).

Здесь не будет уделяться много внимания оптимизации, поскольку проект учебный. Проект придерживается философии: «сначала заставь работать, потом сделай правильно, потом быстро», но чаще всего останавливается на первом этапе — «заставить работать».

Для проекта используются следующие библиотеки:

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecure.h>
#include <ArduinoJson.h>
  • ESP8266WiFi — для подключения к Wi-Fi.
  • ESP8266HTTPClient и WiFiClientSecure — для отправки REST-запросов к API Gemini.
  • ArduinoJson — для удобной работы с JSON-данными, которые возвращает API.

Также создаются строковые константы с данными для подключения к домашнему Wi-Fi и ключом API Gemini:

const String ssid = "ssid";
const String password = "wifi_password";
const String API_key = "gemini_api_key";

Ключ можно получить в AI Studio, где также можно протестировать возможности Gemini. На момент написания статьи актуальной версией была Gemini 2.0 Flash. В бесплатной версии доступно до 15 запросов в минуту и 1500 запросов в день.

После этого можно подключить плату к сети Wi-Fi с помощью простой функции setupWifi():

void setupWifi() {
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.print("...");
    }
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
}

Функция setup() подключает последовательный монитор и вызывает setupWifi():

void setup() {
    Serial.begin(115200);
    WiFi.mode(WIFI_STA);
    WiFi.disconnect();
    while (!Serial);
    setupWifi();
}

Подключение к Gemini

Далее описывается основной функционал — отправка запроса к Gemini с платы ESP8266. Для этого создаётся функция makeGeminiRequest(String input), принимающая текст для отправки.

Внутри функции создаются клиенты для Wi-Fi и HTTP:

void makeGeminiRequest(String input) {
    WiFiClientSecure client;
    client.setInsecure();
    HTTPClient http;

Здесь сознательно устанавливается соединение как небезопасное с помощью setInsecure(). Те, кто разбирается в безопасности сети, могут реализовать защиту по-своему.

Далее формируется POST-запрос к модели Gemini (в данном случае gemini-2.0-flash) с передачей заголовков и JSON-тела. Пример тела запроса:

{
   "contents":[
      {
         "parts":[
            {
               "text":"Write a cute story about cats."
            }
         ]
      }
   ]
}

Код для отправки запроса выглядит следующим образом:

if (http.begin(client, "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=" + API_key)) {
    http.addHeader("Content-Type", "application/json");
    String payload = String("{\"contents\": [{\"parts\":[{\"text\":\"" + input + "\"}]}]}");
    
    int httpCode = http.POST(payload);
    http.end();
} else {
    Serial.print("Unable to connect\n");
}

Если сервер вернул успешный ответ (HTTP_CODE_OK), то он считывается и парсится:

if (httpCode == HTTP_CODE_OK) {
    String payload = http.getString();
    Serial.println("Payload: " + payload);

    DynamicJsonDocument doc(2048);
    deserializeJson(doc, payload);
    String responseText = doc["candidates"][0]["content"]["parts"][0]["text"];

    Serial.print("Response: ");
    Serial.println(responseText);
} else {
    Serial.println("Failed to reach Gemini");
}

Итоги

Таким образом, в этом уроке было показано, как подключить плату ESP8266 к API Gemini, чтобы добавить в IoT-проекты возможности ИИ. Проверить работоспособность можно, отправив текст через последовательный монитор — ответ от Gemini будет выведен туда же.