Assignment of work
A compact voice AI system using ESP32, MAX9814 and OLED that detects speech, interrogates Gemini over Wi-Fi and displays intelligent responses in real time without the need for a computer.
July 15, 2025
47340 views
16 respects
Devices and components
MAX 9814 Microphone Module
0.96-inch 4-pin I2C/IIC OLED display
ESP 32
Son of Rider Robu
Solderless Breadboard
Materials and tools
SMT soldering station
Software and tools
Arduino IDE
postman
Project description
Whisper to your ESP32 – He’s talking about Gemini
Introduction
Description
Description
Story
Obstacles
Obstacles
Voice assistant powered by Gemini with ESP32 and microphone input
include libraries and authenticate API key.
1#include <WiFi.h>
2#include <HTTPClient.h>
3#include <ArduinoJson.h>
4#include <Wire.h>
5#include <Adafruit_GFX.h>
6#include <Adafruit_SSD1306.h>
7
8// OLED config
9#define SCREEN_WIDTH 128
10#define SCREEN_HEIGHT 64
11#define OLED_RESET -1
12#define I2C_SDA 21
13#define I2C_SCL 22
14Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
15
16// WiFi
17const char* ssid = "your wifi id";
18const char* password = "your wifi password";
19const String gemini_api_key = "your api key";
20
21// MAX9814 microphone input pin
22#define MIC_PIN 34
23
24void setup() {
25 Serial.begin(115200);
26 delay(1000);
27
28 Wire.begin(I2C_SDA, I2C_SCL);
29 if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
30 Serial.println("OLED init failed!");
31 while (1);
32 }
33
34 displayMessage("Connecting WiFi...");
35 WiFi.begin(ssid, password);
36 while (WiFi.status() != WL_CONNECTED) {
37 delay(500);
38 Serial.print(".");
39 }
40
41 displayMessage("WiFi connected!");
42 pinMode(MIC_PIN, INPUT);
43 delay(500);
44 displayMessage("Ready! Speak loud...");
45}
46
47void loop() {
48 static unsigned long lastTrigger = 0;
49
50 int micValue = analogRead(MIC_PIN);
51 Serial.println(micValue);
52
53 if (micValue > 1500 && millis() - lastTrigger > 5000) {
54 lastTrigger = millis();
55
56 displayMessage("Detecting...");
57
58 String response = askGemini("who are you.");
59 displayMultilineText(response);
60 }
61
62 delay(100);
63}
64
65void displayMessage(String msg) {
66 display.clearDisplay();
67 display.setTextSize(1);
68 display.setTextColor(SSD1306_WHITE);
69 display.setCursor(0, 0);
70 display.println(msg);
71 display.display();
72}
73
74void displayMultilineText(String text) {
75 display.clearDisplay();
76 display.setTextSize(1);
77 display.setTextColor(SSD1306_WHITE);
78 display.setCursor(0, 0);
79
80 int maxCharsPerLine = 21;
81 int lineHeight = 10;
82 int y = 0;
83
84 while (text.length() > 0 && y < SCREEN_HEIGHT) {
85 String line = text.substring(0, maxCharsPerLine);
86 text = text.substring(min((unsigned int)maxCharsPerLine, text.length()));
87 display.setCursor(0, y);
88 display.println(line);
89 y += lineHeight;
90 }
91
92 display.display();
93}
94
95// Gemini API call
96String askGemini(String prompt) {
97 HTTPClient http;
98 String endpoint = "https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash-002:generateContent?key=" + gemini_api_key;
99 http.begin(endpoint);
100 http.addHeader("Content-Type", "application/json");
101
102 prompt.replace("\"", "\\\"");
103
104 String requestBody = "{ \"contents\": [ { \"parts\": [ { \"text\": \"" + prompt + "\" } ] } ] }";
105 int code = http.POST(requestBody);
106 String reply = "";
107
108 if (code == 200) {
109 String payload = http.getString();
110 StaticJsonDocument<2048> doc;
111 DeserializationError error = deserializeJson(doc, payload);
112
113 if (!error) {
114 reply = doc["candidates"][0]["content"]["parts"][0]["text"].as<String>();
115 reply.replace("\\n", "\n");
116 } else {
117 Serial.println("JSON Error: " + String(error.c_str()));
118 reply = "I am Gemini, your AI assistant.";
119 }
120 } else {
121 Serial.println("Gemini API error: " + String(code));
122 // Fallback reply when API fails
123 reply = "I am Gemini, your AI assistant.";
124 }
125
126 http.end();
127 return reply;
128}
Downloadable files
Schematics of Gemini-powered voice assistant with ESP32 and microphone input
ESP-32 (1).jpg
Note: Content and images are from: https://projecthub.arduino.cc/, with some modifications.
If you want it removed due to copyright reasons, please leave a comment. Thank you.
I want to share this article more widely so that everyone knows about Arduino and your project.