Draadloze communicatie met Bluetooth HC-05 en een Arduino
Je hebt vast een reden om Bluetooth in jouw project te gebruiken, en met deze tutorial kun je een snelle start maken. In deze tutorial leer je stap voor stap hoe je met de HC-05 (of HC-06) module draadloos kunt communiceren met een Arduino. Door gebruik te maken van een Bluetoothverbinding kun je eenvoudig data versturen en ontvangen via je computer of smartphone. Dat is bijvoorbeeld handig voor een bedieningspaneel, het debuggen van software, het besturen van een RC auto, uitlezen van sensors, en… de mogelijkheden zijn bijna oneindig.
1. Benodigdheden
Voordat je aan de HC-05 Bluetooth tutorial gaat beginnen heb je wat hardware en software nodig. Helemaal onderaan de pagina zie je de producten die je bij ons kunt kopen om gelijk aan de slag te gaan.
Hardware
- 1x Arduino Uno
- 1x HC-05 Bluetooth Module of de HC-06 Bluetooth Module
- 1x Breadboard kabels
- 1x Klein Breadboard
- 1x Weerstand 2K2 Ohm (2K werkt ook prima)
- 1x Weerstand 1K Ohm
- Een computer of smartphone met Bluetooth
Software
In deze tutorial maken wij gebruik van een Windows computer om via Bluetooth te communiceren. Als je gebruik maakt van een smartphone met het Android besturingssysteem kun je ook de Serial Bluetooth Terminal om te communiceren via Bluetooth.
- Bluetooth software (Windows): Bluetooth Serial Terminal
- Bluetooth software (Android): Serial Bluetooth Terminal
- Arduino IDE
2. Het verschil tussen de HC-05 en de HC-06 module
In deze tutorial wordt gebruik gemaakt van de HC-05 Bluetooth module, maar er is ook een variant van deze module gemaakt en dat is de HC-06. Het grote verschil zit hem in de manier waarop de Bluetooth verbinding tot stand wordt gebruikt, en dat zal even kort worden uitgelegd.
De HC-05 kan zowel dienen als Master en Slave. Dit houdt in dat deze Bluetooth module zowel een verbinding kan initiëren als Master, maar er kan ook verbinding mét de module worden gemaakt als Slave. De HC-06 module is echter een Slave Only apparaat, en daar kun je dus alleen verbinding mee maken. Deze bluetooth module kan dus zelf geen verbinding maken. Je kunt dus wel gewoon verbinding maken met de HC-06 via een HC-05 module of je smartphone.
Hoewel de HC-06 enkel als Slave kan dienen is het wel gewoon mogelijk om data te versturen en ontvangen. Als je deze tutorial volgt maakt het niet uit of je de HC-05 of de HC-06 module gebruikt.
In een situatie waarbij je bijvoorbeeld tussen 2 Arduino's wilt communiceren via Bluetooth moet er minimaal 1 Arduino zijn die de verbinding opstart, en dat gebeurd via de HC-05 module. Het is dus niet mogelijk om beide Arduino's te voorzien van een HC-06, aangezien die geen verbinding kan initiëren.
3. De HC-05 Bluetooth module op de Arduino aansluiten
Nu je het verschil weet tussen de twee modules kun je de HC-05 module verbinden met de Arduino. Wij maken gebruik van de Arduino Uno, maar je kunt ook een ander type Arduino gebruiken.
Op de Bluetooth module zit een 5V naar 3.3V spanningsregelaar zodat je deze gewoon kunt voeden met 5V, echter moeten de datasignalen wél van 3.3V niveau zijn. Dit betekend dat de RX pin, de data van de Arduino naar de HC-05, via een level converter moet verlopen. Aangezien dit slechts een datasignaal is kan de spanning via een weerstandsdeler verlaagd worden. Hiervoor kun je de 1K Ohm en 2.2K Ohm weerstanden gebruik die hierboven genoemd zijn. Hetzelfde geldt voor de EN (enable) pin, waarmee je de module via een IO in- en uit kunt schakelen.
De TX pin van de module kan direct op de Arduino aangesloten worden, aangezien de Arduino een 3.3V signaal gewoon leest als logisch hoog.
Met de STATE pin kun je via de Arduino uitlezen of er een Bluetooth verbinding tot stand is gebracht.
Je sluit de HC-05 module dus als volgt op de Arduino Uno aan:
- VCC naar +5V
- GND naar GND
- RX van de HC-05 via een weerstandsdeler naar pin 3 van de Arduino
- TX van de HC-05 direct naar pin 2 van de Arduino
- EN via een weerstandsdeler naar een gewenste IO op de Arduino. Gebruik je deze niet? Sluit deze pin dan niet aan
- STATE kan direct op een IO van de Arduino worden aangesloten. Gebruik je deze niet? Sluit deze pin dan niet aan.

4. Verbinding maken met de HC-05 module
Nu je de HC-05 module aan de Arduino hebt gekoppeld kun je de Arduino inschakelen door de USB kabel in je computer te steken. Het zal meteen opvallen dat de rode LED van de HC-05 module snel begint te knipperen. Dit betekend dat de HC-05 is opgestart, maar nog geen verbinding heeft gemaakt met een apparaat.
Zodra je verbinding hebt gemaakt met de module zal de rode led elke 4 seconden kort knipperen. Gebruik je de HC-06? Dan zal de rode LED continue aan zijn als je verbonden bent.
4.1. Bluetooth apparaat HC-05 toevoegen in Windows
Om een verbinding tot stand te brengen in Windows navigeer je naar 'Settings -> Devices -> Bluetooth & other devices'. Daar kun je ook gelijk de Bluetooth functionaliteit aanzetten als jouw computer over Bluetooth beschikt.
Vervolgens klik je op 'Add Bluetooth or other device'.
Er opent dan een venster waar je kunt kiezen welk soort apparaat je wilt toevoegen. Hier kies je voor 'Bluetooth'
Jouw computer gaat nu zoeken naar beschikbare Bluetooth apparaten, en na een aantal seconden zul je de 'HC-05' als device in deze lijst zien staan en kun je er op klikken.
Om verbinding te maken moet je nog een PIN invullen. Deze is standaard 1234 of 0000. Vul de pincode in en druk op 'Connect'. Als alles goed gaat is je HC-05 nu herkend als Bluetooth apparaat in Windows

Open nu de Bluetooth Serial Monitor, selecteer de HC-05 module en klik vervolgens op 'Connect'.
5. Arduino code schrijven voor de HC-05
Je hebt nu succesvol verbinding gemaakt met de HC-05, en dan kan nu de code worden geschreven om data via de Bluetooth module te versturen en ontvangen. Open hiervoor de Arduino IDE.
Met onderstaand eenvoudig programma kun je via de Serial Monitor van de Arduino IDE data versturen over de Bluetooth verbinding en ontvangen op het verbonden apparaat, in dit geval de Bluetooth Serial Monitor van Windows. Om dit te realiseren wordt er gebruik gemaakt van de UART op de Arduino, en een softwarematige UART voor de Bluetooth module.
We beginnen met het toevoegen van de SoftwareSerial Library om gebruik te maken van, zoals de naam al zegt, een softwarematige UART. De hardware UART kunnen we niet gebruiken om de Bluetooth op aan te sluiten, aangezien die nodig is voor de Serial Monitor van de Arduino.
Eerder heb je de Bluetooth RX en TX signalen al aangesloten op respectievelijk pin 2 en 3 van de Arduino. Vervolgens wordt er een object aangemaakt van het type SoftwareSerial, en geïnitialiseerd met de RX en TX pinnen van de Bluetooth module.
#include <SoftwareSerial.h>
#define bluetoothRX 2
#define bluetoothTX 3
SoftwareSerial mySerial(bluetoothRX, bluetoothTX);
In de setup() functie starten we de gewone seriële communicatie op, en ook de seriële communicatie voor de HC-05 module. Voor beide seriële poorten gebruiken we een baudrate van 9600. Dat ziet er als volgt uit:
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
;
}
// Open serial communication for the Bluetooth Serial Port
mySerial.begin(9600);
}
Daarna kan de loop() functie geprogrammeerd worden, waarmee we via Bluetooth kunnen zenden en ontvangen. Wat er precies in deze loop gebeurd kun je aflezen uit de code, en komt in feite hierop neer:
- Ontvangen: Als er data beschikbaar is op de Bluetooth module, dan geef de data weer in de Serial Monitor van Arduino
- Versturen: Als er data is ingevoerd in de Serial Monitor van Arduino, dan verstuur deze data via Bluetooth
Je kunt dus data in de Serial Monitor invoeren en versturen via de Bluetooth module.
void loop() {
// If any data is available at the Bluetooth Serial Port
if (mySerial.available()) {
// Write this data to the Serial Monitor (Arduino)
Serial.write(mySerial.read());
}
// If any data is sent via the Serial Monitor (Arduino)
if (Serial.available()) {
// Send this data via the Bluetooth Serial Port
mySerial.write(Serial.read());
}
}
De software is nu compleet in zijn meest minimale vorm en is naar eigen wens verder uit te breiden.

In de bovenstaande afbeelding zie je dat er data is verstuurd vanuit de Bluetooth Terminal (Windows) naar de Arduino, en visa versa.
6. De Bluetooth module configureren met AT commando's
Bij het pairen van de Bluetooth module ben je de standaardnaam HC-05 tegen gekomen, en hebt de PIN 1234 of 0000 gebruikt. Dit zijn standaardwaardes die vanaf de fabriek in de module worden geprogrammeerd. Zou het niet mooi zijn om dat te kunnen veranderen? Zowel de HC-05 als de HC-06 Bluetooth module kan geconfigureerd worden via zogenaamde AT commando's. Deze commando's kunnen alleen gestuurd worden als de module daarvoor in de AT modus wordt gezet. Hoe dat gaat lees je hieronder.
6.1 HC-05 in AT modus zetten en commando's versturen
Om de HC-05 module in AT modus te zetten moet je de spanning loshalen van de module, vervolgens het kleine knopje op de module indrukken, en terwijl je het knopje indrukt sluit je de voedingsspanning weer aan. Je zult zien dat de rode LED langzaam knippert, ongeveer 1 seconde aan en 1 seconde uit. Hoera, de module staat nu in AT modus!
Als de HC-05 in AT modus staat kun je geen verbinding maken via Bluetooth, daarvoor moet je eerst uit de AT modus stappen.
De eerder geschreven code kun je bijna in zijn geheel gebruiken, maar je zult de baudrate van de Bluetooth seriële poort moeten aanpassen. De baudrate voor AT is namelijk 38400, en nu staat die ingesteld op 9600. Vervang dus de regel code in de setup() met deze regel:
mySerial.begin(38400);
Nu kun je de sketch uploaden naar de Arduino en de Serial Monitor openen om AT commando's te versturen. Let er wel op dat je bij de Serial Monitor 'Both NL & CR' selecteert als optie
Er zijn redelijk veel AT commando's beschikbaar voor de HC-05 Bluetooth module, en om deze tutorial compact te houden zal ik er 3 noemen:
- NAME - De naam van de module (standaard HC-05)
- PSWD - De PIN van de module (standaard 1234 of 0000)
- ADDR - Adres van de module
Hoe gebruik je een AT commando? Als je stap 6 hebt gevolgd en de baudrate dus hebt aangepast, dan kun je in de Serial Monitor van de Arduino IDE commando's versturen naar de Bluetooth module. Je kunt met AT commando's waardes van de module uitlezen, maar ook instellen.
Let bij het versturen via de Serial Monitor er wel op dat je de optie 'Both NL & CR' aan hebt staan, en dat de baudrate is ingesteld op 9600. Niet te verwarren met de 38400 die de Bluetooth module zélf gebruikt.

Om een waarde, bijvoorbeeld de naam, uit te lezen vul je in de Serial Monitor het volgende in: AT+NAME (HOOFDLETTERS). Druk daarna op 'Send', en je krijgt de volgende response terug:
+NAME:HC-05
OK
In dit geval is de naam van de module 'HC-05'. Wil je die naam veranderen? Stuur dan dit AT commando naar de module: AT+NAME=VDR Electronics, en druk weer op 'Send'. De response die je terugkrijgt is OK, en dat betekend dat het commando is uitgevoerd. Lees nu nog een keer de naam uit van de module, en je zult zien dat de naam is veranderd:
+NAME:VDR Electronics
OK
Op dezelfde manier kun je ook het wachtwoord, baudrate, role (slave/master) etc. wijzigen.
Read-only settings
Niet alle settings kun je veranderen. Het adres is er bijvoorbeeld zo eentje die alleen uitgelezen kan worden. Wil je die toch wijzigen via een AT commando, dan krijg je een foutmelding van de module terug:
ERROR:(0)
Om weer uit de AT commando modus te stappen stuur je het commando AT+RESET. Meteen valt op dat de rode LED van de HC-05 weer snel begint te knippen, en je kunt dus weer verbinding maken via Bluetooth. Let wel op: je Bluetooth verbinding heeft nu een baudrate van 38400. Als je die niet terugzet naar 9600 wordt de data niet goed overgestuurd. Je kunt natuurlijk ook de voedingsspanning van de module uit en weer aan zetten, of via de enable pin de module resetten.
6.2 HC-06 in AT modus zetten en AT commando's versturen
De HC-06 module wijkt iets af van de HC-05 module op het gebied van AT commando's en het plaatsen in AT modus. Ten eerste staat de HC-06 module automatisch bij het opstarten in AT modus, én stuur je de AT commando's met de standaard baudrate van 9600 i.p.v. 38400. De software die hierboven beschreven staat kun je dus direct gebruiken. Om het duidelijk te maken dient deze regel in de setup() te staan:
mySerial.begin(9600);
Als je gebruik maakt van de Serial Monitor (Arduino), dan moet je geen New Line en Carriage Return (Both NL & CR optie uitschakelen) meesturen met de data, dan komt het namelijk niet goed binnen bij de HC-06 module. Je selecteert dus de optie 'No line ending'.
Uitlezen van de HC-06 in AT modus
Voor het uitlezen van de huidige firmware versie, AT+VERSION, ziet dat er als volgt uit:

Je krijgt de response OK terug, en direct daarachter de versie, namelijk linvorV1.8.
Schrijven van data
Ook op de HC-06 kun je instellingen wijzigen zoals de baudrate, naam, PIN etc. Daarvoor is de opbouw van het AT commando afwijkend dan dat je eerder bij de HC-05 hebt gezien.
Voor het instellen van een waarde stuur je <AT>+<COMMANDO><WAARDE>, dus geen =-teken na het AT commando. Om bijvoorbeeld de naam in te stellen stuur je AT+NAMEVDR Electronics. Je krijgt dan de response OK en setname terug.
OKsetname
Wie dacht vervolgens het AT commando AT+NAME te sturen om de nieuw naam uit te lezen komt bedrogen uit: die functionaliteit is niet beschikbaar voor het name-commando. Je zult met een Bluetooth scanner, bijvoorbeeld je smartphone, moeten scannen naar nieuwe devices en dan zul je zien dat de HC-06 een nieuw naam heeft gekregen.
Foutmeldingen
Als je een verkeerd AT commando stuurt, of een verkeerde parameter meestuurt, dan krijg je van de HC-06 module geen feedback. Ga er maar van uit dat een AT commando alleen goed verwerkt is als je OK terugkrijgt.