驴友花雕 发表于 2021-9-6 13:43:48

实验硬件说明
1、NB-IoT天线
NB-IoT通信和GNSS定位功能需要外接天线。用户可使用产品包装中所提供的天线,也可额外购买兼容的外接天线以进一步增强收发信号的能力或作为备用。

开发板支持B5/B8这两个频段的NB-IoT通信,而目前国内移动、电信、联通三大运营商NB-IoT也主要运行在在这两个频段,具体参数如下:
国内NB-IoT主要运营商与通信频段



用户可使用覆盖B5/B8频段(即工作频率在824MHz~960MHz)的PCB天线(产品附送)、FPC柔性PCB天线、弹簧天线、胶棒天线等各类天线,通常用于2G/GSM/GPRS蜂窝通信的天线也可用于NB-IoT通信(只要工作频率覆盖B5/B8频段),需要注意天线的接头为1代 IPEX接头。

2、GNSS天线
开发板支持GPS/BeiDou(北斗)双星定位导航,具体参数如下:
GNSS工作频段



用户可使用有源GPS/BeiDou(北斗)双频陶瓷天线,也可使用单频的有源GPS或BeiDou(北斗)陶瓷天线,需要注意天线的接头为1代 IPEX接头。
建议使用正方形的右旋圆极化有源陶瓷天线,以便和卫星信号极化匹配,获得更好的信号。陶瓷天线形状为正方形的为右旋圆极化,长方形为线极化。
不建议使用无源天线。无源天线需要配合LNA放大器来提高接收信号的强度,而开发板并未搭载LNA放大器。

驴友花雕 发表于 2021-9-6 13:48:35

3、SIM卡
NB-IoT通信需要专用的NB-IoT物联网SIM卡,如手机SIM卡,4G物联网卡等其它类型的SIM卡无法代替。目前产品包装内包含有一张中国联通NB-IoT物联网专用SIM卡,包含一份年度基础套餐,插入NB-IoT开发板或通信模组内即可使用,若流量满足不了使用需求,可通过充值月度流量包增加当月流量。后续将会推出更多运营商的NB-IoT物联网专用SIM卡供用户选择。联通NB-IoT SIM卡资费情况如下表:



注意
#根据国家工业和信息化部等六部门要求,为有效防范和打击通讯信息诈骗,所有NB-IoT物联网专用SIM卡均具有机卡绑定功能,不可取消。
#SIM卡插入设备,首次上电(与基站)成功通信即视为激活且与通信模组绑定(机卡绑定),开始年度计费周期(360天)。
#2G/3G/4G手机SIM卡或大流量物联网卡无法代替用于NB-IoT设备。
#物联网SIM卡不能用于手机、平板、2G/3G/4G模组等非NB-IoT设备,否则会导致SIM卡停机。
#已机卡绑定的SIM卡若被插入其它设备内进行通信会导致SIM卡停机。
#物联网SIM卡仅能数据传输,无语音通信和短信功能。
#用户可通过微信搜索并关注公众号“DF物联网”,自助查询SIM流量使用情况或对SIM卡进行充值。

驴友花雕 发表于 2021-9-6 17:28:29

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十二:通过串口查询全球导航卫星系统GGA协议的信息

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十二:通过串口查询全球导航卫星系统GGA协议的信息
实验接线:
BC20       UNO
VIN      5V
GND      GND
SCL      A5
SDA      A4
*/

#include "DFRobot_BC20_Gravity.h"

//RGB有7种颜色可供选择
#defineRED 0
#defineBLUE 1
#defineGREEN 2
#defineYELLOW 3
#definePURPLE 4
#defineCYAN 5
#defineWHITE 6

//IIC通讯
#define USE_IIC

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

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

DFRobot_BC20_IIC myBC20(0x33);
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 启动成功!");

//禁用睡眠模式
myBC20.configSleepMode(eSleepMode_Disable);

//启动 GNSS
Serial.print("打开全球导航卫星系统...");
myBC20.setQGNSSC(ON);
myBC20.changeColor(YELLOW);
if (myBC20.getQGNSSC() == OFF) {
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
}
Serial.println("GNSS 开启");
myBC20.changeColor(CYAN);
}

void loop() {
myBC20.getQGNSSRD(NMEA_GGA);
/*
   UTC 时间,格式:hhmmss.ss,例如。162436.54 => 16:24:36.54
   h - 小时
   m - 分钟
   s - 秒
*/
Serial.print("UTC 时间: ");
Serial.println(sGGA.UTC_Time());

/*
   纬度,格式:ddmm.mmmmm,例如。3150.7820 => 31 度 50.7820 分钟
   d - 度
   m - 分钟
*/
Serial.print("纬度: ");
Serial.print(sGGA.LatitudeVal());
Serial.print(" ");
/*
   北纬或南纬
   N - 北
   S - 北
*/
Serial.println(sGGA.LatitudeDir());

/*
   经度,格式:dddmm.mmmmm,例如。12135.6794 => 121 度 35.6794 分钟
   d - 度
   m - 分钟
*/
Serial.print("经度: ");
Serial.print(sGGA.LongitudeVal());
Serial.print(" ");

/*
   经度标识
   E - 东
   W - 西
*/
Serial.println(sGGA.LongitudeDir());

/*
   修复状态
   0 - 度
   1 - GPS 定位
   2 - DGPS 修复
*/
Serial.print("修复状态: ");
Serial.println(sGGA.Status());

//使用的卫星数量 (0 - 24)
Serial.print("卫星数量: ");
Serial.print(sGGA.StatelliteNum());
Serial.println(" 颗在使用中");

//显示水平精度因子
Serial.print("水平精度因子: ");
Serial.println(sGGA.HDOP());

//海拔,根据WGS84椭球的高度,单位为米
Serial.print("海拔: ");
Serial.print(sGGA.Altitude());
Serial.println(" m");

//地理ID分隔,WGS84 椭球以上GeoID(指海平面)的高度,单位为米
Serial.print("地理ID分隔: ");
Serial.print(sGGA.GeoID_Separation());
Serial.println(" m");

//DGPS数据的累计时间,不使用DGPS则为空,单位为秒
Serial.print("DGPS 计时: ");
Serial.println(sGGA.DGPS_Age());

//DGPS站号,如果不使用DGPS则为空
Serial.print("DGPS站号: ");
Serial.println(sGGA.DGPS_StationID());
Serial.println();
myBC20.clearGPS();
myBC20.LED_ON();
delay(500);
myBC20.LED_OFF();
#ifndef ARDUINO_ESP32_DEV
delay(500);
#else
delay(5000);
#endif
}

驴友花雕 发表于 2021-9-6 17:29:50

实验串口返回情况


驴友花雕 发表于 2021-9-6 17:44:56

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十三:通过串口查询全球导航卫星系统GLL协议的信息

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十三:通过串口查询全球导航卫星系统GLL协议的信息
实验接线:
BC20       UNO
VIN      5V
GND      GND
SCL      A5
SDA      A4
*/

#include "DFRobot_BC20_Gravity.h"

//RGB有7种颜色可供选择
#defineRED 0
#defineBLUE 1
#defineGREEN 2
#defineYELLOW 3
#definePURPLE 4
#defineCYAN 5
#defineWHITE 6

//IIC通讯
#define USE_IIC

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

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

DFRobot_BC20_IIC myBC20(0x33);

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 启动成功!");

//禁用睡眠模式
myBC20.configSleepMode(eSleepMode_Disable);

//启动 GNSS
Serial.print("打开全球导航卫星系统...");
myBC20.setQGNSSC(ON);
myBC20.changeColor(YELLOW);
if (myBC20.getQGNSSC() == OFF) {
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
}
Serial.println("GNSS 开启");
myBC20.changeColor(CYAN);
}

void loop() {
myBC20.getQGNSSRD(NMEA_GLL);

/*
    UTC 时间,格式:hhmmss.ss,例如。162436.54 => 16:24:36.54
    h - 小时
    m - 分钟
    s - 秒
*/
Serial.print("UTC 时间: ");
Serial.println(sGLL.UTC_Time());

/*
   纬度,格式:ddmm.mmmmm,例如。3150.7820 => 31 度 50.7820 分钟
   d - 度
   m - 分钟
*/
Serial.print("纬度: ");
Serial.print(sGLL.LatitudeVal());

/*
   北纬或南纬
   N - 北
   S - 北
*/
Serial.print(" ");
Serial.println(sGLL.LatitudeDir());

/*
   经度,格式:dddmm.mmmmm,例如。12135.6794 => 121 度 35.6794 分钟
   d - 度
   m - 分钟
*/
Serial.print("经度: ");
Serial.print(sGLL.LongitudeVal());
Serial.print(" ");

   /*
   经度标识
   E - 东
   W - 西
*/
Serial.println(sGLL.LongitudeDir());

/*
   数据状态
   V - 无效
   一个有效的
*/
Serial.print("数据状态: ");
Serial.println(sGLL.DataStatus());

/*
   定位方式
   N - 没有修复
   A - 自主 GPS 定位
   D - 差分 GPS 定位
*/
Serial.print("定位模式: ");
Serial.println(sGLL.PositionMode());
Serial.println();
Serial.println();
myBC20.clearGPS();

myBC20.LED_ON();
delay(500);
myBC20.LED_OFF();
#ifndef ARDUINO_ESP32_DEV
delay(500);
#else
delay(5000);
#endif
}

驴友花雕 发表于 2021-9-6 17:46:28

实验串口返回情况


驴友花雕 发表于 2021-9-6 17:54:54

NMEA协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The National Marine Electronics Associa-tion)制定的一套通讯协议。GPS接收机根据NMEA-0183协议的标准规范,将位置、速度等信息通过串口传送到PC机、MCU等设备。

NMEA-0183协议是GPS接收机应当遵守的标准协议,也是目前GPS接收机上使用最广泛的协议,大多数常见的GPS接收机、GPS数据处理软件、导航软件都遵守或者至少兼容这个协议。

NMEA通讯协议所规定的通讯语句都已是以ASCII码为基础的,NMEA-0183协议语句的数据格式如下:“$”为语句起始标志;“,”为域分隔符;“ *”为校验和识别符,其后面的两位数为校验和,代表了“$”和“*”之间所有字符的按位异或值(不包括这两个字符)。

NMEA0183标准语句(GPS常用语句)

$GPGLL
例:$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D
字段0:$GPGLL,语句ID,表明该语句为Geographic Position(GLL)地理定位信息
字段1:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段2:纬度N(北纬)或S(南纬)
字段3:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段4:经度E(东经)或W(西经)
字段5:UTC时间,hhmmss.sss格式
字段6:状态,A=定位,V=未定位
字段7:校验值


驴友花雕 发表于 2021-9-6 18:58:31

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十四:通过串口查询全球导航卫星系统GSA协议的信息

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十四:通过串口查询全球导航卫星系统GSA协议的信息
实验接线:
BC20       UNO
VIN      5V
GND      GND
SCL      A5
SDA      A4
*/

#include "DFRobot_BC20_Gravity.h"

//RGB有7种颜色可供选择
#defineRED 0
#defineBLUE 1
#defineGREEN 2
#defineYELLOW 3
#definePURPLE 4
#defineCYAN 5
#defineWHITE 6

//IIC通讯
#define USE_IIC

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

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

DFRobot_BC20_IIC myBC20(0x33);

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 启动成功!");

//禁用睡眠模式
myBC20.configSleepMode(eSleepMode_Disable);

//启动 GNSS
Serial.print("打开全球导航卫星系统...");
myBC20.setQGNSSC(ON);
myBC20.changeColor(YELLOW);
if (myBC20.getQGNSSC() == OFF) {
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
}
Serial.println("GNSS 开启");
Serial.println("查询全球导航卫星系统GSA协议");
myBC20.changeColor(CYAN);
}

void loop() {
myBC20.getQGNSSRD(NMEA_GSA);

Serial.print("模式\t\t");
for (uint8_t i = 0; i < sGSA.NUM; i++) {
    /*
       选择 2D 或 3D 修复
       'M'=手动,强制切换2D/3D模式
       'A'=允许自动切换2D/3D模式
    */
    Serial.print(sGSA.data.Mode());
    Serial.print("\t\t");
}
Serial.println();

Serial.print("修复状态\t");
for (uint8_t i = 0; i < sGSA.NUM; i++) {
    Serial.print(sGSA.data.FixStatus());
    Serial.print("\t\t");
}
Serial.println();

Serial.print("系统ID\t");
for (uint8_t i = 0; i < sGSA.NUM; i++) {
    Serial.print(sGSA.data.GNSS_SystemID());
    Serial.print("\t\t");
}
Serial.println();

//每个频道使用的卫星列表
for (uint8_t i = 0; i < 12; i++) {
    Serial.print("CH");
    Serial.print(i + 1);
    Serial.print("\t\t");
    for (uint8_t j = 0; j < sGSA.NUM; j++) {
      Serial.print(sGSA.data.Statellite_CH(i));
      Serial.print("\t\t");
    }
    Serial.println();
}
//水平精度因子
Serial.print("水平精度因子\t\t");
for (uint8_t i = 0; i < sGSA.NUM; i++) {
    Serial.print(sGSA.data.PDOP());
    Serial.print("\t\t");
}
Serial.println();

//垂直精度因子
Serial.print("垂直精度因子\t\t");
for (uint8_t i = 0; i < sGSA.NUM; i++) {
    Serial.print(sGSA.data.HDOP());
    Serial.print("\t\t");
}
Serial.println();

Serial.print("VDOP\t\t");
for (uint8_t i = 0; i < sGSA.NUM; i++) {
    Serial.print(sGSA.data.VDOP());
    Serial.print("\t\t");
}
Serial.println();

Serial.println();
myBC20.clearGPS();

myBC20.LED_ON();
delay(500);
myBC20.LED_OFF();
#ifndef ARDUINO_ESP32_DEV
delay(500);
#else
delay(5000);
#endif
}

驴友花雕 发表于 2021-9-6 18:59:55

实验串口返回情况


驴友花雕 发表于 2021-9-6 19:01:32

NMEA0183标准语句(GPS常用语句)


$GPGSA
例:$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A
字段0:$GPGSA,语句ID,表明该语句为GPS DOP and Active Satellites(GSA)当前卫星信息
字段1:定位模式,A=自动2D/3D,M=手动2D/3D
字段2:定位类型,1=未定位,2=2D定位,3=3D定位
字段3:PRN码(伪随机噪声码),第1信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段4:PRN码(伪随机噪声码),第2信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段5:PRN码(伪随机噪声码),第3信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段6:PRN码(伪随机噪声码),第4信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段7:PRN码(伪随机噪声码),第5信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段8:PRN码(伪随机噪声码),第6信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段9:PRN码(伪随机噪声码),第7信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段10:PRN码(伪随机噪声码),第8信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段11:PRN码(伪随机噪声码),第9信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段12:PRN码(伪随机噪声码),第10信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段13:PRN码(伪随机噪声码),第11信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段14:PRN码(伪随机噪声码),第12信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)
字段15:PDOP综合位置精度因子(0.5 - 99.9)
字段16:HDOP水平精度因子(0.5 - 99.9)
字段17:VDOP垂直精度因子(0.5 - 99.9)
字段18:校验值



驴友花雕 发表于 2021-9-6 19:21:27

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十五:通过串口查询全球导航卫星系统GSV协议的信息

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十五:通过串口查询全球导航卫星系统GSV协议的信息
实验接线:
BC20       UNO
VIN      5V
GND      GND
SCL      A5
SDA      A4
*/

#include "DFRobot_BC20_Gravity.h"

//RGB有7种颜色可供选择
#defineRED 0
#defineBLUE 1
#defineGREEN 2
#defineYELLOW 3
#definePURPLE 4
#defineCYAN 5
#defineWHITE 6

//IIC通讯
#define USE_IIC

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

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

DFRobot_BC20_IIC myBC20(0x33);

void Display_Satellite_Information() {
Serial.print(sSAT.NUM);
Serial.println(" 颗卫星在视图中");

//卫星 PRN 号码
Serial.print("卫星编号\t");

//仰角,单位为度
Serial.print("仰角(度)\t");

//方位角,单位度
Serial.print("方位角(度)\t");

//信噪比,单位 dBHz
Serial.print("信噪比(dBHz)\t");
Serial.println("系统");
for (uint8_t i = 0; i < sSAT.NUM; i++) {
    Serial.print(sSAT.data.PRN());
    Serial.print("\t");
    Serial.print(sSAT.data.Elev());
    Serial.print("\t\t");
    Serial.print(sSAT.data.Azim());
    Serial.print("\t\t");
    Serial.print(sSAT.data.SNR());
    Serial.print("\t\t");
    Serial.println(sSAT.data.SYS());
}
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 启动成功!");

//禁用睡眠模式
myBC20.configSleepMode(eSleepMode_Disable);

//启动 GNSS
Serial.print("打开全球导航卫星系统...");
myBC20.setQGNSSC(ON);
myBC20.changeColor(YELLOW);
if (myBC20.getQGNSSC() == OFF) {
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
}
Serial.println("GNSS 开启");
myBC20.changeColor(CYAN);
}

void loop() {
myBC20.getQGNSSRD(NMEA_GSV);
Display_Satellite_Information();
myBC20.clearGPS();

myBC20.LED_ON();
delay(500);
myBC20.LED_OFF();
#ifndef ARDUINO_ESP32_DEV
delay(500);
#else
delay(5000);
#endif
}

驴友花雕 发表于 2021-9-6 19:22:49

实验串口返回情况


驴友花雕 发表于 2021-9-6 19:24:30

NMEA0183标准语句(GPS常用语句)


$GPGSV
例:$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70
字段0:$GPGSV,语句ID,表明该语句为GPS Satellites in View(GSV)可见卫星信息
字段1:本次GSV语句的总数目(1 - 3)
字段2:本条GSV语句是本次GSV语句的第几条(1 - 3)
字段3:当前可见卫星总数(00 - 12)(前导位数不足则补0)
字段4:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
字段5:卫星仰角(00 - 90)度(前导位数不足则补0)
字段6:卫星方位角(00 - 359)度(前导位数不足则补0)
字段7:信噪比(00-99)dbHz
字段8:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
字段9:卫星仰角(00 - 90)度(前导位数不足则补0)
字段10:卫星方位角(00 - 359)度(前导位数不足则补0)
字段11:信噪比(00-99)dbHz
字段12:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)
字段13:卫星仰角(00 - 90)度(前导位数不足则补0)
字段14:卫星方位角(00 - 359)度(前导位数不足则补0)
字段15:信噪比(00-99)dbHz
字段16:校验值


驴友花雕 发表于 2021-9-6 19:43:29

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十六:通过串口查询全球导航卫星系统RMC协议的信息

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十六:通过串口查询全球导航卫星系统RMC协议的信息
实验接线:
BC20       UNO
VIN      5V
GND      GND
SCL      A5
SDA      A4
*/

#include "DFRobot_BC20_Gravity.h"

//RGB有7种颜色可供选择
#defineRED 0
#defineBLUE 1
#defineGREEN 2
#defineYELLOW 3
#definePURPLE 4
#defineCYAN 5
#defineWHITE 6

//IIC通讯
#define USE_IIC

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

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

DFRobot_BC20_IIC myBC20(0x33);

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 启动成功!");

//禁用睡眠模式
myBC20.configSleepMode(eSleepMode_Disable);

//启动 GNSS
Serial.print("打开全球导航卫星系统...");
myBC20.setQGNSSC(ON);
myBC20.changeColor(YELLOW);
if (myBC20.getQGNSSC() == OFF) {
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
}
Serial.println("GNSS 开启");
Serial.println("查询全球导航卫星系统RMC协议");
myBC20.changeColor(CYAN);
}

void loop() {
myBC20.getQGNSSRD(NMEA_RMC);

//UTC 日期,格式:ddmmyy,例如,290519 = 2019/05/29
Serial.print("UTC 日期: ");
Serial.println(sRMC.UTC_Date());

/*
   UTC 时间,格式:hhmmss.ss,例如。162436.54 = 16:24:36.54
   h - 小时
   m - 分钟
   s - 秒
*/
Serial.print("UTC 时间: ");
Serial.println(sRMC.UTC_Time());

/*
   数据状态
   V - 无效
   一个有效的
*/
Serial.print("数据状态: ");
Serial.println(sRMC.DataStatus());

/*
   纬度,格式:ddmm.mmmmm,例如。3150.7820 => 31 度 50.7820 分钟
   d - 度
   m - 分钟
*/
Serial.print("纬度: ");
Serial.print(sRMC.LatitudeVal());
Serial.print(" ");

/*
   北纬或南纬
   N - 北
   S - 南
*/
Serial.println(sRMC.LatitudeDir());

/*
   经度,格式:dddmm.mmmmm,例如。12135.6794 => 121 度 35.6794 分钟
   d - 度
   m - 分钟
*/
Serial.print("经度: ");
Serial.print(sRMC.LongitudeVal());
Serial.print(" ");

/*
   东经或西经
   E - 东
   W - 西
*/
Serial.println(sRMC.LongitudeDir());

//地速,对地速度,单位为节
Serial.print("地速: ");
Serial.print(sRMC.GroundSpeed());
Serial.println(" 节");

//地面航向,单位为度
Serial.print("地面航向: ");
Serial.println(sRMC.GroundHeading());

//磁偏角,单位为度
Serial.print("磁偏角: ");
Serial.println(sRMC.MagDeclination());

//磁偏角方向,磁偏角 E/W 指示器
Serial.print("磁偏角方向: ");
Serial.println(sRMC.MagDeclinationDir());

/*
   定位方式
   N - 没有修复
   A - 自主 GPS 定位
   D - 差分 GPS 定位
*/
Serial.print("定位模式: ");
Serial.println(sRMC.PositioningMode());

   /*
   导航状态
   V - 无效
*/
Serial.print("导航状态: ");
Serial.println(sRMC.NaviStatus());
Serial.println();
Serial.println();
myBC20.clearGPS();

myBC20.LED_ON();
delay(500);
myBC20.LED_OFF();
#ifndef ARDUINO_ESP32_DEV
delay(500);
#else
delay(5000);
#endif
}

驴友花雕 发表于 2021-9-6 19:45:13

实验串口返回情况


驴友花雕 发表于 2021-9-6 19:46:34

NMEA0183标准语句(GPS常用语句)


$GPRMC
例:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息
字段1:UTC时间,hhmmss.sss格式
字段2:状态,A=定位,V=未定位
字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段4:纬度N(北纬)或S(南纬)
字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段6:经度E(东经)或W(西经)
字段7:速度,节,Knots
字段8:方位角,度
字段9:UTC日期,DDMMYY格式
字段10:磁偏角,(000 - 180)度(前导位数不足则补0)
字段11:磁偏角方向,E=东W=西
字段16:校验值


驴友花雕 发表于 2021-9-6 20:00:28

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十七:通过串口查询全球导航卫星系统VTG协议的信息

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十七:通过串口查询全球导航卫星系统VTG协议的信息
实验接线:
BC20       UNO
VIN      5V
GND      GND
SCL      A5
SDA      A4
*/

#include "DFRobot_BC20_Gravity.h"

//RGB有7种颜色可供选择
#defineRED 0
#defineBLUE 1
#defineGREEN 2
#defineYELLOW 3
#definePURPLE 4
#defineCYAN 5
#defineWHITE 6

//IIC通讯
#define USE_IIC

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

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

DFRobot_BC20_IIC myBC20(0x33);

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 启动成功!");

//禁用睡眠模式
myBC20.configSleepMode(eSleepMode_Disable);

//启动 GNSS
Serial.print("打开全球导航卫星系统...");
myBC20.setQGNSSC(ON);
myBC20.changeColor(YELLOW);
if (myBC20.getQGNSSC() == OFF) {
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
}
Serial.println("GNSS 开启");
Serial.println("查询全球导航卫星系统VTG协议");
myBC20.changeColor(CYAN);
}

void loop() {
myBC20.getQGNSSRD(NMEA_VTG);

//地面路线(真),以度为单位
Serial.print("地面路线: ");
Serial.print(sVTG.GroundCourse_True());
Serial.println(" 度");

//对地航向(磁性),单位为度
Serial.print("对地航向: ");
Serial.print(sVTG.GroundCourse_Mag());
Serial.println(" 度");

//对地速度,单位为节
Serial.print("地速: ");
Serial.print(sVTG.GroundCourse_Knots());
Serial.println(" 节");

//对地速度,单位公里/小时
Serial.print("地速: ");
Serial.print(sVTG.GroundCourse_Kmh());
Serial.println(" km/h");

/*
   定位方式
   N - 没有修复
   A - 自主 GPS 定位
   D - 差分 GPS 定位
*/
Serial.print("定位模式: ");
Serial.println(sVTG.PositioningMode());
Serial.println();
Serial.println();
myBC20.clearGPS();

myBC20.LED_ON();
delay(500);
myBC20.LED_OFF();
#ifndef ARDUINO_ESP32_DEV
delay(500);
#else
delay(5000);
#endif
}

驴友花雕 发表于 2021-9-6 20:02:00

实验串口返回情况


驴友花雕 发表于 2021-9-6 20:03:20

NMEA0183标准语句(GPS常用语句)


$GPVTG
例:$GPVTG,89.68,T,,M,0.00,N,0.0,K*5F
字段0:$GPVTG,语句ID,表明该语句为Track Made Good and Ground Speed(VTG)地面速度信息
字段1:运动角度,000 - 359,(前导位数不足则补0)
字段2:T=真北参照系
字段3:运动角度,000 - 359,(前导位数不足则补0)
字段4:M=磁北参照系
字段5:水平运动速度(0.00)(前导位数不足则补0)
字段6:N=节,Knots
字段7:水平运动速度(0.00)(前导位数不足则补0)
字段8:K=公里/时,km/h
字段9:校验值

驴友花雕 发表于 2021-9-6 20:18:09

使用DFRobot Easy-IoT测试BC20模块云端通信

登录Easy-IoT物联网云平台,点击右上角的注册/登录
https://iot.dfrobot.com.cn/



驴友花雕 发表于 2021-9-6 20:29:52

登录后会自动跳转到工作间。首先点击添加新的设备新增随机生成一个Topic。此外注意到左边栏,点击重新生成右边的眼睛按钮,平台已经自动为用户分配随机生成当前账号的Iot_id和Iot_pwd。

为了后续让设备与平台正常通信,就需要记录这里的三个参数,填入代码中

Iot_id:HJZv1ZFRSQ
Iot_pwd:ByfP1-YABX
Topic:JoUOAg_WR



页: 1 2 3 [4] 5 6
查看完整版本: 【Arduino】168种传感器系列实验(209)---移远 BC20 NB+GNSS模块