Community project

Voice-Enabled Robot Desk Buddy

Arduino
Photo of Voice-Enabled Robot Desk Buddy

mmariya45840

Published November 2, 2026

This project builds a desk companion that displays messages and reacts to Bluetooth commands from a paired phone. The device features a friendly animated face on an OLED screen, responds to button presses with sound feedback, and receives text messages wirelessly via the HC-05 Bluetooth module.

The guide includes a complete wiring diagram showing how to connect the screen, Bluetooth module, button, and buzzer to an Arduino Uno, a full parts list with recommended suppliers, ready-to-upload firmware, and step-by-step assembly instructions. Makers will learn how to set up Bluetooth communication, drive an OLED display with custom graphics, and handle wireless input on a microcontroller.

Wiring diagram

Loading diagram…

Gather all the parts

QtyComponent
1

SSD1306 OLED

0.96-inch 128 x 64 white monochrome OLED display module driven by an SSD1306 controller over I2C (address 0x3C). It runs from 3 V to 5 V and connects through a 4-pin 2.54 mm header (GND, VCC, SCL, SDA); the self-emitting pixels need no backlight.

1

Push Button

Momentary push button switch

1

Hc 05 Bluetooth Module

Serial Bluetooth module for wireless communication using UART interface. Operates at 9600 baud (Data Mode) or 38400 baud (AT Command Mode). Supports two-way full-duplex wireless functionality with range up to 100m.

1

Piezo Buzzer

Small passive piezo buzzer (TDK PS1240) for beeps, tones and alerts. It has no built-in oscillator, so drive one lead with a 3-30 V square wave from a microcontroller pin using tone() or PWM and connect the other lead to ground. It is loudest around 4 kHz and works from about 2 to 10 kHz; driving both leads in antiphase roughly doubles the volume.

1

Resistor

1 kΩ

Through-hole resistor (current-limiting in series with an LED)

1

Resistor

2 kΩ

Through-hole resistor (current-limiting in series with an LED)

Assemble it in 6 steps

1. Place the Uno and screen

Put the Arduino Uno and the 0.96-inch OLED on the breadboard or beside it. Connect the OLED GND pin to an Uno GND pin and its VCC pin to the Uno 5V pin; the labels on some OLED boards are in a different order, so follow the printed labels rather than pin position.

  • The small screen must have four pins labeled GND, VCC, SCL, and SDA.
  • Do not swap the OLED VCC and GND wires; swapped power can damage the screen.

2. Wire the screen data pins

Connect OLED SDA to Uno A4 and OLED SCL to Uno A5. These two wires carry the picture data and clock from the Uno to the screen.

  • A4 and A5 are the analogue pins along the lower edge of the Uno; they also have the printed SDA and SCL labels on many boards.

3. Add the Bluetooth module safely

Connect HC-05 Vcc to Uno 5V and HC-05 GND to Uno GND. Connect HC-05 TX to Uno D2. To protect the HC-05 RX pin, connect Uno D3 through the 1 kΩ resistor to HC-05 RX, then connect the 2 kΩ resistor from that same HC-05 RX point to GND. This pair of resistors lowers the Uno's 5 V signal to a safer level for the Bluetooth module.

  • The two resistor legs that meet HC-05 RX must share one breadboard row with the HC-05 RX wire.
  • Leave the HC-05 KEY and STATE pins unconnected.
  • Do not connect Uno D3 straight to HC-05 RX; the Uno sends a 5 V signal and the module's data input is a lower-voltage signal.

4. Fit the button

Put the push button so it bridges the centre gap of the breadboard. Connect one button side to Uno D4 and the opposite side to GND. Pressing it asks the paired phone for a reply.

  • The two legs on the same side of a four-leg button are already joined inside the button; use a leg from each opposite side.

5. Add the sounder

Connect the piezo buzzer SIG lead to Uno D9 and its other lead to GND. The buzzer beeps when a request is sent or text arrives from the phone.

  • This piezo buzzer is not polarised, so either lead can be the SIG lead.
  • Use only the small piezo buzzer, not a larger speaker or motor directly on D9; a larger load can damage the Uno pin.

6. Power and pair the desk buddy

Check that every module shares the Uno GND connection, then plug the Uno into USB. After deployment, pair a phone with the HC-05 and use a Bluetooth serial app or phone automation that sends a short text reply followed by a new line. When you press the button, the Uno sends the word LISTEN to that phone.

  • The normal HC-05 data-mode speed is 9600 baud.
  • The Uno cannot understand spoken words or look up answers itself; the paired phone supplies speech recognition and the online assistant response.
  • Use a USB power source for the Uno while building; do not connect a battery and USB power at the same time.

Review all connections

1. Connections between "oled_face" and "Arduino"

Functionoled_faceArduino
groundGND → groundGND
powerVCC → power5V
i2cSCL → clockGPIO 19
i2cSDA → dataGPIO 18

2. Connections between "talk_button" and "Arduino"

Functiontalk_buttonArduino
groundGND → groundGND
digitalSIGNAL → button signalGPIO 4

3. Connections between "bluetooth" and "Arduino"

FunctionbluetoothArduino
powerVcc → power5V
groundGND → groundGND
dataTX → Bluetooth data to ArduinoGPIO 2
dataRX → Resistor P2EXT

4. Connections between "bt_rx_series" and "Arduino"

Functionbt_rx_seriesArduino
digitalP1 → Arduino transmit signalGPIO 3

5. Connections between "bt_rx_ground" and "Arduino"

Functionbt_rx_groundArduino
digitalP1 → Hc 05 Bluetooth Module RXEXT
groundP2 → ground leg of voltage dividerGND

6. Connections between "buzzer" and "Arduino"

FunctionbuzzerArduino
pwmSIG → sound signalGPIO 9
groundGND → groundGND

Deploy the firmware

#include <Wire.h>
#include <SoftwareSerial.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

const uint8_t BUTTON_PIN = 4;
const uint8_t BT_RX_PIN = 2;  // Arduino receives from HC-05 TX
const uint8_t BT_TX_PIN = 3;  // Arduino sends through the 1k/2k divider to HC-05 RX
const uint8_t BUZZER_PIN = 9;

Adafruit_SSD1306 display(128, 64, &Wire, -1);
SoftwareSerial bluetooth(BT_RX_PIN, BT_TX_PIN);

char replyText[97] = "Pair phone, then send text";
char previousText[97] = "";
bool lastButton = HIGH;
unsigned long lastButtonChange = 0;

void drawFace(const char *message) {
  if (strcmp(message, previousText) == 0) return;
  strncpy(previousText, message, sizeof(previousText) - 1);
  previousText[sizeof(previousText) - 1] = '\0';

  display.clearDisplay();
  display.drawCircle(35, 18, 6, SSD1306_WHITE);
  display.drawCircle(93, 18, 6, SSD1306_WHITE);
  display.fillCircle(35, 18, 2, SSD1306_WHITE);
  display.fillCircle(93, 18, 2, SSD1306_WHITE);
  display.drawLine(45, 39, 55, 45, SSD1306_WHITE);
  display.drawLine(55, 45, 65, 47, SSD1306_WHITE);
  display.drawLine(65, 47, 75, 45, SSD1306_WHITE);
  display.drawLine(75, 45, 85, 39, SSD1306_WHITE);
  display.drawFastHLine(0, 52, 128, SSD1306_WHITE);
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 55);
  display.print(message);
  display.display();
}

void receiveReply() {
  static char incoming[97];
  static uint8_t length = 0;

  while (bluetooth.available()) {
    char c = (char)bluetooth.read();
    if (c == '\r') continue;
    if (c == '\n') {
      if (length > 0) {
        incoming[length] = '\0';
        strncpy(replyText, incoming, sizeof(replyText) - 1);
        replyText[sizeof(replyText) - 1] = '\0';
        drawFace(replyText);
        tone(BUZZER_PIN, 3000, 80);
        length = 0;
      }
    } else if (c >= 32 && c <= 126 && length < sizeof(incoming) - 1) {
      incoming[length++] = c;
    }
  }
}

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(BUZZER_PIN, OUTPUT);
  bluetooth.begin(9600);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  drawFace("Pair phone, then send text");
  tone(BUZZER_PIN, 2400, 80);
}

void loop() {
  receiveReply();

  bool buttonNow = digitalRead(BUTTON_PIN);
  if (lastButton == HIGH && buttonNow == LOW && millis() - lastButtonChange > 40) {
    lastButtonChange = millis();
    bluetooth.println("LISTEN");
    drawFace("Ask phone... waiting");
    tone(BUZZER_PIN, 2400, 120);
  }
  lastButton = buttonNow;
  delay(5);
}

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace, diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik