loading
UPDATES
September 4, 2013: Featured on Hackaday.com http://goo.gl/qxvWkd
September 1, 2013: Featured on DangerousPrototypes.com http://goo.gl/K4kH9g

INTRODUCTION

In this guide, I will explain how to use Arduino to change the settings of the ubiquitous HC-05 Bluetooth module using the AT command set. The HC-05 comes with a rich set of AT commands to perform various tasks such as changing the module's default settings including changing the pass code, the device name, and the baud rate. But the process of switching the HC-05 into AT command mode for first time users of the module is not straight forward and the docs takes short cuts. There are a couple of ways to do this. I have picked the one I think is the easiest  I will do my best to illustrate the process in simple to follow steps. You can find the full set of AT commands in the attached datasheet.


BACKGROUND

The HC-05 Bluetooth module and its siblings are by far the most popular and inexpensive Bluetooth modules used for RF communications by microcontroller hackers. It costs less than $10 on ebay and it's easy to implement. I have published two guides based on the HC-05 Bluetooth module.  The first guide explains how to use the HC-05 with the Arduino. The second is an Android app that simplifies controlling Arduino from your smart phone over Bluetooth using the HC-05. In both cases, the default settings for the HC-05 were fine. 

In the process of using the HC-05 for a project, I ran into a situation where I needed to change the defaults for the module. For example, the default baud rate on the HC-05 is 9600. That's slow for high-speed transmission. The HC-05 can go as high as 1382400 baud rate according to the HC-05 reference. Also, the HC-05 has a default device name of HC-05. Having two or more of those devices in the same area can be confusing. You can use an AT command to change the device name. Also, the pin code default is 1234. You may wish to change that for some projects to ensure basic security.

After spending some time searching the web I realized many people are having a hard time changing the default settings for the HC-05. Switching the HC-05 from data transmission mode to configuration mode, to send AT commands to the HC-05, involves a few wiring and software acrobatics.  Add to the mix all the variations of the HC Bluetooth module family and the various vendor settings and you get the picture. 

This guide only covers the HC-05 module with the breakout board. 

WARNING

The HC-05 is a 3.3V system but the breakout board offers current limiting resistors for some protection. While it's not advisable to keep the HC-05 connected to the 5V Arduino Uno pins, for this short exercise I decided to skip the voltage dividers which I use to drop 5V to 3.3V. I advise you to use voltage dividers whenever you connect the HC-05 pins to  5V pins such as the Arduino Uno. If you skip the voltage divider, do so at your own risk.

Step 1: Components & Wiring

I have tested this guide with the following:

PARTS
WIRING
  • HC-05 GND --- Arduino GND Pin
  • HC-05 VCC (5V) --- Arduino 5V
  • HC-05 TX --- Arduino Pin 10 (soft RX)
  • HC-05 RX --- Arduino Pin11 (soft TX)
  • HC-05 Key (PIN 34) --- Arduino Pin 9

<p>Hi, I'm working with the arduino Due and SoftwareSerial doesn't work. I'm not that great with the coding, so could you help me out?</p>
I connected hc05 module with arduino uno board with connections as- <br>G<br>HC-05 GND --- Arduino GND Pin<br>HC-05 VCC (5V) --- Arduino 5V<br>HC-05 TX --- Arduino Pin 10 (soft RX)<br>HC-05 RX --- Arduino Pin11 (soft TX)<br>HC-05 Key (PIN 34) --- Arduino Pin 9<br>After connecting i m getting rapid blinking of led on hc 05 module but unable to connect with any app on ios neither AT command is getting any response on serial port.<br>Suggest how to connect hc05 with arduino uno and how to use it on ios mobile app
<p>If it has a small button above the EN/KEY/WAKE UP pin, disconnected Vcc, press and hold that button, connect Vcc and it the LED in the module should blink slowly and allow you to enter AT codes.</p><p>Regards,</p>
<p>This worked for me too. Also, after getting the LED to blink slowly, press the Reset button on the Arduino. Exact steps that seem to always work: </p><p>1. Unplug power from HC-05</p><p>2. Upload sketch from this Instructable</p><p>3. Hold in HC-05 button</p><p>4. Reconnect power to HC-05 (wait until LED blinks slowly)</p><p>5. Press Arduino reset button</p><p>6. Open Serial Monitor</p><p>7. Make sure &quot;Both NL &amp; CR&quot; is selected</p><p>8. Type AT commands</p><p>We had 3 people in a workshop this evening and when everyone followed this procedure it always worked. </p>
<p>that worked perfectly</p><p>thanks</p>
<p>pin 34 cannot be connected directly to Arduino PIN 9, use level converter from 5 volts to 3.3 and vice versa or simply use two 1 K ohm resistors between PIN 9 and VSS and connect pin 34 inbetween </p>
<p>Hi, instead of your pinout I have:</p><p>state, rxd, txd, gnd, vcc, en</p><p>Is the &quot;en&quot; pin seme as &quot;key&quot; pin? The &quot;state&quot; and &quot;en&quot; pins haven't got pins to connect to breadboard (there are only 4 pins, but other 2 are marked amd seem like they're ready to be soldered to pins, they have holes).<br>Sorry for my english and thanks for answer!</p>
<p>u got output using that bluetooth module ?</p>
<p>Like on this picture: <a href="http://www.martyncurrey.com/wp-content/uploads/2014/10/HC-06_zs-040_01_1200.jpg" rel="nofollow">http://www.martyncurrey.com/wp-content/uploads/2014/10/HC-06_zs-040_01_1200.jpg</a></p>
<p>Instead of getting an OK after typing AT in the serial monitor, I am getting the following output. Please someone tell me the reason</p>
<p>that my be due to mismatch of buad rate </p>
<p>//Correction :</p><p>#include&lt;SoftwareSerial.h&gt;</p><p>SoftwareSerial BTSerial(10,11);</p><p>String HC05_Responce=&quot;&quot;;</p><p>void setup(){</p><p> pinMode(9,OUTPUT);</p><p> digitalWrite(9,HIGH);</p><p> Serial.begin(9600);</p><p> Serial.println(&quot;Enter AT command:&quot;);</p><p> BTSerial.begin(38400);</p><p>}</p><p>void loop(){</p><p> if(BTSerial.available())</p><p> Serial.write(BTSerial.read());</p><p> if(Serial.available())</p><p> BTSerial.write(Serial.read());</p><p>}</p>
<p>HELLO KJOHARI21</p><p>Instead of no line ending drop the menu down and select &quot;Both NL &amp; CR&quot;</p><p>and try again.</p><p>cheers ;)</p>
<p>HiKjohari21, il think you have to select &quot;both line feed and carriage return&quot; in the serial monitor and it will work.</p><p>Regards.</p>
<p>If there is anyone still struggling out there, I made another instructable detailing how to use this modules in master, and slave mode. It is meant to explain how to get each model into AT mode, and then, to get them working with code.</p><p>http://www.instructables.com/id/Arduino-Bluetooth-Master-and-Slave-Using-Any-HC-05/</p>
<p>Hello to everyone.I have make a bleutooth robot which i can control it via android(tablet) and i have a problem with the code.I want from the robot to stop when connection lost or bluetooth disconnected.Now when the connection lost the robot go ahead and falls on the objects.How to add this line on the code?Can you help me please?The STATE pin of HC-05 when is HIGH is connected and when is LOW is disconnected.I put this on my code but it doesn't stop.Thank you for your time</p><p><br>The bluetooth that i use is HC-05<br><br>My code:<br><br>#include &lt;Servo.h&gt;<br><br>Servo SERVO_1; // Initialize Servo1<br><br>// Motor Control Variables<br>int PWM1 = 9;<br>int ENABLE1 = 8;<br>int PWM2 = 5;<br>int ENABLE2 = 7;<br>int PWM3 = 3;<br>int ENABLE3 = 4;<br>int PWM4 = 6;<br>int ENABLE4 = 12;<br>int STATE=2;<br><br><br>void setup() {<br> SERVO_1.attach(10);<br> Serial.begin(9600);<br> pinMode(ENABLE1, OUTPUT); //&Delta;ή&lambda;&omega;&sigma;&eta; ό&lambda;&omega;&nu; &tau;&omega;&nu; &mu;&epsilon;&tau;&alpha;&beta;&lambda;&eta;&tau;ώ&nu; &omega;&sigmaf; έ&xi;&omicron;&delta;&omicron;&sigmaf;<br> pinMode(ENABLE2, OUTPUT); //&Delta;ή&lambda;&omega;&sigma;&eta; ό&lambda;&omega;&nu; &tau;&omega;&nu; &mu;&epsilon;&tau;&alpha;&beta;&lambda;&eta;&tau;ώ&nu; &omega;&sigmaf; έ&xi;&omicron;&delta;&omicron;&sigmaf;<br> pinMode(ENABLE3, OUTPUT); //&Delta;ή&lambda;&omega;&sigma;&eta; ό&lambda;&omega;&nu; &tau;&omega;&nu; &mu;&epsilon;&tau;&alpha;&beta;&lambda;&eta;&tau;ώ&nu; &omega;&sigmaf; έ&xi;&omicron;&delta;&omicron;&sigmaf;<br> pinMode(ENABLE4, OUTPUT); //&Delta;ή&lambda;&omega;&sigma;&eta; ό&lambda;&omega;&nu; &tau;&omega;&nu; &mu;&epsilon;&tau;&alpha;&beta;&lambda;&eta;&tau;ώ&nu; &omega;&sigmaf; έ&xi;&omicron;&delta;&omicron;&sigmaf;<br> pinMode(STATE, INPUT);<br>}<br><br>void loop() {<br><br> if(digitalRead(STATE)== HIGH)<br><br> // see if there's incoming serial data:<br> if (Serial.available() &gt; 0) {<br> // read the oldest byte in the serial buffer:<br> int incomingByte = Serial.read();<br> // action depending on the instruction<br> // as well as sending a confirmation back to the app<br> switch (incomingByte) {<br> case 'F':<br> moveForward();<br> Serial.println(&quot;Going forward&quot;);<br> break;<br> case 'L' : // Case 'L' is received,<br> SERVO_1.write (180); // &Sigma;&tau;&rho;ί&psi;&epsilon; &Alpha;&rho;&iota;&sigma;&tau;&epsilon;&rho;ά.<br> SERVO_1.attach(10);<br> break;<br> case 'N':<br> turnright();<br> Serial.println(&quot;Turning right&quot;);<br> break;<br> case 'M':<br> turnleft();<br> Serial.println(&quot;Turning left&quot;);<br> break;<br> case 'O' : // Case 'L' is received,<br> SERVO_1.write (0); // &Sigma;&tau;&rho;ί&psi;&epsilon; &Alpha;&rho;&iota;&sigma;&tau;&epsilon;&rho;ά.<br> SERVO_1.attach(10);<br> break;<br> case 'B':<br> moveBackward();<br> Serial.println(&quot;Going forward&quot;);<br> break;<br> case 'P':<br> SERVO_1.write(90); // &Sigma;&tau;&rho;ί&psi;&epsilon; &Alpha;&rho;&iota;&sigma;&tau;&epsilon;&rho;ά.<br> SERVO_1.attach(10);<br> break;<br> case 'S':<br> moveNone();<br> Serial.println(&quot;Stopping&quot;);<br> break;<br> default:<br> // if nothing matches, do nothing<br> break;<br> }<br> }<br>}<br><br>void moveForward() {<br> // turn the driving motor on to go forwards at set speed<br> digitalWrite(ENABLE1, HIGH);<br> digitalWrite(ENABLE2, HIGH);<br> digitalWrite(ENABLE3, HIGH);<br> digitalWrite(ENABLE4, HIGH);<br> analogWrite(PWM1, 255);<br> analogWrite(PWM2, 255);<br> analogWrite(PWM3, 255);<br> analogWrite(PWM4, 255);<br><br>}<br><br>void moveBackward() {<br> // turn the driving motor on to go backwards at set speed<br> digitalWrite(ENABLE1, LOW);<br> digitalWrite(ENABLE2, LOW);<br> digitalWrite(ENABLE3, LOW);<br> digitalWrite(ENABLE4, LOW);<br> analogWrite(PWM1, 255);<br> analogWrite(PWM2, 255);<br> analogWrite(PWM3, 255);<br> analogWrite(PWM4, 255);<br>}<br>void turnright() {<br> digitalWrite(ENABLE1, HIGH);<br> digitalWrite(ENABLE2, HIGH);<br> digitalWrite(ENABLE3, LOW);<br> digitalWrite(ENABLE4, LOW);<br> analogWrite(PWM1, 255);<br> analogWrite(PWM2, 255);<br> analogWrite(PWM3, 255);<br> analogWrite(PWM4, 255);<br>}<br><br>void turnleft() {<br> digitalWrite(ENABLE1, LOW);<br> digitalWrite(ENABLE2, LOW);<br> digitalWrite(ENABLE3, HIGH);<br> digitalWrite(ENABLE4, HIGH);<br> analogWrite(PWM1, 255);<br> analogWrite(PWM2, 255);<br> analogWrite(PWM3, 255);<br> analogWrite(PWM4, 255);<br>}<br>void moveNone() {<br> // turn the driving motor off<br> digitalWrite(ENABLE1, 0);<br> digitalWrite(ENABLE2, 0);<br> digitalWrite(ENABLE3, 0);<br> digitalWrite(ENABLE4, 0);<br> analogWrite(PWM1, 0);<br> analogWrite(PWM2, 0);<br> analogWrite(PWM3, 0);<br> analogWrite(PWM4, 0);<br> SERVO_1.detach();<br>}</p>
<p>Thanks a lot!</p>
<p>I'm encountering a problem :</p><p>I've plug my HC-05 through arduino uno, on the serial monitor it say &quot;ready for AT commands&quot;.</p><p>Then i wrote &quot;AT&quot; in the monitor but no OK answer </p><p>What Should I do ?? </p><p>Thanks</p>
<p>IM HAVING THE SAME PROBLEM</p>
<p>i want to connect HC 05 with RX65N (100 pin). i made pin 34 high HC 05 entering in command mode but it is not responding back</p><p>which register has to be connected between vcc and pin34</p>
<p>My HC-05 is already blinking slowly (every 2s), but when I send 'AT' from serial monitor, I get nothing. I use the same code in this instructable. Someone, please help me.</p>
<p>An enjoyable come across by chance on Youtube so later on in the day I worked through most of the instructable.</p>
What should I do if I receive some unreadable character<br>Plzz reply
<p>hi I just have to get data from the pin 7 of Arduino do I need to configure the hc05 ?</p><p>plzz help me the coding too </p>
<p>do i have to change the default AT setting on bluetooth to make it work with my android</p>
<p>hi there </p><p>can we connect more than 4 hc-05 in slave and one hc-05 module in master </p>
<p>Hi, thank you for this instractable...</p><p>I am very glad to explore HC05 Bluetooth.</p><p>my HC05 module doesn't have a connection to the KEY pin instead I have an ENABLE pin and a small tactile switch that is not connected to any pin.</p><p>so; I took a wire from pin 34 and put it in-between two serially connected 1 K Ohm resistors between PIN 9 &quot; Arduino&quot; and VSS. </p><p>put 3 new lines in the Arduino sketch and my sketch is as follow:</p><p>///////////////</p><p>#include &quot;SoftwareSerial.h&quot;</p><p>SoftwareSerial BTSerial(10, 11);</p><p>void setup() {<br> pinMode(8, OUTPUT); digitalWrite(8, LOW); </p><p>// connected to the VCC of the Bluetooth module</p><p><br> pinMode(9, OUTPUT); digitalWrite(9, HIGH); </p><p><br> Serial.begin(9600);<br> <br> delay(1000);<br> <br> Serial.println(&quot;Enter AT command mode&quot;);</p><p> digitalWrite(8, HIGH);<br> BTSerial.begin(38400);</p><p>}</p><p>void loop() {<br> if (BTSerial.available()) Serial.write(BTSerial.read());<br> if (Serial.available()) BTSerial.write(Serial.read());</p><p>}</p><p> /////////////////</p><p>I have one idea for this instractable; that is not to play with the wire manually; instead let Arduino do the connection for you...</p><p>and this work very well every time i upload a new sketch </p>
<p>can anyone please tell me how can i change data rate in Hc-05?</p><p>and how to change the class of device? what will happen if i change the class? whether it would affect the data rate or something?</p>
<p>AT+CLASS=&lt;Param&gt;</p>
<p>can u please tell me how to change my pin or password for my hc-05??</p>
<p>To show your password do AT+ PSWD?</p><p>And to have it changed do AT+PSWD=&lt;Param&gt;</p><p>Regards,</p>
<p>To show your password do AT+ PSWD?</p><p>And to have it changed do AT+PSWD=&lt;Param&gt;</p><p>Regards,</p>
<p>To show your password do AT+ PSWD?</p><p>And to have it changed do AT+PSWD=&lt;Param&gt;</p><p>Regards,</p>
<p>To show your password do AT+ PSWD?</p><p>And to have it changed do AT+PSWD=&lt;Param&gt;</p><p>Regards,</p>
<p>Connect Hc-05 to the Serial Monitor. then Convert the HC-05 into AT command mode. then type AT+PSWD? then press enter button(\r\n). it will reply PSWD=&quot;XXXX&quot;, then Put AT+PSWD=password. then password will set as a password.</p>
<p>Once it is in full AT mode send &quot;AT+PSWD=0000&quot; (without quotes) and don't forget to be sending the Newline and Carriage return characters after each command...</p>
<p>hi, if u having trouble in making into AT mode of HC-05 (ZS-040)(especiall if one having en/wakeup up pin instead of key pin). Follow they bellow procedure</p><p>Power off HC-05 module.</p><p>Press and hold small button above EN pin.</p><p>Power on and keep pressing small button.</p><p>Small LED should start to blink slowly about once every 2 seconds.</p><p>for more info visit below site:</p><p>http://abratukhin.blogspot.in/2015/04/connect-atmega328-with-hc-05-zs-040.html</p>
<p>Hi, what should I do if I don't have a button above the EN pin?</p>
<p>hi, if u having trouble in making into AT mode of HC-05 (ZS-040)(especiall if one having en/wakeup up pin instead of key pin). Follow they bellow procedure</p><p>Power off HC-05 module.</p><p>Press and hold small button above EN pin.</p><p>Power on and keep pressing small button.</p><p>Small LED should start to blink slowly about once every 2 seconds.</p><p>for more info visit below site:</p><p>http://abratukhin.blogspot.in/2015/04/connect-atmega328-with-hc-05-zs-040.html</p>
<p>I have followed this tutorial and others on the internet and am getting the board into AT mode and my board is responding however it is responding in absolute gibberish for example I type AT with both NL &amp; CR on and a baud rate of 9600 on the serial monitor and I get result of &Iuml;&sect;&dagger;&hellip;&yuml; or some other variation of the same code I have tried and tested playing around with different baud rates I have several different hc-05 they all give me the same I have connected the RX, TX in the schematic the way it is labelled and reversed and I am still getting no luck can anyone give me some helpful information I don't have ausb ttl converter and would prefer not to wait for one, any help would be appreciated.</p><p>Thanks in advance, <strong>Chris</strong>.</p>
<p>Hi, the fix for this is to put the module into AT mode with the user-defined baud rate, which by default is 9600. To do this, pull pin 34 high AFTER power-up instead of before. You won't have any indication of the mode change, i.e the led will continue blinking quickly whereas in the 38400 baud AT mode the led starts blinking slowly, on 2s, off 2s. I have posted an answer with code + additional info at http://forum.arduino.cc/index.php?topic=302827.msg2561221#msg2561221</p>
<p>Thank you for the link. After reading some of the suggestions I was able to get my HC-05 into AT mode just by holding the button while powering on. The LED went to the long blink and all AT commands functioned properly.</p>
<p>I am getting the same thing. Instead of the &quot;OK&quot; response I get &quot;&Iuml;&sect;†…&quot; plus two unprintable characters. Sending commands seems to work but I never really know since I don't get an understandable response.</p>
<p>i had try it but in serial monitor shows like xxxxxxx&euro;&oslash;.</p><p>also i had change all baud rates nothing happens.. im using hc-05</p>
<p>hi there, i paired up 2 hc05 master &quot;1&quot; and slave &quot;0&quot; doing this </p><p>AT commands</p><p>//SLAVE = 98d3:31:2093cb AT+ROLE=0</p><p>//MASTER= 98d3:32:204d2a AT+ROLE=1</p><p>//AT+BIND=98d3,31,2093cb</p><p>//AT+BIND=98d3,32,204d2a</p><p>The end im left with paired modules that can talk to one another now i set this in AT+UART=9600.0.0 or 38400,0,0 im not sure now but it worked out fine now in the sketch i was doing all this in terminal obvsly using the terminal baud rate which was</p><p>as follow</p><p>include SoftwareSerial.h</p><p>SoftwareSerial mySerial(10, 11); RX, TX</p><p>void setup</p><p>{ Serial.begin(38400);</p><p>pinMode(9, OUTPUT);</p><p>digitalWrite(9, HIGH);</p><p>Serial.println(&quot;Enter AT commands:&quot;);</p><p>mySerial.begin(38400);</p><p>}</p><p>so my problem is that when i try to take the 2 talking modules to use in another project im not sure but they dont communicate no more &quot;after uploading new sketch&quot; am i suppose to use the same baud rate as in the sketch (38400); or should i be using the baud that i set this 2 up to begin with when i did the whole AT+UART=9600.0.0 or 38400,0,0 ???</p><p>i was assuming what i have now when they were talking was a wireless RS232/terminal right? if so then all i have to do is make sure in the loop of what ever other program i go to use this modules on that they talk to that SoftwareSerial mySerial or something like this</p><p>void loop()</p><p>{</p><p>if (mySerial.available())</p><p>mySerial.write(&quot;Variable or Array here&quot;);</p>
<p>didnt had success with this setup. Seems like I couldnt work out the right combination of baud rate and return characters (which are 38400 and cr+lf for my cz-hc-05). However, I hooked up the hc-05 directly to my usb ftdi dongle and it worked perfectly with a random serial terminal program. (had a 3.3 voltage regulator for the key pin but dont know if thats necessary).</p>
<p>Dear Hazim, thank you for this very useful application. I have an EN pin instead of KEY pin on my HC05 and it does not seem to be connected to PIO11 (Pin34) (I have checked it with an AVO. Do you think short circuiting the EN pin with Pin34 will solve the problem?</p><p>My second question is, how can I pair the HC05 connected to an Arduino uno with an HC06 connected to an ATTiny 85?</p><p>Cheers.</p>
<p>Dear friend, </p><p>In my Hc-05 have tiny push button to put AT mode.</p><p>what i doing to put configure mode</p><p>1) disconnect power pin.</p><p>2) press the tiny push button</p><p>3) same time connect the power.</p><p>Done. </p>
<p>:D I always wonder about that button</p>
<p>Thanks. This was very helpful. Have been trying and suspected that the pushbutton had something to do with it.</p>

About This Instructable

519,245views

364favorites

License:

Bio: Did I unplug the solder iron?
More by techbitar:IR Remote Control Station for Android - TURN THE TV DOWN SensoDuino: Turn Your Android Phone into a Wireless Sensors Hub for Arduino Modify The HC-05 Bluetooth Module Defaults Using AT Commands 
Add instructable to: