一进入家门就自动开灯,离开时又关掉灯,这是多么酷啊!是的,一个简单的应用程序可以为您做到这一点。在这个项目中,我们将 ESP32 用作 BLE 客户端,将健身手环用作 BLE 服务器,因此,每当佩戴健身手环的人进入 ESP32 蓝牙范围内时,ESP32 都会检测到它并打开灯。任何具有 BLE 服务器功能的蓝牙设备都可以用作触发设备,以使用 ESP32 控制任何家用电器。
我们将对 ESP32 进行编程,使其充当 BLE 客户端,并不断扫描 BLE 设备;如果我们在范围内找到健身带,我们将尝试连接到它,如果连接成功,我们可以通过切换ESP32上的一个GPIO引脚来触发灯泡。该方法是可靠的,因为每个BLE服务器(健身带)将具有唯一的硬件ID,因此没有两个BLE服务器设备是相同的。有趣的对吧?!!!现在,让我们开始构建:
所需材料
ESP32 开发板
交流负载(灯)
继电器模块
硬件
这个 ESP32 BLE 客户端项目的硬件非常简单,因为大多数魔术都发生在代码内部。ESP32 必须在发现或丢失蓝牙信号时切换交流灯(负载)。要切换此负载,我们将使用继电器,由于 ESP32 的 GPIO 引脚仅兼容 3.3V,我们需要一个可以用 3.3V 驱动的继电器模块。只需检查继电器模块中使用的晶体管,如果它是BC548,你就可以按照下面的电路图建立自己的电路。
警告:该电路直接处理220V交流电源电压。小心带电电线,并确保不会产生短路。你已被警告。
使用BC548而不是BC547或2N2222的原因是它们具有低基极发射极电压,仅可在3.3V下触发。这里使用的继电器是5V继电器,因此我们使用Vin引脚为其供电,该引脚从电源线中获得5V。接地引脚连接到电路的接地。电阻 R1 1K 用作基极电流限制器电阻。相线连接到继电器的NO引脚,继电器的共引脚连接到负载,负载的另一端连接到中性线。您可以交换相位和中性的位置,但请注意不要直接做空它们。电流应始终通过负载(灯泡)。我使用了一个继电器模块来保持简单,这里的负载是焦点LED灯。我的设置如下所示
如果您现在想跳过硬件,可以使用 GPIO 2 引脚而不是 GPIO 13 引脚来切换 ESP32 上的板载 LED。建议初学者使用此方法。
获取服务器的蓝牙地址(健身手环的地址)
如前所述,我们将对 ESP32 进行编程,使其充当客户端(类似于电话)并连接到我的健身手环(联想 HW-01)的服务器。对于连接到服务器的客户端,它必须知道服务器的蓝牙地址。每个蓝牙服务器,就像我的健身手环一样,都有自己独特的蓝牙地址,这是永久性的。您可以将此与笔记本电脑或手机的 MAC 地址相关联。
为了从服务器中获取此地址,我们使用称为nRF的应用程序从北欧半导体连接,我们已经在上一个教程中使用过。它免费提供给IOS和安卓用户。只需下载,启动应用程序并扫描附近的蓝牙设备。该应用程序将列出它找到的所有BLE设备。我的命名为HW-01,只需查看其名称下方,您就会发现服务器的硬件地址,如下所示。
所以我的健身手环的 ESP32 BLE 硬件地址是 C7:F0:69:F0:68:81,您将拥有一组相同格式的不同数字。只需记下它,因为我们在编程ESP32时需要它。
获取服务器的服务和特征 UUID
好的,现在我们已经使用BLE地址标识了我们的服务器,但是为了与之通信,我们需要说服务语言和特征,如果您阅读了上一个教程,您将理解这一点。在本教程中,我将使用我的服务器的写入特征(健身带)与它配对。因此,为了与设备配对,我们需要服务广告特征UUID,我们可以使用相同的应用程序再次获得它。
只需单击应用程序上的“连接”按钮并搜索一些写入特征,应用程序将显示服务 UUID 和特征 UUID。我的如下所示
在这里,我的服务 UUID 和特征 UUID 是相同的,但它不必相同。记下服务器的 UUID。我的被记录下来
Service UUID:
0000fee7-0000-1000-8000-00805f9b34fb
Characteristic
UUID: 0000fee7-0000-1000-8000-00805f9b34fb
使用写入特性不是强制性的;您可以使用应用程序中显示的服务器的任何有效服务和特征 UUID。
对 ESP32 进行编程,使其充当邻近感应开关应用的客户端
该程序的理念是使 ESP32 充当客户端,在找到我们的服务器(健身带)时不断扫描蓝牙设备,验证硬件 ID,并通过 GPIO 引脚 13 切换指示灯。好吧!!,但有一个问题。所有BLE服务器的射程均为10米,这有点太多了。因此,如果我们试图使接近开关打开打开一扇门的灯,这个范围非常高。
要缩小BLE服务器的范围,我们可以使用配对选项。仅当 BLE 服务器和客户端的距离在 3-4 米以内时,两者才会保持配对状态。这非常适合我们的应用。因此,我们制造 ESP32 不仅是为了发现 BLE 服务器,也是为了连接到它并确保它是否保持配对状态。 本页末尾提供了完整的 ESP32 BLE 示例程序来执行相同的操作。下面,我将代码分解成小片段并尝试解释它们。
在包含头文件后,我们通知 ESP32 我们通过 nRF 连接应用程序获得的 BLE 地址、服务和特征 UUID,如上面的标题中所述。代码如下所示
static BLEUUID serviceUUID("0000fee7-0000-1000-8000-00805f9b34fb"); //Service UUID of fitnessband obtained through nRF connect application
static BLEUUID charUUID("0000fee7-0000-1000-8000-00805f9b34fb"); //Characteristic UUID of fitnessband obtained through nRF connect application
String My_BLE_Address = "c7:f0:69:f0:68:81"; //Hardware Bluetooth MAC of my fitnessband, will vary for every band obtained through nRF connect application
其次,在程序中,我们有连接到服务器和我的广告服务回拨,我们稍后将返回。然后在设置函数内部,我们初始化串行监视器,并使ESP上的BLE扫描设备。扫描完成后,发现每个BLE设备,就会调用“我的广告设备”回调功能。
我们还支持主动扫描,因为我们使用主电源为 ESP32 供电,对于电池应用,它已关闭以降低电流消耗。继电器触发引脚在我们的硬件中连接到GPIO 13,因此我们也声明GPIO引脚13为输出。
void setup() {
Serial.begin(115200); //Start serial monitor
Serial.println("ESP32 BLE Server program"); //Intro message
BLEDevice::init("");
pBLEScan = BLEDevice::getScan(); //create new scan
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); //Call the class that is defined above
pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
pinMode (13,OUTPUT); //Declare the in-built LED pin as output
}
在“我的广告设备回调”功能中,我们打印行将列出发现的BLE设备的名称和其他信息。我们需要发现的BLE设备的硬件ID,以便我们可以将其与所需的设备进行比较。因此,我们使用变量Server_BLE_Address来获取设备的地址,然后将其从BLE地址类型转换为字符串。
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks
{
void onResult(BLEAdvertisedDevice advertisedDevice) {
Serial.printf("Scan Result: %s n", advertisedDevice.toString().c_str());
Server_BLE_Address = new BLEAddress(advertisedDevice.getAddress());
Scaned_BLE_Address = Server_BLE_Address->toString().c_str();
}
};
在循环函数中,我们扫描 3 秒钟,并将结果放在发现的设备中,这是来自 BLEScanResults 的对象。如果我们通过扫描找到一个或多个设备,我们将开始检查发现的BLE地址是否与我们在程序中输入的地址匹配。如果匹配是正数,并且设备未提前配对,我们尝试使用 connectToserver 函数对其进行配对。我们还使用了一些串行语句来理解目的。
while (foundDevices.getCount() >= 1)
{
if (Scaned_BLE_Address == My_BLE_Address && paired == false)
{
Serial.println("Found Device :-)... connecting to Server as client");
if (connectToserver(*Server_BLE_Address))
{
在连接服务器功能中,我们使用 UUID 与 BLE 服务器(健身带)配对。要连接服务器,ESP32 必须充当客户端,因此我们使用 createClient() 函数创建一个客户端,然后连接到 BLE 服务器的地址。然后,我们使用 UUID 值搜索服务和特征,并尝试连接到它。当连接成功时,该函数返回 true,如果不是,则返回 false。请注意,使用服务和特征 UUID 与服务器配对并不是强制性的,它只是为了便于您理解。
bool connectToserver (BLEAddress pAddress){
BLEClient* pClient = BLEDevice::createClient();
Serial.println(" - Created client");
// Connect to the BLE Server.
pClient->connect(pAddress);
Serial.println(" - Connected to fitnessband");
// Obtain a reference to the service we are after in the remote BLE server.
BLERemoteService* pRemoteService = pClient->getService(serviceUUID);
if (pRemoteService != nullptr)
{
Serial.println(" - Found our service");
return true;
}
else
return false;
// Obtain a reference to the characteristic in the service of the remote BLE server.
pRemoteCharacteristic = pRemoteService->getCharacteristic(charUUID);
if (pRemoteCharacteristic != nullptr)
Serial.println(" - Found our characteristic");
return true;
}
如果连接成功,则GPIO引脚13变高,并使用中断语句将控件发送到环路之外。配对的布尔变量也设置为 true。
if (connectToserver(*Server_BLE_Address))
{
paired = true;
Serial.println("********************LED turned ON************************");
digitalWrite (13,HIGH);
break;
}
配对成功并打开GPIO引脚后,我们必须检查设备是否仍在范围内。由于现在设备已配对,因此BLE扫描服务将无法再看到它。只有当用户离开该区域时,我们才会再次找到它。因此,我们只需要扫描BLE服务器,如果我们发现,则必须将GPIO引脚设置为低电平,如下所示
if (Scaned_BLE_Address == My_BLE_Address && paired == true)
{
Serial.println("Our device went out of range");
paired = false;
Serial.println("********************LED OOOFFFFF************************");
digitalWrite (13,LOW);
ESP.restart();
break;
}
工作和测试
完成程序和硬件设置后,只需将代码上传到 ESP32 并按如下所示安排整个设置即可。
您应该注意到,一旦健身手环(服务器)与 ESP32 配对,灯就会被打开。您也可以通过注意健身手环上的连接蓝牙符号来检查这一点。配对后,只需尝试离开 ESP32,当您越过 3-4 米时,您会注意到手表上的蓝牙符号消失,连接丢失。现在,如果你看一下灯,它将被关闭。当您走回设备时,设备会再次配对并打开指示灯。
全部0条评论
快来发表一下你的评论吧 !