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/北斗精准定位 户外物联网必备
项目之十:通过 USB 串口向 BC20 模块发送 AT 命令
实验开源代码
/*【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备项目之十:通过 USB 串口向 BC20 模块发送 AT 命令实验接线:BC20 UNOVIN 5VGND GNDSCL A5SDA A4
*/#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_SSERIALDFRobot_BC20_IIC myBC20(0x33);void setup() {Serial.begin(115200);myBC20.LED_OFF();//初始化 BC20Serial.print("正在启动BC20,请稍等...... ");myBC20.changeColor(RED);while (!myBC20.powerOn()) {Serial.print(".");myBC20.LED_ON();delay(500);myBC20.LED_OFF();delay(500);}Serial.println("BC20 启动成功!");/* 每次开机时都会自动启用深度睡眠模式。当进入此模式时,BC20 不会响应任何来自控制器的 AT 命令禁用睡眠模式以确保 BC20 始终响应 AT 命令*/myBC20.configSleepMode(eSleepMode_Disable);/* * 每个 AT 命令应以“AT”或“at”开头,以“回车”结尾。* 命令可以是大写或小写,比如:“AT+CSQ”或“at+csq”。*/Serial.println("输入 AT 命令:");
}void loop() {//*与 BC20 的串行透传if (Serial.available()) {myBC20.sendATCMDBychar((char)Serial.read());}if (myBC20.available()) {Serial.println(myBC20.readData());}
}
实验串口返回情况
常用的AT命令:
AT - AT 命令测试
AT+QRST=1 - 重置 BC20
ATI - 固件版本的修订
AT+CSQ - 信号质量报告
0 - <=-113 dBm
1 - -111 dBm
2 - -109 dBm
3 - -107 dBm
… …
30 - -53 dBm
31 - >-51 dBm
99 - 未知或无法检测
AT+CGATT - PS 附加或分离。查询网络连接状态。
0 - 与网络断开连接
1 - 已连接到网络
AT+CGATT=1 - 连接到网络
AT+CGATT=0 - 断开网络连接
AT+CIMI - 查询BC20的IMSI号
AT+CGSN=1 - 查询BC20的IMEI。
AT+CGSN=0 - 查询 BC20 的 SN(序列号)。
AT+QCCID - USIM 卡标识 (ICCID)。这通常用于检查 SIM 卡状态。
AT+CCLK - 返回当前日期和时间
AT+QPOWD=0 - 关闭模块电源。(使用“myBC20.powerOn()”打开模块电源)
以下 AT 命令用于 GNSS:
AT+QGNSSC - 查询GNSS电源状态
0 - GNSS 电源关闭
1 - GNSS 开机
AT+QGNSSC=1 - 打开 GNSS
AT+QGNSSC=0 - 关闭 GNSS
AT+QGNSSRD - 获取所有 GNSS 信息
更多详情请参考《移远通信BC20 AT指令手册》
或“BC20 GNSS AT 命令手册”
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目十一:最简单的BC20模块测试程序:测量NB-IoT的信号强度
实验开源图形编程(Mind+、Mixly、编玩边学)
实验串口返回情况
实验硬件说明
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放大器。
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卡进行充值。
【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 UNOVIN 5VGND GNDSCL A5SDA A4
*/#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_SSERIALDFRobot_BC20_IIC myBC20(0x33);
void setup() {Serial.begin(115200);myBC20.LED_OFF();//初始化 BC20Serial.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);//启动 GNSSSerial.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.54h - 小时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_DEVdelay(500);
#elsedelay(5000);
#endif
}
实验串口返回情况
G P G G A 例: GPGGA 例: GPGGA例:GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,0000*1F
字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息
字段1:UTC 时间,hhmmss.sss,时分秒格式
字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)
字段3:纬度N(北纬)或S(南纬)
字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)
字段5:经度E(东经)或W(西经)
字段6:GPS状态,0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算
字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)
字段8:HDOP水平精度因子(0.5 - 99.9)
字段9:海拔高度(-9999.9 - 99999.9)
字段10:地球椭球面相对大地水准面的高度
字段11:差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
字段12:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)
字段13:校验值