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

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/北斗精准定位 户外物联网必备
项目二十一:通过Easy-IOT平台发布消息

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

在这里插入图片描述
通过工作台,发送字符串命令“topic”和“data”

在这里插入图片描述

实验串口返回情况

在这里插入图片描述
IRQ:PSM休眠唤醒管脚,当模块处于PSM低功耗模式下,将该管脚拉高以唤醒模块。连接示意图如下:

在这里插入图片描述
中断唤醒实验实际接线图

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目二十二:串口监视器上可以看到NB模块被PSM周期性唤醒进入

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
  NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
  项目二十二:串口监视器上可以看到NB模块被PSM周期性唤醒进入
  实验接线:
  BC20       UNO
  VIN        5V
  GND        GND
  SCL        A5
  SDA        A4
  ISR        D2
*/

#include "DFRobot_BC20_Gravity.h"

//RGB有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);

/*
   唤醒UNO,
   模块上的 IRQ 引脚应连接到 WAKEUP_PIN
*/
#define WAKEUP_PIN 2

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("网络已连接!");

  //开启 PSM 模式(PSM 默认开启)
  myBC20.setPSMMode(ePSM_ON);


   /*
      深度/轻度睡眠模式。(CPU)
      处于深度睡眠模式时,BC20 不会响应来自主控面板的任何 AT 命令
      直到被STM32唤醒(再次BC20退出PSM)
      当进入 Light Sleep Mode 时,BC20 仍然可以接收来自 ESP32 的 AT 命令。
      但是,它的功耗比前者要大。
  */
  myBC20.configSleepMode(eSleepMode_DeepSleep);
}

void loop() {
    
    
  
  /*
    控制器和 BC20 由 UNO(在模块上)桥接。
    要将模块置于低功耗模式,
    将 UNO 置于深度睡眠模式。
    BC20 将自动进入最低功耗(PSM + 深度睡眠模式)。
    要唤醒模块,
    先唤醒UNO,再唤醒BC20。
  */

  // 使UNO进入睡眠模式。
  if (!myBC20.stmLowpower()) {
    
    
    Serial.println("UNO进入睡眠模式!");
  }

  delay(30000);

  //唤醒UNO
  Serial.println("唤醒UNO!");
  //IRQ 的上升沿唤醒 UNO
  myBC20.stmWakeup(WAKEUP_PIN);

  //从 PSM 和深度睡眠模式唤醒 BC20
  Serial.print("BC20正在醒来......");
  while (!myBC20.BC20Wakeup()) {
    
    
    Serial.print(".");
    delay(1000);
  }
  Serial.println("OK");
  delay(10000);
}

实验串口返回情况

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目二十三:在串行监视器上循环低功耗唤醒,然后将消息上传到云端

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
  NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
  项目二十三:在串行监视器上循环低功耗唤醒,然后将消息上传到云端
  实验接线:
  BC20       UNO
  VIN        5V
  GND        GND
  SCL        A5
  SDA        A4
  ISR        D2
*/

#include "DFRobot_BC20_Gravity.h"

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

//配置设备证书信息
char* Iot_id = "wGkCJkIng";
char* Client_ID  = "BC20 NB-IoT";
char* Iot_pwd    = "QMkC1kInRz";

//配置域名和端口号
char* EasyIot_SERVER = "182.254.130.180";
char* PORT = "1883";

//设置需要发布的设备编号
char* pubTopic = "hJmOvRIng";

//IIC通讯
#define USE_IIC

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

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

DFRobot_BC20_IIC myBC20(0x33);

//连接IRQ唤醒模块
#define WAKEUP_PIN 2

void ConnectCloud() {
    
    
  Serial.print("尝试MQTT连接... ");
  myBC20.changeColor(YELLOW);
  while (!myBC20.connected()) {
    
    
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);

    if (myBC20.connect(Client_ID, Iot_id, Iot_pwd)) {
    
    
      Serial.println("服务器可用");
    } else {
    
    

      //用于检测设备与服务器的连接
      if (myBC20.getQMTCONN())
        break;
    }
  }
}

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!");

  /*如果你使用的是大内存主控,你可以开启
    以下功能可查看SIM卡详情
    打印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("网络已连接!");

  Serial.println("连接到DFRobot Easy-IoT");

  //配置物联网服务器
  myBC20.setServer(EasyIot_SERVER, PORT);
  Serial.println("服务器可用!");

  //连接DFRobot Easy-IoT
  ConnectCloud();
  Serial.println("云连接成功!");

  //启用 PSM(调制解调器)
  myBC20.setPSMMode(ePSM_ON);

  //启用深度睡眠模式(CPU)
  myBC20.configSleepMode(eSleepMode_DeepSleep);
}

void loop() {
    
    
  Serial.println("发送消息到云端... ");
  myBC20.publish(pubTopic, "Hello");
  Serial.println("消息已发送");

  /*
    控制器和 BC20(NB-IoT 模块)由 UNO 桥接。
    要将模块置于低功耗模式,
    只需将 UNO 置于深度睡眠模式即可。
    BC20 将自动达到最低功耗(PSM + 深度睡眠模式)。
    要唤醒模块,
    先唤醒UNO,再唤醒BC20。
  */
  if (!myBC20.stmLowpower()) {
    
    
    Serial.println("UNO进入睡眠模式!");
  }

  //唤醒间隔
  delay(60000);

  // IRQ 的上升沿唤醒 UNO
  myBC20.stmWakeup(WAKEUP_PIN);
  Serial.println("UNO退出睡眠模式!");
  //唤醒 BC20
  myBC20.changeColor(WHITE);
  while (!myBC20.BC20Wakeup()) {
    
    
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }
  Serial.println("BC20 成功退出 PSM!");
}

在Easy-IOT平台工作间,可看到收到三条信息

在这里插入图片描述
UNO主板和BC20模块大概休眠50秒后发送一条信息,循环

在这里插入图片描述
实验串口返回情况

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/132138873