将ESP32蓝牙低功耗连接到健身手环以触发灯泡的方法

描述

一进入家门就自动开灯,离开时又关掉灯,这是多么酷啊!是的,一个简单的应用程序可以为您做到这一点。在这个项目中,我们将 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,你就可以按照下面的电路图建立自己的电路。

GPIO

警告:该电路直接处理220V交流电源电压。小心带电电线,并确保不会产生短路。你已被警告。

使用BC548而不是BC547或2N2222的原因是它们具有低基极发射极电压,仅可在3.3V下触发。这里使用的继电器是5V继电器,因此我们使用Vin引脚为其供电,该引脚从电源线中获得5V。接地引脚连接到电路的接地。电阻 R1 1K 用作基极电流限制器电阻。相线连接到继电器的NO引脚,继电器的共引脚连接到负载,负载的另一端连接到中性线。您可以交换相位和中性的位置,但请注意不要直接做空它们。电流应始终通过负载(灯泡)。我使用了一个继电器模块来保持简单,这里的负载是焦点LED灯。我的设置如下所示

GPIO

如果您现在想跳过硬件,可以使用 GPIO 2 引脚而不是 GPIO 13 引脚来切换 ESP32 上的板载 LED。建议初学者使用此方法。

获取服务器的蓝牙地址(健身手环的地址)

如前所述,我们将对 ESP32 进行编程,使其充当客户端(类似于电话)并连接到我的健身手环(联想 HW-01)的服务器。对于连接到服务器的客户端,它必须知道服务器的蓝牙地址。每个蓝牙服务器,就像我的健身手环一样,都有自己独特的蓝牙地址,这是永久性的。您可以将此与笔记本电脑或手机的 MAC 地址相关联。

为了从服务器中获取此地址,我们使用称为nRF的应用程序从北欧半导体连接,我们已经在上一个教程中使用过。它免费提供给IOS和安卓用户。只需下载,启动应用程序并扫描附近的蓝牙设备。该应用程序将列出它找到的所有BLE设备。我的命名为HW-01,只需查看其名称下方,您就会发现服务器的硬件地址,如下所示。

GPIO

所以我的健身手环的 ESP32 BLE 硬件地址是 C7:F0:69:F0:68:81,您将拥有一组相同格式的不同数字。只需记下它,因为我们在编程ESP32时需要它。

获取服务器的服务和特征 UUID

好的,现在我们已经使用BLE地址标识了我们的服务器,但是为了与之通信,我们需要说服务语言和特征,如果您阅读了上一个教程,您将理解这一点。在本教程中,我将使用我的服务器的写入特征(健身带)与它配对。因此,为了与设备配对,我们需要服务广告特征UUID,我们可以使用相同的应用程序再次获得它。

只需单击应用程序上的“连接”按钮并搜索一些写入特征,应用程序将显示服务 UUID 和特征 UUID。我的如下所示

GPIO

在这里,我的服务 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 并按如下所示安排整个设置即可。

GPIO

您应该注意到,一旦健身手环(服务器)与 ESP32 配对,灯就会被打开。您也可以通过注意健身手环上的连接蓝牙符号来检查这一点。配对后,只需尝试离开 ESP32,当您越过 3-4 米时,您会注意到手表上的蓝牙符号消失,连接丢失。现在,如果你看一下灯,它将被关闭。当您走回设备时,设备会再次配对并打开指示灯。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分