Bird
Raised Fist0
Arduinoprogramming~10 mins

Bluetooth with HC-05/HC-06 module in Arduino - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Bluetooth with HC-05/HC-06 module
Power ON Arduino
↓
Initialize Serial
↓
Initialize Serial Bluetooth
↓
Wait for Bluetooth Connection
↓
Read Data from Bluetooth
↓
Process Data / Send Response
↓
Loop back to Read Data
The Arduino powers on, sets up serial communication with the computer and Bluetooth module, waits for Bluetooth connection, reads incoming data, processes it, and sends responses in a loop.
Execution Sample
Arduino
void setup() {
  Serial.begin(9600);
  Serial1.begin(9600); // HC-05/06
}

void loop() {
  if (Serial1.available()) {
    char c = Serial1.read();
    Serial.print(c);
  }
}
This code initializes serial communication and reads characters from the HC-05/HC-06 Bluetooth module, then prints them to the serial monitor.
Execution Table
StepActionSerial1.available()Read CharacterSerial Output
1Setup: Serial and Serial1 start at 9600 baudN/AN/AN/A
2Loop start: Check if data available from BluetoothFalseN/ANo output
3Loop start: Data arrives from BluetoothTrue'H'Print 'H'
4Loop start: Check againTrue'i'Print 'i'
5Loop start: Check againFalseN/ANo output
6Loop repeats waiting for more dataN/AN/AN/A
💡 Loop runs continuously; stops only if Arduino is powered off or reset.
Variable Tracker
VariableStartAfter Step 3After Step 4After Step 5Final
cundefined'H''i'undefinedundefined
Key Moments - 3 Insights
Why does Serial1.available() sometimes return false even if I expect data?
Serial1.available() returns true only when data has arrived and is ready to read. If no data has arrived yet, it returns false as shown in steps 2 and 5.
Why do we use Serial1 instead of Serial for the Bluetooth module?
Serial is usually connected to the USB for the computer. Serial1 is a separate hardware serial port connected to the HC-05/HC-06 module, so we use Serial1 to communicate with Bluetooth.
What happens if we don't check Serial1.available() before reading?
If we read without checking, we might get no data or garbage, causing errors. The execution table shows we only read when available is true (steps 3 and 4).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what character is read at step 4?
A'H'
B'A'
C'i'
DNo character
💡 Hint
Check the 'Read Character' column at step 4 in the execution table.
At which step does Serial1.available() return false after reading data?
AStep 5
BStep 3
CStep 4
DStep 2
💡 Hint
Look at the 'Serial1.available()' column after data has been read in the execution table.
If we remove the Serial1.available() check, what likely happens?
AProgram reads data safely
BProgram may read garbage or -1
CProgram stops running
DProgram sends data to Bluetooth
💡 Hint
Refer to the key moment about why checking Serial1.available() is important.
Concept Snapshot
Bluetooth with HC-05/HC-06 on Arduino:
- Use Serial1 for Bluetooth communication
- Initialize with Serial1.begin(9600)
- Check Serial1.available() before reading
- Read data with Serial1.read()
- Process or forward data as needed
- Loop continuously to handle incoming data
Full Transcript
This example shows how to connect an HC-05 or HC-06 Bluetooth module to an Arduino using the Serial1 port. The Arduino starts by setting up serial communication with both the computer and the Bluetooth module. In the loop, it checks if data is available from the Bluetooth module using Serial1.available(). If data is present, it reads one character with Serial1.read() and prints it to the serial monitor. This process repeats continuously, allowing the Arduino to receive and display Bluetooth data. Checking Serial1.available() is important to avoid reading when no data is present, which could cause errors. The code runs indefinitely until the Arduino is powered off or reset.

Practice

(1/5)
1. What is the main purpose of using an HC-05 or HC-06 Bluetooth module with an Arduino?
easy
A. To enable wireless serial communication between Arduino and other Bluetooth devices
B. To increase the Arduino's processing speed
C. To provide power supply to the Arduino
D. To connect Arduino to the internet via Wi-Fi

Solution

  1. Step 1: Understand the function of HC-05/HC-06 modules

    These modules are designed to allow wireless serial communication using Bluetooth technology.
  2. Step 2: Compare options with module purpose

    Only To enable wireless serial communication between Arduino and other Bluetooth devices correctly describes enabling wireless serial communication; others describe unrelated functions.
  3. Final Answer:

    To enable wireless serial communication between Arduino and other Bluetooth devices -> Option A
  4. Quick Check:

    HC-05/HC-06 = Wireless serial communication [OK]
Hint: HC-05/HC-06 = Bluetooth serial communication module [OK]
Common Mistakes:
  • Confusing Bluetooth with Wi-Fi connectivity
  • Thinking it powers the Arduino
  • Assuming it speeds up Arduino processing
2. Which of the following is the correct way to create a SoftwareSerial object for HC-05 on pins 10 (RX) and 11 (TX)?
easy
A. SoftwareSerial BT(11, 10);
B. SoftwareSerial BT(10, 11);
C. SoftwareSerial BT(9, 8);
D. SoftwareSerial BT(0, 1);

Solution

  1. Step 1: Recall SoftwareSerial constructor syntax

    The constructor is SoftwareSerial(rxPin, txPin), so RX is first, TX second.
  2. Step 2: Match pins to constructor

    Given RX=10 and TX=11, the correct call is SoftwareSerial BT(10, 11);
  3. Final Answer:

    SoftwareSerial BT(10, 11); -> Option B
  4. Quick Check:

    SoftwareSerial(rx, tx) = SoftwareSerial(10, 11) [OK]
Hint: SoftwareSerial(rxPin, txPin) order matters [OK]
Common Mistakes:
  • Swapping RX and TX pins
  • Using default hardware serial pins (0,1) for SoftwareSerial
  • Choosing pins not supported by SoftwareSerial
3. Given the code snippet below, what will be printed on the Serial Monitor if the HC-05 sends the string "Hello"?
SoftwareSerial BT(10, 11);
void setup() {
  Serial.begin(9600);
  BT.begin(9600);
}
void loop() {
  if (BT.available()) {
    char c = BT.read();
    Serial.print(c);
  }
}
medium
A. No output
B. Random characters
C. Error: BT not initialized
D. Hello

Solution

  1. Step 1: Understand data flow in code

    The code reads characters from Bluetooth (BT) and prints them to Serial Monitor.
  2. Step 2: Analyze input and output

    If HC-05 sends "Hello", BT.read() reads each character and Serial.print outputs them, so "Hello" appears.
  3. Final Answer:

    Hello -> Option D
  4. Quick Check:

    BT.read() + Serial.print = "Hello" [OK]
Hint: BT.read() prints incoming Bluetooth data directly [OK]
Common Mistakes:
  • Assuming no output without Serial.println
  • Forgetting to call BT.begin()
  • Confusing BT with Serial hardware pins
4. Identify the error in this Arduino code snippet for HC-05 communication:
SoftwareSerial BT(10, 11);
void setup() {
  Serial.begin(9600);
  BT.begin(115200);
}
void loop() {
  if (BT.available()) {
    Serial.write(BT.read());
  }
}
Assuming the HC-05 module is set to 9600 baud.
medium
A. Serial.begin is missing
B. SoftwareSerial pins are incorrect
C. BT.begin baud rate does not match HC-05 baud rate
D. BT.read() should be inside setup()

Solution

  1. Step 1: Check baud rate consistency

    HC-05 default baud is 9600, but BT.begin uses 115200, causing communication failure.
  2. Step 2: Verify other code parts

    SoftwareSerial pins and Serial.begin are correct; BT.read() is correctly placed in loop.
  3. Final Answer:

    BT.begin baud rate does not match HC-05 baud rate -> Option C
  4. Quick Check:

    Baud rates must match for communication [OK]
Hint: Match BT.begin baud with HC-05 baud rate [OK]
Common Mistakes:
  • Using different baud rates between Arduino and HC-05
  • Placing BT.read() in setup() instead of loop()
  • Confusing Serial and SoftwareSerial pins
5. You want to send the string "LED ON" from your phone to Arduino via HC-05. The Arduino should turn on an LED connected to pin 13 when it receives this exact string. Which code snippet correctly implements this behavior?
hard
A. SoftwareSerial BT(10, 11); String input = ""; void setup() { pinMode(13, OUTPUT); Serial.begin(9600); BT.begin(9600); } void loop() { while (BT.available()) { char c = BT.read(); input += c; } if (input == "LED ON") { digitalWrite(13, HIGH); input = ""; } }
B. SoftwareSerial BT(10, 11); void setup() { pinMode(13, OUTPUT); Serial.begin(9600); BT.begin(9600); } void loop() { if (BT.read() == 'LED ON') { digitalWrite(13, HIGH); } }
C. SoftwareSerial BT(10, 11); void setup() { pinMode(13, OUTPUT); Serial.begin(9600); BT.begin(9600); } void loop() { if (BT.available()) { digitalWrite(13, HIGH); } }
D. SoftwareSerial BT(10, 11); String input = ""; void setup() { pinMode(13, OUTPUT); Serial.begin(9600); BT.begin(9600); } void loop() { if (BT.available()) { input = BT.read(); } if (input == "LED ON") { digitalWrite(13, HIGH); } }

Solution

  1. Step 1: Collect full string from Bluetooth input

    The correct code declares a global String input = ""; and uses while (BT.available()) { char c = BT.read(); input += c; } to accumulate all available characters into the string.
  2. Step 2: Compare the full input string and control LED

    After accumulating, if (input == "LED ON") { digitalWrite(13, HIGH); input = ""; } turns on the LED and clears the input for next message.
  3. Step 3: Analyze other options

    One option incorrectly compares a single BT.read() char to 'LED ON'; another turns on the LED on if (BT.available()) without checking content; the last captures only a single char per loop with input = BT.read().
  4. Final Answer:

    The code snippet that accumulates characters into a String using while(BT.available()) -> Option A
  5. Quick Check:

    Read full input string before comparing [OK]
Hint: Build full string from BT.read() before comparing [OK]
Common Mistakes:
  • Comparing single char to full string
  • Not accumulating all characters before checking
  • Turning LED on without input check
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard