# Gemini Chat Gadget for ESP32-C6-LCD-1.69 This project builds a minimal ESP-IDF application that turns an ESP32-C6-LCD-1.69 board into a Gemini chat gadget. It features on-screen state indicators, speaker beeps, Wi-Fi connectivity, and integration with the Gemini API. ## Hardware * **MCU/Board:** ESP32-C6 DevKitC-1 * **Display:** 1.69" ST7789V2, 240x280 resolution, SPI interface * **Default Pins (configurable via Kconfig):** * MOSI: GPIO7 * SCLK: GPIO6 * CS: GPIO5 * DC: GPIO2 * RST: GPIO4 * BL (Backlight): GPIO15 * BUTTON: GPIO0 * LED: GPIO8 * SPEAKER: GPIO25 * BAT_EN (Battery Enable): GPIO15 (drive HIGH on battery) ## Features * **Display Auto-Probe:** Automatically detects and configures the ST7789V2 display by trying common rotations, offsets, and SPI clock frequencies. * **UI State Machine:** Visual feedback on the LCD for different states: BOOT, CONNECTING, READY, LISTENING, THINKING, SPEAKING, and ERROR. * **Wi-Fi Connectivity:** Connects to a specified Wi-Fi network in STA mode. * **Gemini API Integration:** Communicates with the Google Gemini API (gemini-1.5-flash model) to generate text responses. * **Audio Feedback:** Uses LEDC to generate tones for listening and speaking states, and a short beep for thinking. * **Button Input:** A button on GPIO0 triggers a chat cycle. * **Battery Management:** Sets `BAT_EN` (GPIO15) HIGH to enable battery power. ## Project Structure * `CMakeLists.txt`: Main project CMake file. * `main/CMakeLists.txt`: Component CMake file for the `main` component. * `main/main.c`: Main application source code. * `main/Kconfig.projbuild`: Defines Kconfig options for Wi-Fi credentials, Gemini API key, and LCD pin overrides. * `sdkconfig.defaults`: Default configuration settings, including UART console, FreeRTOS tick rate, and placeholders for Wi-Fi and Gemini API key. ## Build and Flash Instructions 1. **Set the ESP-IDF Target:** ```bash idf.py set-target esp32c6 ``` 2. **Configure Project Settings:** Run `menuconfig` to set your Wi-Fi SSID, Wi-Fi Password, and Gemini API Key. You can also override default LCD pin assignments here if needed. ```bash idf.py menuconfig ``` Navigate to "Application Configuration" to find the Wi-Fi and Gemini API key settings. Navigate to "Application Configuration" -> "LCD Pin Configuration" to adjust pin assignments. 3. **Build, Flash, and Monitor:** This command will build the project, flash it to your ESP32-C6 board, and open a serial monitor to view logs. ```bash idf.py build flash monitor ``` ## Acceptance Criteria * Upon boot, the LCD should display a color-sweep during the auto-probe routine, followed by the BOOT, CONNECTING, and READY states. * Pressing the button should initiate the LISTENING state (with a tone), transition to THINKING (with a beep), perform an HTTP POST to the Gemini API, move to SPEAKING (with a tone) while logging the reply, and finally return to the READY state. * The console logs should clearly show auto-probe attempts and results, Wi-Fi connection status, HTTP status codes, and the extracted Gemini text response. * The application should handle Wi-Fi or HTTP failures gracefully, transitioning to an ERROR state with appropriate logging. ## Dependencies The project is designed to be lightweight and uses the following ESP-IDF components: * `esp_lcd` * `esp_http_client` * `cJSON` * `esp_wifi` * `driver` (for GPIO and LEDC) * `esp_timer`