HM-10 BLE Module

The HM-10 is a Bluetooth 4.0 Low Energy UART bridge on TI's CC2541 that works with iPhones, Android phones and Web Bluetooth.

  • BluetoothV4.0 Low Energy, 2.4 GHz, GFSK
  • ChipTI CC2541: 2 V to 3.6 V, 8051 core, 256 KB flash, 8 KB RAM, up to 0 dBm
  • Module supply (bare HM-10)2.5 V to 3.3 V DC
  • Carrier supply3.6 V to 6 V (on-board regulator)
HM-10 BLE Module, The HM-10 is a Bluetooth 4.0 Low Energy UART bridge on TI's CC2541 that works with iPhones, Android phones and Web Bluetooth.
In short

The HM-10 is a Bluetooth 4.0 Low Energy module on TI's CC2541 that passes UART data to a phone through service 0xFFE0 and characteristic 0xFFE1, at 9600 baud 8N1 by default (DSD TECH HM-10 datasheet, pp. 1, 10). On its breakout carrier, power VCC from 5 V, wire TXD to the board's RX and the board's TX to RXD through a 1 kΩ / 2 kΩ divider (the bare module runs at 2.5 V to 3.3 V, p. 1), and send AT commands with no line ending while no phone is connected (p. 10).

The HM-10 is a transparent serial bridge for Bluetooth Low Energy. Built on Texas Instruments' CC2541, a single-mode Bluetooth v4.0 chip with an 8051 core, 256 KB of flash and up to 0 dBm output power (TI CC2541 product page), it runs Jinan Huamao's HMSoft firmware: whatever the microcontroller writes to its UART reaches the connected phone as notifications on characteristic 0xFFE1 of service 0xFFE0, and whatever the phone writes to 0xFFE1 comes out of TXD (DSD TECH HM-10 datasheet, p. 1).

Because it is BLE rather than Classic Bluetooth, the HM-10 works with iPhones as well as Android phones, with BLE terminal apps such as LightBlue or nRF Connect, and with Web Bluetooth pages in Chrome. The bare module draws 8.5 mA when active and 50 µA to 200 µA asleep (datasheet, p. 1), far less than a Classic module. It can act as peripheral (the default) or central.

The bare HM-10 is a 27 × 13 × 2.2 mm castellated board powered at 2.5 V to 3.3 V (datasheet, p. 1). Makers usually buy it on a 6-pin carrier (STATE, RXD, TXD, GND, VCC, EN) whose regulator takes 3.6 V to 6 V; the UART pins stay at 3.3 V logic. The factory defaults are name HMSoft, 9600 baud N81, PIN 000000 and peripheral role (p. 10). AT commands are plain uppercase strings with no \r or \n, accepted over the UART only while no phone is connected (p. 10).

HM-10 BLE Module pinout

tinkered.ai/components/hm-10HM-10 BLE ModuleSTATEDigitalRXDUART module RX: connect to the board's TX (divide a 5V TX down to 3.3V)TXDUART module TX: connect to the board's RXGNDGroundVCCPowerENDigital
PinFunctionType
STATEDigital3.3 Voutput
RXDUART module RX: connect to the board's TX (divide a 5V TX down to 3.3V)input
TXDUART module TX: connect to the board's RX3.3 Voutput
GNDGNDpower in
VCCVCC (3.6-6V)3.6–5 Vpower in
ENDigitalinput

How to wire the HM-10 BLE Module

Pin by pin, for the board you have.

HM-10 BLE ModuleArduino UnoNote
VCC5V
GNDGND
TXDD10
RXDD11through a 1 kΩ resistor, with a 2 kΩ resistor from RXD to GND (a divider)
STATED7
Sensor outputA0optional: any analog sensor, such as a soil probe's AOUT; the sketch sends its reading as moisture=
Open this circuit on an Arduino UnoThe full Arduino Uno guide

HM-10 BLE Module code

Every example here compiles for its board.

No library needed
// HM-10 BLE Module on Arduino Uno: wiring and a free simulation at https://www.tinkered.ai/components/hm-10
#include <SoftwareSerial.h>

SoftwareSerial ble(10, 11);   // RX, TX
const int STATE_PIN = 7;

void at(const char* cmd) {
  ble.print(cmd);              // no line ending: the HM-10 takes it when the line goes quiet
  delay(150);
  while (ble.available()) Serial.write(ble.read());
  Serial.println();
}

void setup() {
  Serial.begin(9600);
  ble.begin(9600);
  pinMode(STATE_PIN, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  at("AT");                    // OK
  at("AT+NAMEPlantBot");       // OK+Set:PlantBot
  at("AT+NOTI1");              // OK+Set:1, then OK+CONN / OK+LOST on links
}

uint32_t last = 0;

void loop() {
  while (ble.available()) {
    char c = ble.read();
    if (c == '1') digitalWrite(LED_BUILTIN, HIGH);
    if (c == '0') digitalWrite(LED_BUILTIN, LOW);
    Serial.write(c);
  }
  if (digitalRead(STATE_PIN) && millis() - last > 1000) {
    last = millis();
    ble.print("moisture=");
    ble.println(analogRead(A0));
  }
}
Compiled for arduino:avr:uno on 2026-10-29

Before you wire it

Do
  • Cross the UART: module TXD → board RX, module RXD → board TX.
  • On a 5V board put a divider into RXD: 1k from the board's TX to RXD, 2k from RXD to GND. On a 3.3V board (ESP32) wire directly.
  • On an Uno or Nano use SoftwareSerial on two other pins (D10 RX, D11 TX) so D0/D1 stay the USB serial.
  • Handle data as a byte stream: one phone write can arrive in several reads, and the sketch's output reaches the phone in 20-byte notifications.
Don’t
  • No println for HM-10 AT commands, and no waiting for \r\n in its answers.
  • No module RXD straight onto a 5V board's TX.
  • Power the carrier from 5 V; its regulator takes 3.6 V to 6 V. The bare module itself runs at 2.5 V to 3.3 V (DSD TECH datasheet, p. 1), so its UART pins are 3.3 V logic.
  • Cross the UART: module TXD to the board's RX, board's TX to module RXD. On a 5 V board put a 1 kΩ / 2 kΩ divider into RXD; on an ESP32 or Pico wire it directly.
  • On an Uno or Nano use SoftwareSerial on two spare pins so D0 and D1 stay free for uploads and the Serial Monitor.
  • Send AT commands with print(), not println(): the HM-10 expects no \r or \n (datasheet, p. 10). Leave a short pause between commands so each is read on its own.
  • AT commands work only while no phone is connected; sending AT while connected drops the link (datasheet, pp. 10, 11). AT+NOTI1 makes the module report OK+CONN and OK+LOST.
  • STATE goes HIGH while a central is connected. With the default AT+PIO10 setting the module's LED blinks 500 ms on, 500 ms off while unconnected and stays on when connected (datasheet, pp. 9, 30).
  • The bare HM-10 module takes 2.5 to 3.3 V; 3.6 to 6 V is the carrier board's input.
  • The CC2541 transmits at 0 dBm at most.

Specifications

Bluetooth
V4.0 Low Energy, 2.4 GHz, GFSKDSD TECH HM-10 datasheet, p. 1
Chip
TI CC2541: 2 V to 3.6 V, 8051 core, 256 KB flash, 8 KB RAM, up to 0 dBmTI CC2541 product page (datasheet SWRS110D)
Module supply (bare HM-10)
2.5 V to 3.3 V DCDSD TECH HM-10 datasheet, p. 1
Carrier supply
3.6 V to 6 V (on-board regulator)DSD TECH HM-10 breakout listing
Current
8.5 mA active, 50 µA to 200 µA asleepDSD TECH HM-10 datasheet, p. 1
Factory defaults
Name HMSoft, 9600 baud N81, PIN 000000, peripheral roleDSD TECH HM-10 datasheet, p. 10
GATT
Service 0xFFE0, characteristic 0xFFE1 (notify and write)DSD TECH HM-10 datasheet, p. 1
AT command format
Uppercase, no \r or \n; taken only while not connectedDSD TECH HM-10 datasheet, p. 10
Baud rates
AT+BAUD0 to AT+BAUD8: 9600 (default) up to 230400DSD TECH HM-10 datasheet, p. 17
Bare module size
27 × 13 × 2.2 mmDSD TECH HM-10 datasheet, p. 1
Supply voltage
3.6–5 V
Maximum supply voltage
6 V
Interface
UART
Dimensions
15.7 × 6.85 × 38.2 mm
Weight
3 g

From the Generic (HM-10 / TI CC2541 on a breakout carrier)'s datasheet, published by Generic (HM-10 / TI CC2541 on a breakout carrier).

Common mistakes

  1. Sending AT commands with println()

    HMSoft commands carry no line ending (DSD TECH datasheet, p. 10). println() appends \r\n and the module ignores or misreads the command. Use print(), and set the Serial Monitor to No line ending.

  2. Driving RXD with 5 V

    The HM-10 is a 2.5 V to 3.3 V part (datasheet, p. 1) and the common 6-pin carrier passes RXD straight through. Put a 1 kΩ / 2 kΩ divider between a 5 V board's TX and RXD.

  3. Looking for it in the phone's Bluetooth settings

    A BLE peripheral does not appear as a serial port and usually not in the system Bluetooth list. Connect from a BLE app (LightBlue, nRF Connect, a BLE serial terminal) and subscribe to characteristic 0xFFE1 (datasheet, p. 1).

  4. Sending AT commands while connected

    In transmission mode the HM-10 only takes AT commands from the UART while no device is connected; an AT sent during a connection disconnects it (datasheet, pp. 10, 11). Configure the module before the phone connects.

  5. Setting AT+BAUD7 by accident

    AT+BAUD7 selects 1200 baud, and after the next power-up the module answers no AT commands until the PIO0 key is pressed to restore 9600 (datasheet, p. 17). Check the table before changing the speed.

HM-10 BLE Module questions

How do I connect an HM-10 to an Arduino Uno?

VCC to 5 V, GND to GND, TXD to D10, and D11 to RXD through a 1 kΩ / 2 kΩ divider, then SoftwareSerial ble(10, 11) and ble.begin(9600), the factory baud rate (DSD TECH HM-10 datasheet, p. 10). Send ble.print("AT") and expect OK. Connect from a BLE app and write to characteristic 0xFFE1 (p. 1).

HM-10 vs HC-05: which Bluetooth module should I use?

The HM-10 is Bluetooth 4.0 Low Energy (DSD TECH datasheet, p. 1): it works with iPhones, Android and Web Bluetooth and draws 8.5 mA active, microamps asleep. The HC-05 is Classic Bluetooth 2.0 SPP (ITead HC-05 datasheet, p. 1): it appears as a serial port on Android and PCs, not to iPhone apps, and draws about 8 mA connected with no sleep mode (HC user manual, p. 5). Pick the HM-10 for iPhones and battery projects, the HC-05 for a classic serial port on Android or a PC.

Does the HM-10 work with an iPhone?

Yes. It is a Bluetooth 4.0 Low Energy peripheral (DSD TECH datasheet, p. 1), and iOS apps talk to BLE devices directly. Connect with a BLE app such as LightBlue, subscribe to characteristic 0xFFE1 and write to it to send data.

Can I use the HM-10 with an ESP32 or Raspberry Pi Pico?

Yes. Its UART runs at 3.3 V logic, the bare module being a 2.5 V to 3.3 V part (DSD TECH datasheet, p. 1), so TX and RX connect directly to a 3.3 V board. Power the carrier from the board's 5 V pin (VIN or VBUS). An ESP32 also has BLE built in, so the HM-10 mostly helps boards without a radio, such as the Pico.

Why does my HM-10 not respond to AT commands?

Check three things: the sketch sends no \r\n (use print(), not println()), the baud rate matches the module (9600 out of the box), and no phone is connected, since AT commands are taken over the UART only while unconnected (DSD TECH datasheet, p. 10). Some modules sold as HM-10 are clones with other firmware; AT+VERS? shows which you have (p. 38).

What is the default HM-10 PIN?

000000 (DSD TECH datasheet, pp. 10, 32). It is only asked when bonding is enabled with AT+TYPE2, Auth with PIN; the factory setting AT+TYPE0 needs no PIN (p. 37).

Build something with the HM-10 BLE Module

  • iPhone-controlled lights

    Switch an LED strip or relay from an iPhone app over BLE, which a Classic HC-05 cannot do.

    Build this
  • Web Bluetooth dashboard

    Show live sensor readings in a Chrome web page that connects straight to the HM-10, with no app to install.

    Build this
  • Battery-powered sensor tag

    Report temperature or moisture to a phone while the module sleeps at microamps between readings.

    Build this
  • BLE robot remote

    Steer a small robot from a phone joystick app that writes one byte per command to characteristic 0xFFE1.

    Build this
For AI assistants

This page as plain Markdown, for ChatGPT, Claude or your own agent. /components/hm-10.md

What will you build with it?