风筝
发表于: 2019-5-17 12:00:44 | 显示全部楼层

现今,蓝牙已成为数字设备不可或缺的一部分,它内置于大多数设备中,如智能手机、笔记本电脑、PC、相机、手表、健身带等等。自从被发明以来,蓝牙一直是无线通信领域的主导协议。虽然蓝牙技术基本上是一种电缆替代系统,但它也可以桥接现有的数据网络,以及用各种配置实现多个设备的临时连接机制。


在本篇文章中,我们将HC-05蓝牙模块与流行的Wi-Fi模块ESP8266连接,并通过蓝牙发送命令无线控制LED。该LED可以由继电器和AC设备代替,以构建家庭自动化应用。


需要的组件

●    NodeMCU ESP8266

●    HC-05蓝牙模块

●    Arduino IDE

●    Serial Bluetooth Terminal(Android应用程序):监控智能手机上的蓝牙数据。

Circuit-Hardware-for-Bluetooth-Module-Interfacing-with-ESP8266.jpg


ESP8266和HC-05蓝牙模块连接电路图

将蓝牙模块HC-05与NodeMCU ESP8266连接的电路图非常简单,如下所示:

Circuit-Diagram-for-Bluetooth-Module-Interfacing-with-ESP8266.png


ESP8266需要一个外置蓝牙模块,因为它没有像ESP32这样的内置蓝牙。 ESP32内置蓝牙低功耗(BLE)和经典蓝牙。


HC-05蓝牙模块

Bluetooth-Module-HC-05.jpg

它可以使用AT命令配置。它可以在三种不同的配置中工作(主机、从机、环回)。在我们的项目中,将它用作从机。 HC-05模块的功能包括,

●    灵敏度典型值80dBm。

●    默认波特率:9600bps,8个数据位,1个停止位,无奇偶校验。

●    自动配对密码:“1234”或“0000”默认密码。

●    它有6个引脚。

●    Vcc和Gnd引脚用于为HC-05供电。

●    Tx和Rx引脚用于与微控制器通信。

●    Enable引脚用以激活HC-05模块。当它为低电平时,模块被禁用

●    如果未与任何其他蓝牙设备配对/连接,则LED会持续闪烁。当它与任何其他蓝牙设备连接/配对时,LED会以2秒的恒定延迟闪烁。


使用串行蓝牙终端(Android App)

该应用程序很容易使用,只需要几步就可以实现。屏幕截图如下所示。只需将HC-05与智能手机配对即可。默认代码为'0000'或'1234',但大多数'1234'有效。

●    首先下载并安装应用程序,然后转到设备查找HC-05模块。选择在应用程序上搜索的HC-05模块。如果没有找到,请检查HC-05是否已正确供电。

Connect-with-Bluetooth-App-for-Interfacing-with-ESP8266.png

●    点击HC-05后,它将连接。现在在消息框中键入任何消息,然后发送。它将打印在Arduino串行监视器上。

Sending-B-for-Controlling-LED-using-Bluetooth-and-ESP8266.png


编程NodeMCU ESP8266来连接蓝牙模块

要使用ArduinoIDE对NodeMCU ESP8266进行编程,只需使用Micro USB线从笔记本电脑插入,然后打开Arduino IDE。在本文中,将使用硬件串口和软件串口。硬件串口将用于向Arduino 串口监视器读取和写入数据,而软件串口将用于与HC-05通信。


首先,包括Software Serial库,

  1. #include <SoftwareSerial.h>
复制代码

定义用于软件串口通信的RX和TX引脚,还定义连接到NodeMCU的LED引脚。我们使用的是NodeMCU的内部LED,它位于Pin D4。

  1. SoftwareSerial btSerial(D2, D3); // RX,
  2. int led = D4;
复制代码

以9600波特率启动软件和硬件串口。将Led引脚设置为输出。打印一些欢迎和调试消息。

  1. Serial.begin(9600);
  2. btSerial.begin(9600);
  3. pinMode(D4, OUTPUT);
  4. Serial.println("Started...");
复制代码

首先,从蓝牙模块读取数据,并定义如果蓝牙模块从电话接收“B”,那么连接到NodeMCU的D4引脚的LED开始闪烁,否则如果它接收到“S”,则停止闪烁LED。我们这里没有使用delay()函数。

  1. if (btSerial.available() > 0) {
  2.     char data = btSerial.read();
  3.     switch (data)
  4.     {
  5.       case 'B':
  6.         ledB = "blink";
  7.         break;
  8.       case 'S':
  9.         ledB = "stop";
  10.         break;
  11.       default:
  12.         break;
  13.     }
  14.   }
复制代码

Bluetooth-Module-Interfacing-with-ESP8266.jpg


定义毫秒数,并将延迟设置为500毫秒,即LED每隔500毫秒闪烁一次。您还可以通过更改“interval”的值来配置LED延迟。

  1. if (ledB == "blink") {
  2.     Serial.println("blinking started");
  3.     if (currentMillis - previousMillis >= interval) {
  4.       previousMillis = currentMillis;
  5.       if (ledState == LOW) {
  6.         ledState = HIGH;
  7.       } else {
  8.         ledState = LOW;
  9.       }
  10.       digitalWrite(led, ledState);
  11.     }
  12.   }
复制代码

通过编程NodeMCU,我们可以使用蓝牙无线控制闪烁LED。您还可以更改程序以使用LED执行不同的任务,例如可以使用带有AC设备的继电器替换LED,以制作蓝牙家庭自动化项目。


代码

本文使用的完整代码如下所示:

  1. /* HC-05 interfacing with NodeMCU ESP8266
  2. */
  3. #include <SoftwareSerial.h>

  4. SoftwareSerial btSerial(D2, D3); // Rx,Tx
  5. int led = D4;   // led also the internal led of NodemCU
  6. int ledState = LOW;   // led state to toggle
  7. String ledB = "";

  8. unsigned long previousMillis = 0;  // millis instaed of delay
  9. const long interval = 500;  // blink after ecery 500ms

  10. void setup() {
  11.   delay(1000);
  12.   Serial.begin(9600);     
  13.   btSerial.begin(9600);     // bluetooth module baudrate
  14.   pinMode(D4, OUTPUT);
  15.   Serial.println("Started...");
  16. }

  17. void loop() {

  18.   if (btSerial.available() > 0) {    // check if bluetooth module sends some data to esp8266
  19.     char data = btSerial.read();  // read the data from HC-05
  20.     switch (data)
  21.     {
  22.       case 'B':         // if receive data is 'B'
  23.         ledB = "blink";   // write the string
  24.         break;
  25.       case 'S':              // if receive data is 'S'
  26.         ledB = "stop";
  27.         break;
  28.       default:
  29.         break;
  30.     }
  31.   }
  32.   unsigned long currentMillis = millis();
  33.   if (ledB == "blink") {          // if received data is 'B' the start blinking
  34.     Serial.println("blinking started");
  35.     if (currentMillis - previousMillis >= interval) {
  36.       previousMillis = currentMillis;
  37.       if (ledState == LOW) {
  38.         ledState = HIGH;
  39.       } else {
  40.         ledState = LOW;
  41.       }
  42.       digitalWrite(led, ledState);
  43.     }
  44.   }
  45. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1483



手机版|

GMT+8, 2024-5-20 14:31 , Processed in 0.050796 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表