【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块5

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百九十三:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备

在这里插入图片描述
在这里插入图片描述
知识点:移远BC20
BC20 是一款高性能、低功耗、多频段、支持 GNSS 定位功能的 NB-IoT 无线通信模块。其尺寸仅为 18.7 mm × 16.0 mm× 2.1 mm,能最大限度地满足终端设备对小尺寸模块产品的需求,同时有效帮助客户减小产品尺寸并优化产品成本。

BC20 在设计上兼容移远通信 GSM/GPRS/GNSS 系列 MC20 模块,方便客户快速、灵活的进行产品设计和升级。BC20提供丰富的外部接口和协议栈,同时支持中国移动 OneNET、中国电信 IoT 以及阿里云 IoT 等物联网云平台,为客户的应用提供极大的便利。

基于先进的 GNSS 技术,BC20 可支持 BeiDou 和 GPS 双卫星导航系统解调算法,使其定位更加精准、抗多路径干扰能力更强,比传统的单 GPS 定位模块具有更多优势。另外,BC20 模块内置 LNA 和低功耗算法:前者保证更高的灵敏度,后者保证低功耗模式下更低的耗流。

相较传统的 NB-IoT + GNSS 方案,BC20 的一体化设计使其体积减少 40 %。凭借其紧凑尺寸、超低功耗和超宽工作温度范围,BC20 在各种应用中占具更大优势;其主要应用领域为:自行车和摩托车防盗、宠物追踪、金融财产追踪及行车记录仪等等。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目之四:简易测量海拔高度

实验开源图形编程(Mind+、Mixly、编玩边学)

在这里插入图片描述

实验串口返回情况

在这里插入图片描述

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目之五:通过NB模块的LED灯的闪烁来判断信号强度

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
  NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
  项目之五:通过NB模块的LED灯的闪烁来判断信号强度
  实验接线:
  BC20       UNO
  VIN        5V
  GND        GND
  SCL        A5
  SDA        A4
*/

#include "DFRobot_BC20_Gravity.h"

//7种颜色可供选择
#define  RED 0
#define  BLUE 1
#define  GREEN 2
#define  YELLOW 3
#define  PURPLE 4
#define  CYAN 5
#define  WHITE 6

//IIC通讯
#define USE_IIC

//硬件串口通讯
//#define USE_HSERIAL

//软件串口通讯
//#define USE_SSERIAL

DFRobot_BC20_IIC myBC20(0x33);

/*
   信号强度由两个以 dBm 为单位的数值表示
   和闪烁的 LED:
   信号强——快闪
   中等信号 - 慢闪
   弱信号 - 突发闪光。
*/
static void NB_Signal_Fun() {
    
    
  //获取 NB-IoT 信号强度
  myBC20.getSQ();

  //信号质量 RSSI<10,弱信号强度
  myBC20.changeColor(WHITE);
  if (sSQ.rssi < 10 || sSQ.rssi == 99) {
    
    
    if (sSQ.rssi == 99) {
    
    
      Serial.println("信号不可检测");
    } else if (sSQ.rssi == 0) {
    
    
      Serial.println("信号强度:-113 dBm 或更少");
    } else {
    
    
      Serial.print("信号强度: ");
      Serial.print((sSQ.rssi - 2) * 2 - 109);
      Serial.println(" dBm 弱");
    }

    //Burst flash
    myBC20.LED_ON();
    delay(100);
    myBC20.LED_OFF();
    delay(900);
  }

  //信号质量 10<=RSSI<25,中等信号强度
  else if (sSQ.rssi >= 10  && sSQ.rssi < 25) {
    
    
    Serial.print("信号强度: ");
    Serial.print((sSQ.rssi - 2) * 2 - 109);
    Serial.println(" dBm 中等");

    //慢闪
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }

  //信号质量 RSSI>=25,信号强度强
  else if (sSQ.rssi >= 25) {
    
    
    if (sSQ.rssi < 31) {
    
    
      Serial.print("信号强度: ");
      Serial.print((sSQ.rssi - 2) * 2 - 109);
      Serial.println(" dBm 强");
    } else if (sSQ.rssi == 31) {
    
    
      Serial.print("信号强度:-51 dBm 或更高");
    }

    //快速闪光
    for (int i = 0; i < 5 ; i++) {
    
    
      myBC20.LED_ON();
      delay(100);
      myBC20.LED_OFF();
      delay(100);
    }
  }
  else {
    
    
    ;
  }
}

void setup() {
    
    
  Serial.begin(115200);
  myBC20.LED_OFF();

  //初始化 BC20
  Serial.print("正在启动BC20,请稍等......  ");
  myBC20.changeColor(RED);
  while (!myBC20.powerOn()) {
    
    
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }
  Serial.println(" BC20 启动成功!");

  //检查 SIM 卡是否插入
  Serial.println("正在检查SIM卡...");
  myBC20.changeColor(GREEN);
  while (!myBC20.checkNBCard()) {
    
    
    Serial.println("请插入NB SIM卡!");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }
  Serial.println("SIM 卡检查OK!");

  //打印 IMEI、ICCID 和 IMSI
  myBC20.getGSN(IMEI);
  Serial.print("BC20 IMEI: ");
  Serial.println(sGSN.imei);
  Serial.print("SIM card ICCID:");
  Serial.print(myBC20.getQCCID());
  Serial.print("SIM card IMSI: ");
  Serial.println((char *)myBC20.getIMI());

  /*
     模块将自动尝试连接到网络(移动站),
     检查它是否已连接到网络。
  */
  Serial.println("正在连接网络...");
  myBC20.changeColor(BLUE);
  while (myBC20.getGATT() == 0) {
    
    
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }
  Serial.println("网络已连接!");
}

void loop() {
    
    
  //获取本地 NB-IoT 信号强度并打印
  NB_Signal_Fun();
}

实验串口返回情况

程序通过串口打印当前环境(接收到的)NB-IoT信号强度RSSI(单位dBm,通常为负值,测量范围:-113 ~ -51 dBm,数值越大信号越强)。

通过RGB(白光)闪烁的快慢来表示信号强度,分为三级:

爆闪:信号弱(-95 dBm或以下),0.1s亮,0.9s灭。
慢闪:信号中等(-93 ~ - 65 dBm之间),0.5s亮,0.5s灭。
快闪:信号强(- 63 dBm或以上),0.1s亮,0.1s灭。
在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目之六:获取物理位置坐标

实验开源图形编程(Mind+、Mixly、编玩边学)
在这里插入图片描述

实验串口返回情况

GNSS定位需要一定时间进行寻星,首次上电通常需要30s以上才能获取有效的定位信息。

程序通过串口打印GNSS定位的简单信息:
纬度坐标(Latitude):26.09 表示北纬26.09°,精确到小数点后2位。南纬用S表示。
经度坐标(Longitude):119.32 表示东经119.32°,精确到小数点后2位。西经用W表示。

在这里插入图片描述

配置BC20模块的通信接口
开头都有下面一段用于配置通信接口的代码,配合物理接线可配置I2C、UART(硬件)和UART(软件)串口三种不同的通信接口。若不作任何修改,默认使用I2C接口,地址0x33。

/*Communication by IIC*/
#define USE_IIC

/*Communication by HardwareSerial*/
//#define USE_HSERIAL

/*Communication by SoftwareSerial*/
//#define USE_SSERIAL


/******************IIC******************/
#ifdef USE_IIC
/*
   For general controllers. Communicate by IIC
   Connect Instructions
      Controller     |    Module(BC20)
          SDA        |       D/T
          SCL        |       C/R
          GND        |       GND
       5V or 3V3     |       VCC

   IIC address(A0,A1)
     0x30:(A0=0,A1=0)
     0x31:(A0=0,A1=1)
     0x32:(A0=1,A1=0)
     0x33:(A0=1,A1=1) default
*/
DFRobot_BC20_IIC myBC20(0x33);

/******************HardwareSerial******************/
#elif defined(USE_HSERIAL)
/*
   For MEGA2560/ESP32 HardwareSerial
   Connect Instructions
   esp32      |               MEGA Series    |    Module(BC20)
   IO17       |               D16(RX)        |       D/T
   IO16       |               D17(TX)        |       C/R
   GND        |               GND            |       GND
   5V(USB) or 3V3(battery)  | 5V or 3V3      |       VCC
*/
#if defined(ARDUINO_ESP32_DEV)
HardwareSerial Serial2(2);
DFRobot_BC20_Serial myBC20(&Serial2);//ESP32HardwareSerial
#else
DFRobot_BC20_Serial myBC20(&Serial1);//others
#endif

/******************SoftwareSerial******************/
#elif defined(USE_SSERIAL)
/*
    For Arduino Series SoftwareSerial
    Connect Instructions
        UNO     |    Module(BC20)
      PIN_RXD   |       D/T
      PIN_TXD   |       C/R
        GND     |       GND
     5V or 3V3  |       VCC
*/
#define PIN_TXD   3
#define PIN_RXD   4
SoftwareSerial ss(PIN_RXD, PIN_TXD);
DFRobot_BC20_SW_Serial myBC20(&ss);
#endif

使用I2C接口时,若出现IIC地址冲突,可修改下面一条语句中的参数0x33以改变IIC地址。可使用的I2C地址共有4个,拨动模块上的拨码开关,调整A0和A1,并修改如下相应I2C地址,复位程序完成修改。
0x30:(A0=0,A1=0)
0x31:(A0=0,A1=1)
0x32:(A0=1,A1=0)
0x33:(A0=1,A1=1) 默认

DFRobot_BC20_IIC myBC20(0x33);

使用UART(硬件)接口时,波特率为115200,如下取消#define USE_HSERIAL注释,注释掉另外两个宏定义#define,完成硬串口的配置。

/*Communication by IIC*/
//#define USE_IIC

/*Communication by HardwareSerial*/
#define USE_HSERIAL

/*Communication by SoftwareSerial*/
//#define USE_SSERIAL

使用UART(软件)接口时,波特率为9600,如下取消#define USE_HSERIAL,注释掉另外两个宏定义#define,完成软串口的配置。

/*Communication by IIC*/
//#define USE_IIC

/*Communication by HardwareSerial*/
//#define USE_HSERIAL

/*Communication by SoftwareSerial*/
#define USE_SSERIAL

调整UART(软件)接口管脚,修改如下两个宏定义#define PIN_TXD和#define PIN_RXD的值,前者配置主控的发送端TXD(与模块的接收端相连),后者配置主控的接收端RXD(与模块的发送端相连)。

#define PIN_TXD   3
#define PIN_RXD   4
SoftwareSerial ss(PIN_RXD, PIN_TXD);
DFRobot_BC20_SW_Serial myBC20(&ss);

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/132135019
今日推荐