← All posts

Blog

HC-05 vs HC-06 vs HM-10 — one question decides it, and only one answer cannot be undone

Troniction

Choosing between HC-05, HC-06 and HM-10 — three teal paths from a single point, one of them ending at a coral barrier

Buy the HC-06 if an Android phone is sending commands to your Arduino. Buy the HC-05 if one Arduino has to go and find another. Buy a genuine HM-10 if an iPhone, an iPad or a web page is involved — it is the only one of the three an iPhone can see at all.

One question decides it: what has to talk to your Arduino?

  • An Android phone, and the Arduino only ever receives commands → HC-06.
  • Another Arduino that this one has to go and find → HC-05.
  • An iPhone or iPad, or a web page → HM-10.

Every comparison of these three opens with a specification table instead — baud rates, current draw, a range figure somebody copied off a datasheet. None of that is what decides it. Two of the three rows above are preferences. The third cannot be undone in software, and it is the reason this article exists rather than a table.

The one row that is not a preference: the iPhone

Classic Bluetooth SPP — which is what an HC-05 and an HC-06 speak — is invisible to iOS at the operating-system level. No app fixes it, no library fixes it, and no wiring change fixes it. You need a BLE module: a genuine HM-10, or an ESP32. And Web Bluetooth is not the escape hatch — it is not in Safari, any version.

iOS and Safari behaviour checked 2026-10-01.

That is the single most expensive paragraph in this subject, and it is worth being precise about why.

It does not present as a hardware fault. Your sketch is correct. Your wiring is correct. An Android phone across the room connects to the same module in four seconds. You open Bluetooth settings on the iPhone and the module is not in the list — not "won't pair", not listed at all. The phone's radio stack never offers a Classic serial device to any app, so there is nothing for an app to find and nothing for you to debug.

People lose evenings to this. They try another app, then another cable, then resetting network settings, then forgetting and re-pairing — every one of which addresses a connection problem, and this is not one.

⚠️ This is the only choice on this page that a replacement module is the sole fix for. Buy the wrong one of the other two and you have a slightly awkward project. Buy Classic when you needed BLE and you have a project that cannot be finished.

HC-05 vs HC-06 vs HM-10, in one table

HC-06HC-05HM-10
BluetoothClassic 2.0Classic 2.0BLE 4.0
Android✅✅✅
iPhone / iPad❌❌✅
RoleSlave only — waits to be connected toSlave or master — can start the connectionSlave or master
Setting it upBarely neededFull AT command setFull AT command set
PriceCheapestA little moreThe dearest — roughly 1.2–1.8× the HC-06

Read the iPhone row first. Then read the Role row. Everything else is a tiebreaker.

What each one is actually for

HC-06 — the one that gets out of your way

It is a slave and only a slave: it sits there advertising, and something else connects to it. For a phone-drives-a-thing project that is the entire requirement, and the simplicity is a real feature — there is almost nothing to configure, so there is almost nothing to configure wrongly.

What you give up is initiating. An HC-06 can never be the one that reaches out. No AT command adds that; it is not a setting.

Buy it if: this is your first module, an Android phone is the remote, and you want it working tonight.

HC-05 — the same part with ambition

Same footprint, same four wires, the same nominal 9600 baud out of the box. What you gain is master mode: it can go and find another module and connect to it, which is exactly what you need the day one Arduino has to talk to another Arduino across a room. It also has a full AT command set and a physical button for getting into it.

You give up a little money and a little simplicity. Plenty of people buy an HC-05 and use it purely as a slave, and that is a perfectly sensible thing to do — you are paying a small premium for the option.

Buy it if: one Arduino must call another, or you would rather have the AT command set and the button than save a dollar.

HM-10 — a different radio, not a better one

This is the part people get wrong. The HM-10 is not "the new HC-05". It speaks Bluetooth Low Energy, a different protocol that happens to share a name and a logo.

That buys two things nothing else here offers:

  • iPhones and iPads can see it. iOS exposes BLE to apps and does not expose Classic serial at all.
  • A web page can drive it. Web Bluetooth talks to BLE devices directly, so the remote can be a URL rather than an app you have to build — on Android and desktop Chrome, not on iOS.

It also costs you things that are easy to miss until you are holding one. An HM-10 and an HC-05 cannot talk to each other — different protocols, so pairing two Arduinos means two modules of the same family. The apps are different: Classic modules use a serial terminal, BLE modules use something like nRF Connect or LightBlue. And a BLE module usually has no pairing step at all, which reads as a fault the first time you wait for a PIN prompt that never arrives.

Buy it if: an iPhone is in the room, or you want the remote to be a web page.

What does not change, whichever you pick

Worth knowing before you agonise, because it is most of the project:

  • The same four wires. VCC, GND, TX, RX on every one of them. Nothing about the wiring changes with your choice.
  • A 9600 starting point, with two exceptions worth knowing. All three are nominally 9600 in normal data mode, so your first sketch is the same sketch — but many ZS-040 HC-05 clones ship at 38400 for data, and a genuine HM-10 on firmware V700 or later comes up at 115200. If the first thing you see in the serial monitor is garbage characters, that is the baud rate and not the wiring: try those two numbers before you change anything else. (The HC-05 also uses 38400 for AT command mode, which is a separate number from its data rate and most of why this module confuses people.)
  • The same 3.3V RX pin. All three want a divider or a level shifter on the line coming from a 5V Arduino's TX. This is not a difference between them; it is a thing all three need.
  • The same SoftwareSerial pattern, and the same reason not to sit on pins 0 and 1.

So the decision is narrower than it looks. You are choosing a radio and a role, not a wiring diagram and not a programming model.

Why this article ignores the range and power numbers

Comparisons of these three usually quote a range figure — often something like 100 m for the HM-10 against 10 m for the HC-05 — and a current draw in milliamps. This article does not use either as a buying criterion, deliberately.

Those figures come off datasheets, measured in conditions you will not reproduce: line of sight, no walls, no interference, a specific antenna. For the project almost everyone reading this is building — a phone or a second Arduino in the same room, or the next room — every one of these modules is comfortably good enough, and the number will not be the thing that decides whether it works.

Power is the one that can genuinely matter, and only in one case: a battery project that has to last. BLE is designed to idle cheaply, which is a real advantage if the thing sits unused for hours between commands. If your project is plugged in or runs from a pack you recharge anyway, it is noise.

⚠️ If a comparison leads with range, it is comparing datasheets, not modules. That is the tell for the ones that will not help you when something goes wrong.

"Should I just use an ESP32 instead?"

Often, genuinely, yes — it has Wi-Fi and BLE on board, it is a far more capable processor, and the price has come down to where the comparison is fair. It is a real answer, not a dodge.

The short version: if you are choosing a radio for a project you have not started, the ESP32 deserves a look before you buy any of these three. If you already have an Arduino Uno working and you want to add Bluetooth to it this week, one of these modules is the smaller step. That trade-off deserves its own article and gets one later in this series.

Why "just buy the cheapest" is the wrong instinct here

It is a reasonable instinct and it fails on this particular decision, for one reason: the price spread is too small to carry the weight people put on it.

An HC-06 is the cheapest of the three. An HM-10 is roughly 1.2 to 1.8 times that — checked against listings in August 2026, so treat it as a ballpark rather than a quote. On a part that costs a few dollars, the entire spread is about the price of a coffee.

Now price the alternative. The wrong module is not a few dollars wasted; it is:

  1. A wiring session you will do twice.
  2. A week of wondering whether it is your code, because the failure does not look like a wrong-part failure.
  3. A second order, and however long shipping takes where you are.

Buy for the job, then buy the cheapest one that does the job. That ordering is the whole advice.

One more thing before you order

There is a complication specific to the HM-10, and it is worth knowing before you spend.

The module that arrives may not be the one the listing named. The HM-10 has a family of clones and near-clones sold under the same name and the same photograph, and they are not identical — they take different AT syntax, answer to different names, and some of them are missing capabilities the genuine part has. It is the single most under-served trap in this subject, and it is the reason two modules that both say "HM-10" can behave completely differently.

The symptom, when it bites, is usually that half the AT commands in a tutorial return ERROR on your module while working perfectly for everyone in the comments. That article covers the dialects; a full article on the clone tree and how to identify what you are holding is next in this series.

For a first project with an Android phone, none of this applies — buy the HC-06 and get on with it. It is only the BLE path that has a lineage problem.

What to do now

  1. Decide what has to talk to it, and let the iPhone row veto everything else.
  2. If an iPhone is involved, buy a genuine HM-10 — and expect to verify what arrived.
  3. If two Arduinos must find each other, buy the HC-05 for its master mode.
  4. Otherwise buy the HC-06, because the simplicity is a feature and you can spend the saving on a second one.

All three wire up the same way and all three want the same care on the RX line, which is a 3.3V input on a 5V board whichever one you chose.

Every symptom in this subject sorts the same way, by which part of the chain is misbehaving, on the Arduino Bluetooth fixes index.

Common questions

Which Bluetooth module should I buy for Arduino?
Answer one question: what has to talk to it? An Android phone and the Arduino only receives commands, buy the HC-06 — it is the cheapest and the simplest. One Arduino has to start a connection to another, buy the HC-05, because it can be a master and the HC-06 cannot. An iPhone or iPad is involved, buy a genuine HM-10, because it is the only one of the three an iPhone can see. Everything else on a spec sheet is a tiebreaker.
Can an HC-05 work with an iPhone if I find the right app?
No. Classic Bluetooth SPP — which is what an HC-05 and an HC-06 speak — is invisible to iOS at the operating-system level. No app fixes it, no library fixes it, and no wiring change fixes it. You need a BLE module: a genuine HM-10, or an ESP32. And Web Bluetooth is not the escape hatch — it is not in Safari, any version.
Is the HM-10 just a newer, better HC-05?
No, and this is the most common misreading. The HM-10 speaks Bluetooth Low Energy, a different protocol that happens to share the Bluetooth name and logo. It is not a faster or newer version of the same thing — it is a different radio. That is why an iPhone can see it and why it needs different apps, and it is also why an HM-10 and an HC-05 cannot talk to each other.
Should I just buy the cheapest one?
The price gap is too small for price to decide it. An HC-06 is the cheapest and an HM-10 runs roughly 1.2 to 1.8 times that, so the whole spread is a couple of dollars. The real cost of the wrong choice is not the money — it is discovering after the wiring is done that the module cannot do the thing you needed, then waiting for a replacement to arrive.
Can the HC-06 do everything the HC-05 does if I configure it?
No. The HC-06 is a slave and only a slave: it advertises and waits to be connected to. It cannot initiate a connection, and no AT command adds that. For a phone-drives-a-thing project that is the whole requirement and the simplicity is a genuine feature. The day one Arduino has to reach out and find another, you need the HC-05's master mode.

Still not connecting?

Arduino Bluetooth — Make It Connect is 62 pages of every way the link fails, why, and the fix — HC-05, HC-06 and HM-10 BLE, including the clone family almost nothing covers. $9.