Gravity: BLE Sensor Beacon

简介

Gravity: BLE 传感器信标,是一款通过蓝牙广播传感器数据的无线信标,内置11位ADC采集功能,可连接数字量或模拟量传感器进行数据采集和广播。使用手机、ESP32等支持BLE接收的设备,均可在信标广播范围内获取信标广播的传感器数据。

Gravity: BLE 传感器信标集成低功耗蓝牙5.3技术,数据格式可自行配置,如iBeacon、Eddystone、用户自定义等。信标广播的数据格式、广播的内容、广播的时间间隔等等都可以通过图形化界面自行配置,无需任何代码编程即可完成一个蓝牙信标。配置完成后,设备供电即作为一个蓝牙信标运行,会按照配置信息自动采集传感器数据并向外界广播。适合作为物联网传感器节点,如智能农场、办公室、工厂、仓库等场景中的数据采集节点。

注:Gravity: BLE传感器信标需要使用3.3V USB-TTL工具进行配置。

产品参数

  • 工作电压: 3.3~5.5V DC
  • 信标工作电流:<2mA @ Eddystone TLM
  • 支持传感器:3.3V数值/模拟量传感器
  • 输入信号:数字/模拟量
  • 工作频段:2.4GHz ISM
  • 调制方式:GFSK
  • 发射功率:+5.0dBm
  • 电路板尺寸:27mm*33.5mm
  • 安装孔尺寸:内径3.1mm/外径6mm

引脚说明

标号 名称 功能描述
1 电源输入端 3.3-5.5V DC电源输入
2 烧录/调试端 用于模块调试和烧录
3 传感器信号输入端 "A": 传感器信号输入
"-": 传感器GND
"+":传感器供电
4 传感器VCC选择端 短接:传感器供电方式为3.3V持续供电
断开(默认):传感器供电方式可设置为仅广播时供电

快速使用教程

以自定义数据格式为例,通过手机app和ESP32获取传感器数据。

一、软硬件准备

二、配置传感器信标

*注:模块仅能烧录一次,在未确定配置信息前不要直接点击"Burn/Program"进行烧录。可通过"Run inRAM"进行测试,在烧录前"Run in RAM"可无限次使用,断电后系统复位。

  • 1.下载NanoBeaconConfigTool_V3.2.11,运行NanoBeaconConfig.exe

  • 2.Advertising

    Gravity: BLE 传感器信标可设置三个广播通道,勾选Enable即可开启对应广播通道,默认开启一个,Edit进入配置页面

  • 3.Advertising Set#1 - Edit - Avdertising Data

    可设置iBeacon、Eddystone、Custom三种数据格式,教程中将主要使用Custom

  • 4.Advertising Set#1 - Edit - Avdertising Data - Custom Settings

    勾选“Device Name”,输入“Gravity: Sensor Beacon”,名字可任意起一个,手机和ESP32扫描时可直接根据名字筛选

    勾选“Manufacturer Specific Data”,点击“EDIT”配置数据

  • 5.Advertising Set#1 - Edit - Avdertising Data - Custom Settings - EDIT

    此处只配置一条模拟量的数据,下拉框选择“ADC CH1”,勾选:“Big Endian”,点击“Append to Data”,即可在窗口中看到“0x<ADC CH1 2byte 1 0>”,点击OK退出

  • **6.Advertising Set#1 - Edit - Avdertising Parameters **

    此处设置广播间隔时间和地址,根据需要修改即可,完成后OK退出,至此广播数据格式配置完毕,模块将以1S/次广播数据

  • 7.ADC

    接下来进行ADC相关配置,Gravity: BLE 传感器信标使用IO5进行模拟量采集,因此在ADC界面中Enable "ADC Channel 1 MPGIO 5",并点击Edit进行配置

  • 8.ADC - ADC Channel 1 MPGIO 5 - Edit

    将Unit修改为0.001便于计算,对精度影响不大,若对精度有极高要求可不做修改。由于电路中对模拟量输入做了分压处理(2.06),因此将分压后的电压值进行重新映射

    Value of 1.4V 修改为 2.898

    Value of 0.4V 修改为 0.828

    至此,完成ADC采集相关配置,此时信标广播的数据将为“传感器信号输入端”的电压值,单位mv

  • 9.GPIO

    由于MGPIO 5作为ADC输入端,需将其配置为“disable”

    MGPIO6 将作为传感器的供电端,将其配置为“output high” “pull up” “latch”,使MGPIO6 锁定输出高电平3.3V,用于为传感器供电。

  • 10.晶振电容匹配

    NanoBeaconConfig Tool中可以通过设置来匹配晶振电容,结合我们的电路,为了使频偏保持在最佳状态,我们建议您将以下两处参数修改为12。

  • 11.检查配置

    软件左下角可看到我们开启了Set #1、ADC Channel 1、MGPIO5、MGPIO6

  • 12.连接模块与PC

    按照接线图进行硬件连接

  • 13.连接模块与PC

    在软件右上角点击“Probe”刷新端口,刷新后选择对应端口,点击“Connect”,连接成功后会有弹窗提示

  • 14.运行测试

    点击“Run in RAM”,完成后会有弹窗提示

    *注:模块仅能烧录一次,在未确定配置信息前不要直接点击"Burn/Program"进行烧录。可通过"Run inRAM"进行测试,在烧录前"Run in RAM"可无限次使用,断电后系统复位。

三、手机app获取数据

  • 1.以安卓手机为例,安装并打开nRF Connect.apk

  • 2.若周边有太多其他信标设备,导致找不到我们的设备,则可以在筛选器中输入信标的设备名称,在配置传感器信标第4步的教程中,我们为Device Name命名为“Gravity: Sensor Beacon”

  • 3.可以看到菜单中只保留了“Gravity: Sensor Beacon”,点击一下可看到详细信息

image-20221201145433008

  • 4.数据解释

    “Gravity: Sensor Beacon”为配置传感器信标第4步中设置的Device Name

    "06:05:04:03:02:01"为配置传感器信标第6步中设置的地址

    “0X00E3”为配置传感器信标第5步中设置的ADC采集数据

  • 5.传感器数据计算

当前已知信标采集到的传感器数据为“0X00E3”,将其转换为十进制为227,即信标采集到的电压值为227mv

我们所连接的传感器是LM35,通过查询LM35的wiki可知,LM35输出电压和温度对应关系为10mV/℃,即信标广播的LM35温度传感器数据为22.7℃

四、ESP32获取数据

/*
   Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp
   Ported to Arduino ESP32 by Evandro Copercini
   Changed to a beacon scanner to report iBeacon, EddystoneURL and EddystoneTLM beacons by beegee-tokyo
*/

#include <Arduino.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
#include <BLEEddystoneURL.h>
#include <BLEEddystoneTLM.h>
#include <BLEBeacon.h>
#define ENDIAN_CHANGE_U16(x) ((((x)&0xFF00) >> 8) + (((x)&0xFF) << 8))

float Sensor_Data;
int scanTime = 5; //In seconds
BLEScan *pBLEScan;

class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks
{
    void onResult(BLEAdvertisedDevice advertisedDevice)
    {
      if (advertisedDevice.haveName())
      {
        if(String(advertisedDevice.getName().c_str()) == "Gravity: Sensor Beacon"){
          Serial.print("Device name: ");
          Serial.println(advertisedDevice.getName().c_str());
          std::string strManufacturerData = advertisedDevice.getManufacturerData();
          uint8_t cManufacturerData[100];
          strManufacturerData.copy((char *)cManufacturerData, strManufacturerData.length(), 0);
          Serial.printf("strManufacturerData: %d ", strManufacturerData.length());
            for (int i = 0; i < strManufacturerData.length(); i++)
            {
              Serial.printf("[%X]", cManufacturerData[i]);
            }
            Sensor_Data = int(cManufacturerData[2]<<8 | cManufacturerData[3]);
            Serial.println();
            Serial.print("Voltage:");Serial.print(int(Sensor_Data));Serial.println("mV");   
            Serial.print("Temp_LM35:");Serial.print(Sensor_Data/10);Serial.println("℃");      
            Serial.println("------------------");       
        }        
      }
    }
};
void setup()
{
  Serial.begin(115200);
  Serial.println("Scanning...");

  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan(); //create new scan
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  pBLEScan->setInterval(100);
  pBLEScan->setWindow(99); // less or equal setInterval value
}
void loop()
{
  // put your main code here, to run repeatedly:
  BLEScanResults foundDevices = pBLEScan->start(scanTime, false);
  pBLEScan->clearResults(); // delete results fromBLEScan buffer to release memory
  delay(2000);
}

  • 此程序是根据ESP32自带的BLE_Beacon_Scanner修改得到,根据需要可自行修改。

五、确认数据并烧录

  • *注:模块仅能烧录一次,若仅为了测试功能可跳过此步

  • 以上的数据格式是以自定义格式进行广播,意在使大家能够快速使用,其他格式请根据自己的需要参考软件规格书自行配置。

  • 确认数据无误后即可将数据格式烧录固化到芯片中。

  • 点击右下角的“Burn/Program”按钮烧录程序,烧录成功后会有烧录成功的弹窗提示。

  • 烧录完毕后,可断开模块与烧录器的连接,使用电池为模块供电。

高级应用

一、广播Eddystone TLM数据

Eddystone TLM的数据内自带温度数据,此时温度数据有信标芯片内部的温度传感器提供,会受到芯片本身的发热影响。

配置Eddystone TLM时仅需要在“Advertising Data Format”中选择“Eddystone ”,然后在“Eddystone -Settings”中选择“TLM Frame”即可,广播间隔、地址等可全部保持默认,也可根据需要自行配置。

二、高功耗传感器供电

因使用MGPIO6作为电源输出时,MGPIO6的带载能力弱(4mA),一些功耗较高的传感器可能无法驱动,因此我们在Gravity: BLE传感器信标板子的背面做了跳线焊盘,将焊盘短接后,传感器的电源将由板载的LDO提供,3.3V电压会更加稳定且带载能力更强

三、动态电源控制

若要做动态电源控制,即广播时为传感器供电,广播结束后停止为传感器供电,则将MGPIO6 设为“wakeup high, sleep low” Latch设为“disable”。

样例配置文件可直接下载后直接加载:DynamicPower.zip

四、长间隔防丢包

当广播间隔设为10S/次 甚至更久时,若接收端接收失败,那就要等待10S后信标下一次广播,且下一次广播时仍有接收失败风险。这种情况下,为防止接收端接收失败,可在间隔时间到达时进行多次广播。

具体实现方法为:

  • 将信标芯片的动态电源控制端SW0使能,SW0的作用为每次启动广播时输出高电平

  • 使能两个广播通道,一个设置为周期广播20S/次,另一个设置为触发广播广播周期200ms/次,两个广播通道需设置相同的数据格式

  • 周期广播不再赘述,在触发广播中勾选MGPIO6,因为在硬件电路中MGPIO6与SW0相连,通过MGPIO6检测SW0的电平跳变,每检测到一次SW0的电平跳变就广播6次数据(触发广播模式中,默认会将设置的次数广播完才会重新进入检测状态)

  • MGPIO6设置为输入模式,启动边沿检测

  • 在Advanced页面中需要输入一条指令“register write: 0 1 3 32e8 0”,将防抖功能关闭

  • 完成以上操作后可通过Run in RAM进行测试。以上配置文件可直接下载后直接加载:trigger.zip

NanoBeacon Config Tool使用说明

关于NanoBeacon Config Tool更多用法,可查看软件的用户指南:NanoBeacon Config Tool User Guide EN.pdf
用户指南中使用的是“Beacon development kit”,在使用Gravity: BLE 传感器信标时,直接使用3.3V USB-TTL工具即可:

常见问题

还没有客户对此产品有任何问题,欢迎通过QQ在线客服或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

更多

DFshopping_car1.png DFRobot商城购买链接