Bluetooth HC-05 to świetny moduł umożliwiający komunikację w obie strony z innym modułem albo z telefonem czy tabletem wykorzystującym komunikację BT. Aby przygotować moduł do transmisji musimy ustawić go tak, by przyjmował komendy AT. Poniżej pokazuję jak to zrobić wykorzystując niezawodne Arduino Uno.
Komendy AT
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX Arduino
//SoftwareSerial mySerial(D2, D3); // RX, TX ESP8266
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println("Wpisz komendy AT:");
mySerial.begin(38400); // szybkość transmisji dla AT
}
void loop()
{
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}
Wgrywamy program do Arduino Uno:
Podłączamy moduł HC-05 do Arduino w następujący sposób:
HC-05 | Arduino | ESP8266 |
VCC | +5V | +5V |
GND | GND | GND |
TX (przez konwerter) | PIN 10 ( RX ) | D2 (RX) |
RX (przez konwerter) | PIN 11 ( TX ) | D3 (TX) |
Podczas podłączenia zasilania do modułu należy przytrzymać przycisk znajdujący się przy pinach. Wówczas dioda zacznie migać z mniejszą częstotliwością. To oznacza wejście w stan umożliwiający konfigurację AT.
Otwieramy monitor portu szeregowego w Arduino IDE i wpisujemy komendę “AT” i wciskamy ENTER. Należy pamiętać, żeby ustawić opcję “Both NL & CR” i “Autoscroll”.
Jeśli wszystko działa poprawnie, powinniśmy otrzymać w oknie odpowiedź “OK”
KILKA UWAG!
Jeden z moich modułów reagował na małe litery komend inny nie. Lepiej pisać komendy AT WIELKIMI LITERAMI.
Niektóre komendy wymagają dodatkowego działania aby się wyświetlały. Jeden z modułów nie chciał wyświetlać nazwy “AT+NAME?”, dopiero jednoczesne wciśnięcie przycisku (tego samego, który wprowadza w tryb AT) spowodowało, że nazwa pojawiła się na monitorze portu szeregowego Arduino IDE.
Inne komendy AT:
Pełen zestaw komend AT dla modułu HC-05
Android i HC-05. Komunikacja w obie strony.
Duże podziękowania ElektroPrzewodnikowi za świetny film instruktażowy na YouTube.
Podłączenie:
I kod programu.
/*
* Program, który lekko zmieniłem
* napisał ElektroPrzewodnik
* https://youtu.be/8DOg8onUvks
*/
void setup() {
Serial.begin(9600);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
}
char cmd[100];
char cmdIndex;
boolean prz1, prz2, prz1_old, prz2_old = true;
void exeCmd() {
if (cmd[0] == 's') {
unsigned int val = atol(cmd + 2);
Serial.println(val);
}
}
void loop() {
if (Serial.available() > 0)
{
char c = (char)Serial.read();
if (c == '\n') {
cmd[cmdIndex] = 0;
exeCmd();
cmdIndex = 0;
} else {
cmd[cmdIndex] = c;
if (cmdIndex < 99) cmdIndex++;
}
}
prz1 = digitalRead(8);
prz2 = digitalRead(9);
if (prz1 != prz1_old)
{
prz1_old = prz1;
if (prz1)
Serial.println("led1 0\n");
else
Serial.println("led1 1\n");
}
if (prz2 != prz2_old)
{
prz2_old = prz2;
if (prz2)
Serial.println("led2 0\n");
else
Serial.println("led2 1\n");
}
}
Pamiętamy żeby przy ładowaniu programu odłączyć RX .
Aplikacja na Arduino to RoboRemoFree
HC-05 i ESP8266
KOD
#include <SoftwareSerial.h>
SoftwareSerial SerialBT(D2, D3); // RX, TX
void setup() {
Serial.begin(38400);
SerialBT.begin(38400);
Serial.println("The device started, now you can pair it with bluetooth!");
}
void loop() {
if (Serial.available()) {
SerialBT.write(Serial.read());
}
if (SerialBT.available()) {
Serial.write(SerialBT.read());
}
delay(20);
}
ESP8266 z HC-05 łączymy jak pokazałem w tabelce. Moje moduły są na VCC = 5V. Oczywiście nie potrzeba konwertorów, bo logika pinów ESP8266 działa na 3.3V, co jest bardzo przyjemne w tym wypadku. Kod powyżej umożliwia konwersację w obie strony na przykład z programem Serial Bluetooth Terminal na Androidzie. Pamiętać należy, by dla szeregowego monitora Arduino ustawić szybkość transmisji na 38400. Jak też dla transmisji modułu HC-05. Inaczej zobaczymy krzaczki.
HC-05 i ESP32
ESP32 jak wiemy ma wbudowany moduł BT. Jeśli użyjemy klasycznej jego formy (takiej jak HC-05) program kontaktujący się z Serial Bluetooth Terminal będzie banalnie prosty:
//This example code is in the Public Domain (or CC0 licensed, at your option.)
//By Evandro Copercini - 2018
//
//This example creates a bridge between Serial and Classical Bluetooth (SPP)
//and also demonstrate that SerialBT have the same functionalities of a normal Serial
//#include "BluetoothSerial.h"
//
//#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
//#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
//#endif
//
//BluetoothSerial SerialBT;
void setup() {
Serial.begin(115200);
//SerialBT.begin("ESP32test"); //Bluetooth device name
Serial.println("The device started, now you can pair it with bluetooth!");
}
void loop() {
if (Serial.available()) {
SerialBT.write(Serial.read());
}
// if (SerialBT.available()) {
// Serial.write(SerialBT.read());
// }
delay(20);
}
Pingback:Bluetooth, parowanie HC-05 – Arduino dla strasznych lamerów