像HC-05和HC-06这样的蓝牙模块很容易设置,并且可以在Arduino IDE上快速使用,但它们有自己的限制,如高功耗,并且它们在旧的蓝牙V2.0上运行。此外,最近我给自己买了一个新的ESP32 开发套件,这些模块具有内置Wi-Fi 和蓝牙、充足的 ADC 和 DAC 引脚、音频支持、SD 卡支持、深度睡眠模式等功能,它几乎具备构建物联网项目所需的一切。
正如任何业余爱好者都会喜欢它一样,ESP32 现在也得到了 Arduino IDE 的正式支持。早些时候,我们必须对尼尔·科尔班斯库做一个巨大的解决方法,但现在由于这个家伙的辛勤工作,用Arduino IDE编程ESP32已经成为一个蛋糕。因此,我启动了我的Arduino IDE,并深入研究了几个示例BLE程序,通过这些程序我一无所知。经过长时间的冲浪和推拢,我意识到,如果您必须使用 ESP32 使用低功耗蓝牙 (BLE),还有很多事情需要了解。我决定在单独的文章中介绍 BLE,因此在这里我们将使用 ESP32 的经典串行蓝牙来切换使用智能手机的 LED。
ESP32 蓝牙入门
我想尝试的第一个程序是一个简单的程序,使用它可以打开或关闭手机蓝牙终端应用程序中的LED,就像旧的HC-05天一样。但事实证明,蓝牙低功耗(BLE)并没有因此而缩进。我还发现 ESP32 模块中有两种类型的蓝牙,一种是经典蓝牙,另一种是BLE蓝牙低功耗。好吧,但是为什么呢?....为什么我们有两种类型的蓝牙,我应该为我的项目使用什么?
了解低功耗蓝牙 (BLE) 和 ESP32 经典蓝牙
顾名思义,低功耗蓝牙比经典蓝牙消耗更少的功率。它是通过根据需要通过预定义的定期更新发送数据来实现的。但与传统蓝牙不同,它不用于传输文件或音乐。你有没有想过你的手机如何自动识别你刚刚配对的蓝牙设备是音频设备或笔记本电脑或手机,你可能还看到无线音频播放器或健身乐队的电池电量自动显示在手机的状态栏中;所有这些都可以通过BLE设备的特性来实现。BLE设备可与蓝牙V4.0配合使用,并且可以作为服务器或客户端以低功耗运行,这使得BLE成为信标,智能手表,健身手环等的理想选择。
另一方面,经典蓝牙只是我们用来传输文件和其他数据的简单普通的旧蓝牙。几乎所有BLE设备都具有与之关联的经典蓝牙功能。HC-05等模块中使用的蓝牙是经典蓝牙的一个版本,称为蓝牙SSP(串行端口协议),这意味着蓝牙遵循标准串行协议,这使得发送和接收数据变得更加容易,没有太多开销。在本教程结束时,我们将学习如何在 ESP32 中使用串行蓝牙功能。
在本文中,我们将使用 ESP32 上的串行蓝牙功能将其与智能手机配对,并使用 Play 商店中任何现有的蓝牙终端应用程序向 ESP32 发送命令,并相应地切换板载 LED。
在后面的文章中,我们将介绍 ESP32 BLE 作为服务器和客户端。BLE服务器通常用于将BLE数据发送到其他蓝牙设备,BLE客户端用于扫描其他BLE设备,从而充当信标。
正在为 ESP32 准备Arduino IDE
请注意,默认情况下,Arduino IDE 不支持 ESP32 板;您必须使用主板管理器下载并安装它们。如果这是您使用 ESP32 的第一个程序,请按照此入门教程将 ESP32 开发板添加到 Arduino 并上传测试草图。
此外,您可以使用 ESP32 完成更多项目,而无需使用任何微控制器。
适用于 ESP32 的串行蓝牙程序
本页末尾提供了使用 ESP32 蓝牙切换 LED的完整程序。在此标题下,让我们将代码分解为小片段并尝试理解它们。如果您已经使用过其他蓝牙模块,如 HC-05,那么您会发现这个ESP32 蓝牙经典示例程序非常相似。
该程序的想法是使用 ESP32 初始化串行蓝牙连接,并侦听来自配对设备的数据。如果传入的数据是“1”,那么我们打开LED,如果是“0”,我们应该关闭LED。我们通过添加头文件蓝牙序列开始我们的程序,这使得 ESP32 蓝牙可以作为蓝牙 SSP 工作。
#include "BluetoothSerial.h" //Header File for Serial Bluetooth, will be added by default into Arduino
这个库背后有很多事情在发生,但我们选择不深入研究它以保持简单。我们需要的下一件事是蓝牙相关操作的对象。在这里,我把我的名字命名为ESP_BT,但你可以选择任何名字。
BluetoothSerial ESP_BT; //Object for Bluetooth
接下来,在空隙设置()函数内部。我们以波特率9600开始串行通信,并使用名称初始化蓝牙信号。在这里,我将其命名为“ESP32_LED_Control”,这将是我们的手机在尝试配对时可以找到的名称。最后,我将内置LED引脚声明为输出引脚,因为我们将根据蓝牙信号切换它。
void setup() {
Serial.begin(9600); //Start Serial monitor in 9600
ESP_BT.begin("ESP32_LED_Control"); //Name of your Bluetooth Signal
Serial.println("Bluetooth Device is Ready to Pair");
pinMode (LED_BUILTIN, OUTPUT);//Specify that LED pin is output
}
在无限空洞循环函数中,我们检查是否有任何数据来自蓝牙模块,如果是,则读取数据并将其存储在传入变量中。我们还在串行监视器上打印此值,只是为了交叉检查Arduino正在接收的内容。
if (ESP_BT.available()) //Check if we receive anything from Bluetooth
{
incoming = ESP_BT.read(); //Read what we recevive
Serial.print("Received:"); Serial.println(incoming);
现在,接收到的任何数据都存储在传入的变量中,因此我们可以直接将此变量与预期值进行比较并执行所需的操作。但是从蓝牙发送的值将采用字符形式,Arduino 将读取从手机发送的字符的十进制值。在我们的例子中,对于字符“0”,十进制值将为48,对于字符“1”,十进制值将为49。您可以参考 ASCII 图表来了解每个字符的十进制值。
在这里,我们将传入变量与 48 和 49 进行了比较,以分别检查 0 和 1。如果是1,那么我们关闭LED,并将确认消息打印回蓝牙,说LED已关闭,反之亦然。
if (incoming == 49)
{
digitalWrite(LED_BUILTIN, HIGH);
ESP_BT.println("LED turned ON");
}
if (incoming == 48)
{
digitalWrite(LED_BUILTIN, LOW);
ESP_BT.println("LED turned OFF");
}
使用 ESP32 测试串行蓝牙
将 ESP 连接到 Arduino IDE,然后选择正确的电路板和端口,如入门教程中所述。因为它是一个3断续器方板管理器 编译和上传代码可能需要更长的时间。上传后,启动串行监视器(仅用于调试)并打开手机上的蓝牙设置。您应该找到一个名为ESP32_LED_Control配对的蓝牙设备。
现在,您可以在智能手机上打开任何蓝牙终端应用程序,我正在使用从Google应用商店下载的名为“蓝牙终端”的应用程序。将蓝牙应用程序连接到我们刚刚配对的设备,然后键入1并按发送。
ESP32 模块应按照我们的程序接收并打开 LED,并向您发送确认消息,指出 LED 已打开,如上图所示。您还可以检查串行监视器,它将以十进制格式显示 ESP32 蓝牙接收的数据,即 Arduino 将按 48 表示 0 和 49 表示 1,如前所述。我的终端窗口的快照如下所示。
同样,您还应该能够通过从移动应用程序发送0来关闭LED。
/*Program to control LED (ON/OFF) from ESP32 using Serial Bluetooth
* Thanks to Neil Kolbans for his efoorts in adding the support to Arduino IDE
* Turotial on: www.circuitdigest.com
*/
#include "BluetoothSerial.h" //Header File for Serial Bluetooth, will be added by default into Arduino
BluetoothSerial ESP_BT; //Object for Bluetooth
int incoming;
int LED_BUILTIN = 2;
void setup() {
Serial.begin(9600); //Start Serial monitor in 9600
ESP_BT.begin("ESP32_LED_Control"); //Name of your Bluetooth Signal
Serial.println("Bluetooth Device is Ready to Pair");
pinMode (LED_BUILTIN, OUTPUT);//Specify that LED pin is output
}
void loop() {
if (ESP_BT.available()) //Check if we receive anything from Bluetooth
{
incoming = ESP_BT.read(); //Read what we recevive
Serial.print("Received:"); Serial.println(incoming);
if (incoming == 49)
{
digitalWrite(LED_BUILTIN, HIGH);
ESP_BT.println("LED turned ON");
}
if (incoming == 48)
{
digitalWrite(LED_BUILTIN, LOW);
ESP_BT.println("LED turned OFF");
}
}
delay(20);
}
全部0条评论
快来发表一下你的评论吧 !