• 注册
    • 查看作者
    • ESP8266连接,并通过蓝牙发送命令无线控制LED。

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

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

      需要的组件

      ●    NodeMCU ESP8266

      ●    HC-05蓝牙模块

      ●    Arduino IDE

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

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

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

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

      HC-05蓝牙模块

      它可以使用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是否已正确供电。

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

      编程NodeMCU ESP8266来连接蓝牙模块

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

      首先,包括Software Serial库,

      #include <SoftwareSerial.h>

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

      SoftwareSerial btSerial(D2, D3); // RX,
      int led = D4;

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

      Serial.begin(9600);
      btSerial.begin(9600);
      pinMode(D4, OUTPUT);
      Serial.println("Started...");

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

      if (btSerial.available() > 0) {
          char data = btSerial.read();
          switch (data)
          {
            case 'B':
              ledB = "blink";
              break;
            case 'S':
              ledB = "stop";
              break;
            default:
              break;
          }
        }

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

      if (ledB == "blink") {
          Serial.println("blinking started");
          if (currentMillis - previousMillis >= interval) {
            previousMillis = currentMillis;
            if (ledState == LOW) {
              ledState = HIGH;
            } else {
              ledState = LOW;
            }
            digitalWrite(led, ledState);
          }
        }

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

      代码

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

      /* HC-05 interfacing with NodeMCU ESP8266
      */
      #include <SoftwareSerial.h>
      
      SoftwareSerial btSerial(D2, D3); // Rx,Tx
      int led = D4;   // led also the internal led of NodemCU
      int ledState = LOW;   // led state to toggle
      String ledB = "";
      
      unsigned long previousMillis = 0;  // millis instaed of delay
      const long interval = 500;  // blink after ecery 500ms
      
      void setup() {
       delay(1000);
       Serial.begin(9600);     
       btSerial.begin(9600);     // bluetooth module baudrate 
       pinMode(D4, OUTPUT);
       Serial.println("Started...");
      }
      
      void loop() {
      
       if (btSerial.available() > 0) {    // check if bluetooth module sends some data to esp8266
         char data = btSerial.read();  // read the data from HC-05
         switch (data)
         {
           case 'B':         // if receive data is 'B'
             ledB = "blink";   // write the string
             break;
           case 'S':              // if receive data is 'S'
             ledB = "stop";
             break;
           default:
             break;
         }
       }
       unsigned long currentMillis = millis();
       if (ledB == "blink") {          // if received data is 'B' the start blinking 
         Serial.println("blinking started");
         if (currentMillis - previousMillis >= interval) {
           previousMillis = currentMillis;
           if (ledState == LOW) {
             ledState = HIGH;
           } else {
             ledState = LOW;
           }
           digitalWrite(led, ledState);
         }
       }
      }

      天津
    • 0
    • 0
    • 0
    • 217
    • 单栏布局 侧栏位置: