0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

科技观察员 来源:circuitdigest 作者:阿斯温斯·拉吉 2022-10-28 17:07 次阅读

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

pYYBAGNbm0eAN4WsAADxWYTqRTY547.png

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

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

pYYBAGNbm8qAfGRLAAC3jIacubg753.jpg

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

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

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

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

poYBAGNbm8uAYNwVAAA4atOrE8k433.png

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

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

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

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

pYYBAGNbm86AJC0LAABtBM2E4b4348.png

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

poYBAGNbm8-AQH9hAADIXXLZy9c059.jpg

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

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

    关注

    12

    文章

    652

    浏览量

    59331
  • GPIO
    +关注

    关注

    16

    文章

    1196

    浏览量

    51901
  • ESP32
    +关注

    关注

    17

    文章

    956

    浏览量

    17071
收藏 人收藏

    评论

    相关推荐

    请问esp32 mesh provisioner和低功耗蓝牙可以共存吗?

    esp32 mesh provisioner 和低功耗蓝牙可以共存吗
    发表于 06-18 06:40

    请问esp32蓝牙能不能保持超低功耗的监听?

    做一个低功耗的设备,需要进入深度睡眠,但是有需要空中唤醒,可以用外挂LORA去唤醒esp32。 那么esp32低功耗蓝牙,能不能像家用的
    发表于 06-18 07:11

    基于ESP32低功耗蓝牙触摸键盘

    触摸低功耗蓝牙行业芯事经验分享
    迪文智能屏
    发布于 :2022年04月07日 16:05:53

    蓝牙4.1申请】低功耗蓝牙手环

    申请理由:想开发低功耗手环,苦于没有开发板,看到这边有符合我的开发板,所以申请一套。项目描述:低功耗蓝牙手环,适合当代年轻人追求科技时尚的理
    发表于 10-09 14:18

    低功耗蓝牙的应用领域

    、室内定位导航(包括商场、图书馆、停车场、酒店、饭店等等)、景点语音介绍、身份识别等均可使用低功耗蓝牙技术。蓝牙防丢器蓝牙防丢器与智能手机
    发表于 03-18 02:25

    请问esp32蓝牙能不能保持超低功耗的监听?

    做一个低功耗的设备,需要进入深度睡眠,但是有需要空中唤醒,可以用外挂LORA去唤醒esp32。那么esp32低功耗蓝牙,能不能像家用的
    发表于 02-15 06:13

    如何使用ESP32和Bluetooth模块闪烁LED

    在本教程中,LED的阳极连接到ESP32的p21,LED的阴极连接到ESP32的GND
    的头像 发表于 10-05 17:50 8942次阅读
    如何使用<b class='flag-5'>ESP32</b>和Bluetooth模块闪烁LED

    HC05 蓝牙模块 连接 ESP32 经典蓝牙

    概述HC05是一款常用的经典蓝牙模块,某宝有大量销售,主从机一体,而ESP32蓝牙兼容经典蓝牙低功耗
    发表于 11-24 12:36 65次下载
    HC05 <b class='flag-5'>蓝牙</b>模块 <b class='flag-5'>连接</b> <b class='flag-5'>ESP32</b> 经典<b class='flag-5'>蓝牙</b>

    通用型WiFi和低功耗蓝牙模组ESP32-C3的优势特征及应用范例

    ESP32-C3-WROOM-02(简称ESP32-C3)模组是一款专为物联网应用场景设计的通用型 WiFi 和低功耗蓝牙模组,安全性高、内存充足、外设接口多、应用场景丰富、尺寸小,可
    的头像 发表于 06-24 10:16 4460次阅读

    您的Magicbit(ESP32)连接到thingsboard

    电子发烧友网站提供《您的Magicbit(ESP32)连接到thingsboard.zip》资料免费下载
    发表于 11-15 11:46 0次下载
    <b class='flag-5'>将</b>您的Magicbit(<b class='flag-5'>ESP32</b>)<b class='flag-5'>连接到</b>thingsboard

    使用ESP32简单且不安全的方式连接到AWS IoT

    电子发烧友网站提供《使用ESP32简单且不安全的方式连接到AWS IoT.zip》资料免费下载
    发表于 12-26 09:15 0次下载
    使用<b class='flag-5'>ESP32</b><b class='flag-5'>以</b>简单且不安全的方式<b class='flag-5'>连接到</b>AWS IoT

    基于ESP32低功耗蓝牙暗室定时器

    电子发烧友网站提供《基于ESP32低功耗蓝牙暗室定时器.zip》资料免费下载
    发表于 02-09 11:53 0次下载
    基于<b class='flag-5'>ESP32</b>的<b class='flag-5'>低功耗</b><b class='flag-5'>蓝牙</b>暗室定时器

    自动化烧录器支持芯片烧录Espressif乐鑫科技的低功耗蓝牙模组ESP32-WROOM32E

    芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表,其中昂科发布软件更新支持Espressif乐鑫科技的低功耗蓝牙模组ESP32-WROOM32E已经被昂科的通用烧录平台
    的头像 发表于 05-09 17:17 3164次阅读
    自动化烧录器支持芯片烧录Espressif乐鑫科技的<b class='flag-5'>低功耗</b><b class='flag-5'>蓝牙</b>模组<b class='flag-5'>ESP32</b>-WROOM32E

    信驰达基于ESP32-C3推出低功耗Wi-Fi蓝牙双模模块

    厂商深圳信驰达科技RF-star推出了基于ESP32-C3 SoC的低功耗WiFi蓝牙二合一通信模块——RF-WM-ESP32B1。
    的头像 发表于 07-19 09:44 846次阅读

    低功耗蓝牙模块在运动健身追踪中的革新应用

    随着健康和健身意识的不断提升,人们对运动追踪技术的需求日益增加。低功耗蓝牙模块的引入为运动健身追踪领域带来了新的可能性。本文探讨
    的头像 发表于 11-29 14:50 425次阅读