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

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

3天内不再提示

如何利用ESP32和Arduino制作BLE检测器

科技观察员 来源:circuitdigest 作者:Debashis Das 2022-08-09 17:15 次阅读

接近传感器可以描述为一种借助光、电磁场或声音检测附近物体的开关。通常,这些类型的设备旨在检测附近的对象,并且大多数这些传感器将用于实际应用中。但是在某些情况下,对象远离传感器或对象被遮挡障碍物,在这些类型的情况下,我们可以使用BLE(低功耗蓝牙)设备来检测和感知物体的接近度。 ESP32 开发板内置 BLE,我们在很多其他项目中都使用过。

在本文中,我将向您展示如何在ESP32 和 Arduino 的帮助 下制作一个简单的BLE 存在检测器,最后,我们将在我的智能手机智能手表上使用 BLE 测试这些设备。

什么是低功耗蓝牙 (BLE)?

BLE 代表低功耗蓝牙,它于 2011 年进入我们的日常生活,因为每年的那个时候,每个主要制造商都开始在他们的设备中嵌入 BLE 技术。BLE 是一种低功耗无线通信技术,专为电池供电应用而开发,可用于短距离设备之间的通信。您每天使用的一些设备都内置了蓝牙,例如您的智能手机、智能手表、无线 耳塞、无线 扬声器、智能 家居 设备。,以及更多的嵌入式蓝牙进行通信或获取位置数据。

BLE 是一项相对较新的技术,BLE 协议是由蓝牙特别兴趣小组 (SIG)开发的,其主要目标是使低功耗设备成为现实。虽然新开发的协议名称保持不变,但新开发的 BLE 协议不向后兼容,这意味着我们的蓝牙经典设备无法与 BLE 设备通信,尽管该技术存在缺点,但它使开发人员能够产生非常低的功率能量- 使用小型纽扣电池可持续数月甚至数年的高效设备。

BLE 通信如何工作?

BLE 使用分层数据结构来发送和接收信息。充当服务器的 BLE 设备将发布客户端可以检测到的服务和特征,一旦信息交换成功,BLE 设备可以同时相互通信。用技术术语来说,这个信息堆栈一起被称为 BLE 设备的属性。它是使用 GATT(通用属性)配置文件定义和实现的。在这些配置文件中,我们按层次顺序排列了服务、特征和值。服务包含特征,特征包含值,通过读取特征,我们可以读取值和值随时间的变化。

pYYBAGLyJLuAARXlAAF58oVg1ME310.png

可以处理特征以包括读取或写入信息。包含读取组件的设备可以发布信息,包含写入特性的设备可以从客户端接收数据。

定义服务和特性的GATT 配置文件称为通用唯一标识符 (UUID)。SIG 公司定义和保留了一些标准服务和特性,如果我们读取 BLE 设备的 UUID,我们可以立即知道它是什么类型的设备。稍后再讨论这个话题

BLE 数据以非常小的封装传输和接收,当TCP 数据包为 60 字节或更多时,BLE 数据包总共只有 31 字节。最后,要记住的重要一点是,BLE 数据包需要正确构造,然后可以在服务器端和客户端一致地序列化和反序列化。

BLE 接近传感器如何工作?

正如我之前所说,接近传感器可以借助光、电磁波或声音来检测物体。之前我们已经制作了一些基于PIR 传感器和IR 传感器的项目,如果您想了解更多有关该主题的信息,可以查看这些项目。

poYBAGLyJMCAMWXOAADbniGfCFE846.png

BLE 服务器定期广播广告信号,以便客户端可以搜索并连接到它。这个广播信号包含一个唯一的 BLE MAC(媒体访问控制)地址,它与Wi-Fi 中使用的 MAC 地址非常相似,因为我们的 ESP32 模块内置了蓝牙,我们可以很容易地检测到这个广播信号并将其与查找表,以检测已知设备的存在。验证设备后,我们可以在本地打开灯,也可以使用 Adafruit IO在我们的 android 应用程序上触发通知。我们之前也用 Adafruit IO 做过项目,如果你想实现 Adafruit IO,可以查看这些项目。

这个项目的要求?

pYYBAGLyJMmAAffoAAU8nukT6As534.png

正如您在上图中看到的,对这个项目没有太多要求,一个 esp32 开发板和一个支持 BLE 的设备,这里我使用的是我的 MI Band,就是这样。

ESP32 BLE 接近传感器的 Arduino 代码

在演示中,我们将对 ESP32 控制器进行编程以感应已知的 BLE 信标,一旦已知设备接近,我们将点亮板载 LED。可以在本页底部找到执行此操作的完整程序。代码解释如下。

我们通过添加所需的头文件并声明变量来开始我们的程序。

当我们使用 BLEScan 类时,我们需要包含 BLEScan 的头文件以及其他 BLE 头文件。

#include 
#include 
#include 
#include 

接下来,我们将声明一些变量,首先是我们存储已知 BLE MAC 地址的数组。接下来,我们将声明阈值,打破将触发所需操作的阈值。接下来,我们将定义一个布尔值,如果我们数组中的已知设备与扫描的设备列表匹配,它将设置为 true。接下来,我们声明另一个变量来清除已扫描的 BLE 设备,如果我们不这样做,就会出现内存问题。接下来,我们获取一个指向 BLEScan 类的指针。

字符串 knownBLEAddresses[] = {"aa:bc:cc:dd:ee:ee", "54:2c:7b:87:71:a2"};
int RSSI_THRESHOLD = -55;
bool device_found;
整数扫描时间 = 5;//片刻之间
BLEScan* pBLEScan;

我们必须定义一个回调函数,首先,这个回调函数将每隔几秒调用一次,以检查是否有新的 BLE 设备可用。一旦我们进入回调函数,如果我们找到一个 BLE 设备,我们将设置一个标志并中断循环。最后,我们将打印 BLE 设备信息。

类 MyAdvertisedDeviceCallbacks:公共 BLEAdvertisedDeviceCallbacks {
    无效 onResult(BLEAdvertisedDevice 广告设备){
      for (int i = 0; i < (sizeof(knownBLEAddresses) / sizeof(knownBLEAddresses[0])); i++)
      {
        //取消注释以启用调试信息
        //Serial.println("*************开始**************");
        //Serial.println(sizeof(knownBLEAddresses));
        //Serial.println(sizeof(knownBLEAddresses[0]));
        //Serial.println(sizeof(knownBLEAddresses)/sizeof(knownBLEAddresses[0]));
        //Serial.println(advertisedDevice.getAddress().toString().c_str());
        //Serial.println(knownBLEAddresses[i].c_str());
        //Serial.println("*************结束**************");
        if (strcmp(advertisedDevice.getAddress().toString().c_str(), knownBLEAddresses[i].c_str()) == 0)
                        {
          device_found = true;
                          休息;
                        }
        别的
          device_found = 假;
      }
      Serial.printf("广告设备:%s \n", AdvertisementdDevice.toString().c_str());
    }
};

接下来是设置部分,我们将LED 引脚声明为输出。此外,我们使用BLEDevice::init 方法初始化BLEDevice,之后,我们从 BLEDevice 获取扫描对象,我们将地址存储到先前声明的pBLEScan 指针中。

接下来,我们设置回调函数,这个回调函数会在几秒钟内调用一次,检查是否有新设备可用,接下来我使用SetActiveScan方法将其设置为非活动模式,因为如果我们启用此功能,BLE 设备将为我们提供非常准确的结果。最后我们设置setInterval和setWindow方法来完成设置。

  序列号.开始(115200);//在ESP32上启用UART
  Serial.println("正在扫描..."); // 打印扫描
  pinMode(LED_BUILTIN,输出);//
  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan(); //创建新的扫描
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); //初始化回调函数
  pBLEScan->setActiveScan(true); //主动扫描消耗更多的能量,但更快地得到结果
  pBLEScan->setInterval(100); // 设置扫描间隔
  pBLEScan->setWindow(99); // 小于或等于 setInterval 值

在循环部分,我们使用start 方法启动 BLE 设备。scanTime参数定义了 BLE 设备扫描新设备所需的时间。

BLEScanResults foundDevices = pBLEScan->start(scanTime, false);

扫描完成后,我们将其放入名为foundDevices的变量中。

扫描完成后,我们可以使用found devices.getCount()方法获取扫描仪找到了多少个设备,我们方便地将其放入for 循环中,逐个获取每个设备的 RSSI 值,然后,我们比较该设备是否与列表中的设备匹配,我们使用一个简单的if语句来做到这一点。如果我们得到一个已知设备,我们会点亮板载 LED,以表明我们在列表中找到了一个已知设备。否则我们会关闭 LED。

for (int i = 0; i < foundDevices.getCount(); i++)
  {
    BLEAdvertisedDevice device = foundDevices.getDevice(i);
    int rssi = device.getRSSI();
    Serial.print("RSSI:");
    序列号.println(rssi);
    如果(rssi > RSSI_THRESHOLD && device_found == true)
      数字写入(LED_BUILTIN,高);
    别的
      数字写入(LED_BUILTIN,低);
  }

最后,我们通过调用 -

clearResults() 方法
pBLEScan->clearResults(); // 从BLEScan缓冲区中删除结果以释放内存

上传代码后,如果已知设备靠近您的 ESP32 设备,您可以触发任何操作。完整的工作也可以在此页面的底部找到。

#include
#include
#include
#include
字符串 knownBLEAddresses[] = {"6E:bc:55:18:cf:7b", "53:3c:cb:56:36:02", "40:99:4b:75:7d:2f", "5c :5b:68:6f:34:96"};
int RSSI_THRESHOLD = -55;
bool device_found;
整数扫描时间 = 5;//片刻之间
BLEScan* pBLEScan;
类 MyAdvertisedDeviceCallbacks:公共 BLEAdvertisedDeviceCallbacks {
无效 onResult(BLEAdvertisedDevice 广告设备){
for (int i = 0; i < (sizeof(knownBLEAddresses) / sizeof(knownBLEAddresses[0])); i++)
{
//取消注释以启用调试信息
//Serial.println("*************开始**************");
//Serial.println(sizeof(knownBLEAddresses));
//Serial.println(sizeof(knownBLEAddresses[0]));
//Serial.println(sizeof(knownBLEAddresses)/sizeof(knownBLEAddresses[0]));
//Serial.println(advertisedDevice.getAddress().toString().c_str());
//Serial.println(knownBLEAddresses[i].c_str());
//Serial.println("*************结束**************");
if (strcmp(advertisedDevice.getAddress().toString().c_str(), knownBLEAddresses[i].c_str()) == 0)
{
device_found = true;
休息;
}
别的
device_found = 假;
}
Serial.printf("广告设备:%s \n", AdvertisementdDevice.toString().c_str());
}
};
无效设置(){
序列号.开始(115200);//在ESP32上启用UART
Serial.println("正在扫描..."); // 打印扫描
pinMode(LED_BUILTIN,输出);//使 BUILTIN_LED 引脚作为输出
BLEDevice::init("");
pBLEScan = BLEDevice::getScan(); //创建新的扫描
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); //初始化回调函数
pBLEScan->setActiveScan(true); //主动扫描消耗更多的能量,但更快地得到结果
pBLEScan->setInterval(100); // 设置扫描间隔
pBLEScan->setWindow(99); // 小于或等于 setInterval 值
}
无效循环(){
// 把你的主要代码放在这里,重复运行:
BLEScanResults foundDevices = pBLEScan->start(scanTime, false);
for (int i = 0; i < foundDevices.getCount(); i++)
{
BLEAdvertisedDevice device = foundDevices.getDevice(i);
int rssi = device.getRSSI();
Serial.print("RSSI:");
序列号.println(rssi);
如果(rssi > RSSI_THRESHOLD && device_found == true)
数字写入(LED_BUILTIN,高);
别的
数字写入(LED_BUILTIN,低);
}
pBLEScan->clearResults(); // 从BLEScan缓冲区中删除结果以释放内存
}

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

    关注

    1

    文章

    803

    浏览量

    47231
  • BLE
    BLE
    +关注

    关注

    12

    文章

    602

    浏览量

    58716
  • Arduino
    +关注

    关注

    184

    文章

    6421

    浏览量

    184568
  • ESP32
    +关注

    关注

    10

    文章

    886

    浏览量

    15658
收藏 人收藏

    评论

    相关推荐

    ESP32墨水屏利用blynk技术手机记事留言

    `BLYNK+ESP32+墨水屏实现手机至墨水屏记事留言特点:1.在任何地方将手机输入信息实时留言到家里或办公室的墨水屏上,TTS文字转声音(可选).2.利用BLE蓝牙休眠唤醒,耗电极少,18650
    发表于 07-22 10:29

    BLEESP32连接时,导致与任何Android应用程序的BLE连接失败的原因?

    应用程序的 BLE 连接失败,甚至在 Arduino 中加载他们自己的示例作为“BLE_notify.ino”。是ESP32升级到BLE
    发表于 03-01 08:46

    BLEESP32连接失败的原因?

    应用程序的 BLE 连接失败,甚至在 Arduino 中加载他们自己的示例作为“BLE_notify.ino”。是ESP32升级到BLE
    发表于 04-12 08:42

    arduino-esp32-master环境设置用的库

    arduino-esp32-master开发环境设置用的库
    发表于 08-07 08:53 25次下载

    DIY使用ESP32的手持游戏手柄并通过BLE进行通信的设计

    ×    1个     软件应用程序和在线服务: Arduino IDE     手动工具和制造机: 烙铁(通用) 这是一个使用ESP32微控制器制作的DIY手持游戏手柄。您可能之前已经看过这样的游戏控
    的头像 发表于 01-27 13:40 7472次阅读

    esp32arduino的区别,esp32能否替代arduino

    很多创客爱好者甚至有些技术工程师在理解esp32arduino的时候总是问一句这两块板子哪个更好用?他们可能潜意识中就觉得arduinoesp32是竞品的关系,但实际是这样吗?今天
    发表于 06-24 17:11 2.4w次阅读

    ESP32 开发之旅② Arduino For ESP32说明

    文章目录1. Arduino Core For ESP32是什么?2.Arduino core for ESP32库3.与ESP8266库类
    发表于 11-13 19:51 33次下载
    <b class='flag-5'>ESP32</b> 开发之旅② <b class='flag-5'>Arduino</b> For <b class='flag-5'>ESP32</b>说明

    ESP32-Arduino-开发实例-ESP32的WiFi工作模式

    WiFi-BT-BLE MCU模组,功能强大,用途广泛,可以用于低功耗传感器网络和要求极高的任务,例如语音编码、音频流和MP3解码等。此款模组的核心是ESP32芯片,具有可扩展、自适应的特点。两个CPU核可以被单独控制或上电。时钟频率的调节范围为80 MHz到240 MH
    发表于 11-26 17:21 82次下载
    <b class='flag-5'>ESP32-Arduino</b>-开发实例-<b class='flag-5'>ESP32</b>的WiFi工作模式

    使用Arduino开发ESP32-01S

    使用Arduino开发ESP32-01S
    发表于 12-03 18:06 16次下载
    使用<b class='flag-5'>Arduino</b>开发<b class='flag-5'>ESP32</b>-01S

    arduino / VScode+platformIO搭建esp32/esp8266编译环境(一篇足矣)

    arduino/VScode+platformIO 搭建esp32/esp8266开发环境(一篇足矣)前言:入门开源硬件开发,在搭建编译环境的时候碰了一脸灰,特意写下此博客,以供参考!制作
    发表于 12-05 14:06 30次下载
    <b class='flag-5'>arduino</b> / VScode+platformIO搭建<b class='flag-5'>esp32</b>/<b class='flag-5'>esp</b>8266编译环境(一篇足矣)

    如何使用ESP8266开发板制作光强度检测器

    本文将介绍如何使用一个ESP8266开发板制作光强度检测器,并将检测结果在本地网页显示。
    的头像 发表于 04-08 15:27 3312次阅读
    如何使用<b class='flag-5'>ESP</b>8266开发板<b class='flag-5'>制作</b>光强度<b class='flag-5'>检测器</b>

    如何使用ESP32构建一个BLE iBeacon

    在本教程中,我们将使用 ESP32 构建一个 BLE iBeacon,其中 ESP32 将充当服务器,智能手机将充当客户端。
    发表于 07-12 16:48 5332次阅读
    如何使用<b class='flag-5'>ESP32</b>构建一个<b class='flag-5'>BLE</b> iBeacon

    Arduino封装上的ESP32

    电子发烧友网站提供《Arduino封装上的ESP32板.zip》资料免费下载
    发表于 07-25 14:36 5次下载
    <b class='flag-5'>Arduino</b>封装上的<b class='flag-5'>ESP32</b>板

    基于ESP32Arduino兼容系统

    电子发烧友网站提供《基于ESP32Arduino兼容系统.zip》资料免费下载
    发表于 12-20 17:53 0次下载
    基于<b class='flag-5'>ESP32</b>的<b class='flag-5'>Arduino</b>兼容系统

    带有ESP32Arduino物联网云

    电子发烧友网站提供《带有ESP32Arduino物联网云.zip》资料免费下载
    发表于 06-15 09:16 3次下载
    带有<b class='flag-5'>ESP32</b>的<b class='flag-5'>Arduino</b>物联网云