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)

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
| Pin | Function | Type |
|---|---|---|
| STATE | Digital3.3 V | output |
| RXD | UART module RX: connect to the board's TX (divide a 5V TX down to 3.3V) | input |
| TXD | UART module TX: connect to the board's RX3.3 V | output |
| GND | GND | power in |
| VCC | VCC (3.6-6V)3.6–5 V | power in |
| EN | Digital | input |
How to wire the HM-10 BLE Module
Pin by pin, for the board you have.
| HM-10 BLE Module | Arduino Uno | Note |
|---|---|---|
| VCC | 5V | |
| GND | GND | |
| TXD | D10 | |
| RXD | D11 | through a 1 kΩ resistor, with a 2 kΩ resistor from RXD to GND (a divider) |
| STATE | D7 | |
| Sensor output | A0 | optional: any analog sensor, such as a soil probe's AOUT; the sketch sends its reading as moisture= |
| HM-10 BLE Module | ESP32 DevKit V1 | Note |
|---|---|---|
| VCC | VIN | |
| GND | GND | |
| TXD | GPIO13 (D13) | |
| RXD | GPIO14 (D14) | direct: the board's 3.3 V signal needs no divider |
| STATE | GPIO27 (D27) |
- VCC is on VIN, which gives about 5 V only while the board is powered from USB.
| HM-10 BLE Module | Raspberry Pi Pico | Note |
|---|---|---|
| VCC | VBUS | |
| GND | GND | |
| TXD | GP0 | |
| RXD | GP1 | direct: the board's 3.3 V signal needs no divider |
| STATE | GP2 |
- VCC is on VBUS, which gives about 5 V only while the board is powered from USB.
HM-10 BLE Module code
Every example here compiles for its board.
// 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-29Before you wire it
- 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.
- 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
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.
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.
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).
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.
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
- Build this
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.
This page as plain Markdown, for ChatGPT, Claude or your own agent. /components/hm-10.md