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

news2024/11/26 16:46:13

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平台发布消息(数字0或1),唤醒BC20模块

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
  NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
  项目二十四:通过Easy-IOT平台发布消息(数字0或1),唤醒BC20模块
  实验接线:
  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

//配置参数休眠模式
#define  SLEEP_INTERVAL 10000
static uint32_t timeStamp = 0;
bool sleepFlag = false;

//配置设备证书信息
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);

/*
   每次模块收到消息时,都会调用此函数。
   它将打印消息和相应的主题。
*/
void callback(char * topic, uint8_t * payload, unsigned int len) {
  Serial.print("接收[主题:");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < len; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
  timeStamp = millis();
  sleepFlag = true;
}

void ConnectCloud() {
  Serial.print("尝试MQTT连接...");
  while (!myBC20.connected()) {
    Serial.print(".");
    if (myBC20.connect(Client_ID, Iot_id, Iot_pwd)) {
      Serial.println("连接服务器正常");
    } else {

      //用于检测设备与服务器的连接
      if (myBC20.getQMTCONN())
        break;
    }
  }
  
  while (!myBC20.subTopic('0', '1',pubTopic, '0')) {
    Serial.print(".");
  }
  Serial.print("主题:");
  Serial.print(pubTopic);
  Serial.println("已经订阅了!");
}

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.print("检查SIM卡...");
  myBC20.changeColor(GREEN);
  while (!myBC20.checkNBCard()) {
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }
  Serial.println("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.print("正在连接网络......");
  myBC20.changeColor(BLUE);
  while (myBC20.getGATT() == 0) {
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }
  Serial.println("已连接!");

  //设置回调函数
  myBC20.setCallback(callback);

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

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

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

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

  //当进入 PSM 时,BC20 将不会收到任何从云端发出的消息。
  //禁用 PSM
  myBC20.setPSMMode(ePSM_OFF);

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

void loop() {
  myBC20.loop();

 /*
     笔记:
     1.云端发送的第一条消息是唤醒模块。
     此消息将被丢弃。
     2.第二条消息和后面的消息将被接收并打印
     在模块进入睡眠模块之前。
     3.当模块再次进入睡眠模式时,又一次唤醒信息
     在发送有效消息之前需要。
     4.确定进入每个睡眠模式的时间间隔
     按 SLEEP_INTERVAL。
  */

  if (sleepFlag == true) {
    if (millis() - timeStamp > SLEEP_INTERVAL) {
      sleepFlag = false;

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

通过Easy-IOT平台发布消息(数字0或1),唤醒BC20模块

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

在这里插入图片描述

DFRobot_BC20_Gravity库部分函数

/**
   * @用于以布尔返回值打开BC20。  
   */  
  bool powerOn(void);  

  /**
   * @用于检查是否存在带有bool返回值的NB卡
   */  
  bool  checkNBCard(void);
  
  /**
   * @对于网络连接,成功返回1,失败返回0
   */  
  uint8_t  getGATT(void);

  /**
   * @用于配置bc20的休眠模式,参数为枚举类型
   */
  typedef enum {
    eSleepMode_Disable,   
    eSleepMode_DeepSleep  
    eSleepMode_Light   
  }eSleepMode_t;
  
  bool  configSleepMode(eSleepMode_t mode);
  
  /**
   * @获得扩展信号质量 
   */  
  void  getESQ(void);
  
  /**
   * @获取网络注册状态   
   */  
  void  getEREG(void);
  
  /**
   * @获取PDP地址
   */
  void  getGPADDR(void);
  
  /**
   * @对于bc20的远程固件升级,参数为升级的url
   */
  bool  setQFOTADL(String url);
  
  /**
   * @用于检测当前设备是否连接
   */
  bool  connected();
  
  /***
   * @用于将设备连接到服务器
   */
  bool  connect(char * clientID, char * username,char * password,char connectID ='0');
  
  /**
   * @用于检测设备和服务器之间的连接
   */
  bool  getQMTCONN(void);
  
  /**
   * @用于连接物联网站点
   */
  bool  setServer(char* IPAddress,char* port,char connectID = '0');

DFRobot_BC20_Gravity库部分函数之二

/**
   * @用于向服务器发送消息,参数说明:第一个参数用于指定主题,  
   * @第二个参数是要发送的具体数据
   */
  bool  publish(char* topic,char* msg);
  
  /**
   * @这个函数用于在服务器发送给订阅者时接收数据
   */
  void  loop();
  
  /**
   * @订阅的第三个参数是指定主题
   */
  bool  subTopic(char connectID, char msgID, char* topic, char qos);
  
  /**
   * @用于模块电源控制。如果返回值为1,则模块处于供电状态;
   * @如果返回值为0,模块处于掉电状态   
   */
  uint8_t  getQGNSSC(void);
  
  /**
   * @用于获取指定的卫星信息,该参数用于指定要获取的信息类型。
   * @参数选择如下:
   */
  bool  getQGNSSRD(char* sth);
  
  /**
   * @这两个函数用于控制led灯的亮灭
   */
  void  LED_ON();void LED_OFF();
  
  /**
   * @获取NB卡的序列号
   */
  void  getGSN(uint8_t cmd=0);
  
  /**
   * @获取SIM卡号
   */
  String  getQCCID(void);
  
  /**
   * @获取当前网络时间
   */
  String  getCLK(void);
  
  /**
   * @用于通过外部中断唤醒开发板,外部中断引脚输出信号
   */
  bool  stmWakeup(uint8_t Awake_Pin);
  
  /**
   * @用于获取当前网络信号的强度
   */
  void  getSQ(void);
  
  /**
   * @检查来自 BC20 的数据
   */
  void  available(void);

  /**
   * @发送单个字符到 bc20
   */
  void  sendATCMDBychar(void);

  /**
   * @Receive bc20 返回的数据
   */
  void  readData(void);

  /**
   * @用于处理接收数据的格式
   */
  void setCallback(void (*call)(char*, uint8_t*, unsigned int));

DFRobot_BC20_Gravity库部分函数之三

  /**
   * @用于控制LED灯的颜色
   * @它的参数是字符串
   * @"LED_R_ON";"LED_R_OFF";
   * @"LED_G_ON";"LED_G_OFF";
   * @"LED_B_ON";"LED_B_OFF";
   * @"LED_P_ON";"LED_P_OFF";
   * @"LED_C_ON";"LED_C_OFF";
   * @"LED_W_ON";"LED_W_OFF";
   * @"LED_B_ON";"LED_Y_OFF";
   */
  void controlLED(String str);

  void changeColor(uint8_t newColor);
  
  /**
   * @设置低功耗模式
   */ 
  bool setPSMMode(ePSM_t status);
  typedef enum {
    ePSM_OFF,
    ePSM_ON,
    ePSM_OFF_ResetParam
  } ePSM_t; 

  /**
    * @启用/禁用深度睡眠唤醒指示
    * @参数是宏观定义的
    * @开或关
   */ 
  bool setQATWAKEUP(uint8_t enable);
  
  /**
   * @进入低功耗模式
   */
  void stmLowpower();
  
  /**
   * @发送命令,参数可以是String/char/uint8_t 
   * @这些参数由AT指令集决定
   */
  void sendATCMD(char* str);
  
  void LEDFlash(String Color);
  
  /**
   * @发送命令,参数可以是String/char/uint8_t 
   * @这些参数由AT指令集决定
   */
  bool stmWakeup(uint8_t Awake_Pin);
  
  bool BC20Wakeup();

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/847859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

保障容器应用安全的6个建议

虽然容器技术出现已经超过了十年时间&#xff0c;但由于其应用的轻量性、快捷性和灵活性&#xff0c;使得容器应用的流行程度一直保持了快速的增长趋势&#xff0c;并逐渐成为云原生环境中部署业务应用和工作负载的不二选择。在容器应用快速普及的发展背景下&#xff0c;要确保…

塔里木水系分布图

声明&#xff1a;来源网络&#xff0c;仅供学习&#xff01;

Netty自定义编码解码器

上次通信的时候用的是自带的编解码器&#xff0c;今天自己实现一下自定义的。 1、自定义一下协议 //协议类 Data public class Protocol<T> implements Serializable {private Long id System.currentTimeMillis();private short msgType;// 假设1为请求 2为响应privat…

小兔鲜项目 uniapp (1)

目录 项目架构 uni-app小兔鲜儿电商项目架构 小兔鲜儿电商课程安排 创建uni-app项目 1.通过HBuilderX创建 2.通过命令行创建 pages.json和tabBar案例 uni-app和原生小程序开发区别 用VS Code开发uni-app项目 拉取小兔鲜儿项目模板代码 基础架构–引入uni-ui组件库 操…

大模型:突破AI的边界

引言 人工智能&#xff08;AI&#xff09;在过去几年中取得了巨大的进展&#xff0c;其中大模型被认为是取得这些进展的关键因素之一。大模型具有更多的参数、更强的表达能力和更高的预测性能&#xff0c;对自然语言处理、计算机视觉和强化学习等任务产生了深远的影响。本文将探…

赛码网-Light 100%AC代码(C++)

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在准备秋招&#xff0c;一直在练习编程。 ⏩本篇文章对赛码网的 Light 题目做一个…

pocky-request网络请求插件

插件下载地址&#xff1a;https://ext.dcloud.net.cn/plugin?id468 插件&#xff1a;https://www.yuque.com/pocky/aaeyux/irx7u0#Oosbz 使用教程&#xff1a; 下载插件main.js中配置&#xff1a; // 导入 import axiosRequest from ./js_sdk/pocky-request/pocky-request…

Vben框架使用小记

渲染表格可展开内容&#xff1a; <!-- 这里是一个具名插槽&#xff0c;渲染可展开的内容模板 --><template #expandedRowRender"{ record }">效果图&#xff1a;

企业举办活动邀请媒体的意义和重要性

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 企业举办活动并邀请媒体的意义和重要性是多方面的&#xff0c;主要有以下一些&#xff1a; 1. 品牌曝光与宣传&#xff1a;邀请媒体参与企业活动可以提高企业的品牌曝光度。媒体报道能够…

PHP实现保质期计算器

1.php实现保质期计算&#xff0c; 保质期日期可选&#xff0c;天 、月、年 2. laravel示例 /*** 保质期计算器* return void*/public function expirationDateCal(){$produce_date $this->request(produce_date); // 生产日期$warranty_date $this->reques…

2023最新性能测试面试题(带答案)

一、性能测试开展过程&#xff1a; 答&#xff1a;第一步&#xff1a;找产品沟通哪些接口需要压测&#xff0c;需要达到什么样的预期值(TPS和响应时间) 第二步&#xff1a;编写测试计划&#xff0c;人员、时间周期、工具 第三步&#xff1a;环境搭建 第四步&#xff1a;造数…

现在pmp还值得去考试吗?

一&#xff0c;为什么要考PMP&#xff1f; 1. PMP认证在项目管理领域具有极高的认可度&#xff0c;是全球通用的认证&#xff0c;不仅局限于某一行业或地区。目前已有超过43万人参加了PMP考试。 2. PMP持证者的薪资和收入潜力都有明显优势。根据PMI发布的《薪酬力&#xff1a…

记录一次electron打包提示文件找不到的解决方法

没有配置files选项 files的作用是配置打包到应用程序的构建资源 就是说如果你想使用项目那个目录下的文件 就得通过files配置一下不然就会报错 json文件或者yml文件会报的错 格式是这样的 "files": ["dist-electron", "dist"],electron打包配…

JAVASE---方法的使用

方法概念及使用 什么是方法(method) 方法就是一个代码片段. 类似于 C 语言中的 "函数"。方法存在的意义(不要背, 重在体会): 1. 是能够模块化的组织代码(当代码规模比较复杂的时候)。 2. 做到代码被重复使用, 一份代码可以在多个位置使用。 3. 让代码更好理解更简单…

人民日报点赞!十大央媒争相报道,星恒守护民生安全出行二十年

围绕电动自行车锂电池的安全性话题&#xff0c;甚至说争议&#xff0c;在近期有了权威定调。 就在7月底&#xff0c;“民生出行&#xff0c;安全为本——电动自行车锂电安全调研座谈会”在北京人民日报社举行&#xff0c;国家监管部门、行业协会、检验院所的权威领导专家&#…

kube-prometheus 使用blackbox进行icmp 监控

安装kube-prometheus 后默认在monitoring namespace中有创建 blackbox-exporter deployment。但默认没有icmp的module配置&#xff0c;无法执行ping探测。因为即使有icmp module&#xff0c;默认配置也是无法执行ping探测的&#xff08;这篇文章要解决的就是这个问题&#xff0…

hive编译报错整理

背景 最近在修hive-1.2.0的一个bug&#xff0c;需要修改后重新打包部署到集群&#xff0c;打包的时候报下面的错误&#xff0c;原因很简单&#xff0c;从远程仓库里面已经拉不到这个包了。 org.pentaho:pentaho-aggdesigner-algorithm:jar:5.1.5-jhyde was not found in http…

【Rust】Rust学习 第六章枚举和模式匹配

本章介绍 枚举&#xff08;enumerations&#xff09;&#xff0c;也被称作 enums。枚举允许你通过列举可能的 成员&#xff08;variants&#xff09; 来定义一个类型。首先&#xff0c;我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来&#xff0c;我们会…

设计模式行为型——观察者模式

目录 什么是观察者模式 观察者模式的实现 观察者模式角色 观察者模式类图 观察者模式举例 观察者模式代码实现 观察者模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式…

【css】渐变

渐变是设置一种颜色或者多种颜色之间的过度变化。 两种渐变类型&#xff1a; 线性渐变&#xff08;向下/向上/向左/向右/对角线&#xff09; 径向渐变&#xff08;由其中心定义&#xff09; 1、线性渐变 语法&#xff1a;background-image: linear-gradient(direction, co…