
За последний год системы искусственного интеллекта, такие как 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 будет выведен туда же.