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/北斗精准定位 户外物联网必备
项目之一:通过 NB-IoT(移动站)获取本地日期和时间
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
项目之一:通过 NB-IoT(移动站)获取本地日期和时间
实验接线:
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);
void getLocalTime() {
//检查数据是否合法
myBC20.changeColor(PURPLE);
while (myBC20.getCLK()) {
if (sCLK.Year > 2000) {
break;
}
Serial.print(".");
myBC20.LED_ON();
delay(500);
myBC20.LED_OFF();
delay(500);
}
//日期
Serial.print((String)sCLK.Year + "/" + (String)sCLK.Month + "/" + (String)sCLK.Day + " ");
//时间
Serial.println((String)sCLK.Hour + ":" + (String)sCLK.Minute + ":" + (String)sCLK.Second);
}
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() {
//获取本地日期和时间并打印
getLocalTime();
delay(1000);
}
实验串口返回情况
程序每隔1s通过串口打印当前地区的日期(年月日)、时间(时分秒)和时区(格林威治时间GMT+XX)。
日期、时间和时区均获取于附近的蜂窝基站,而并非某个网络服务器。
实验场景图(模块放在窗台上)
安装图形化编程 Mind+
http://mindplus.cc/
打开扩展——选择用户库
搜索:https://gitee.com/chenqi1233/ext-BC20_NB-IoT
然后添加BC20 NB-IoT & GNSS库
BC20 NB-IoT & GNSS库相关积木
【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);
void setup() {
Serial.begin(115200);
//初始化BC20
Serial.print("正在启动BC20,请稍等...... ");
while (!myBC20.powerOn()) {
delay(1000);
Serial.print(".");
}
Serial.println("BC20 启动成功!");
}
void loop() {
myBC20.changeColor(RED); //改变为红色
//闪烁三次
for (int i = 0; i < 3; i++) {
myBC20.LED_ON(); //打开 LED
delay(100);
myBC20.LED_OFF(); //关闭 LED
delay(100);
}
myBC20.changeColor(BLUE); //改变为蓝色
for (int i = 0; i < 3; i++) {
myBC20.LED_ON();
delay(100);
myBC20.LED_OFF();
delay(100);
}
myBC20.changeColor(GREEN); //改变为绿色
for (int i = 0; i < 3; i++) {
myBC20.LED_ON();
delay(100);
myBC20.LED_OFF();
delay(100);
}
myBC20.changeColor(YELLOW); //改变为黄色
for (int i = 0; i < 3; i++) {
myBC20.LED_ON();
delay(100);
myBC20.LED_OFF();
delay(100);
}
myBC20.changeColor(PURPLE); //改变为紫色
for (int i = 0; i < 3; i++) {
myBC20.LED_ON();
delay(100);
myBC20.LED_OFF();
delay(100);
}
myBC20.changeColor(CYAN); //改变为青色
for (int i = 0; i < 3; i++) {
myBC20.LED_ON();
delay(100);
myBC20.LED_OFF();
delay(100);
}
myBC20.changeColor(WHITE); //改变为白色
for (int i = 0; i < 3; i++) {
myBC20.LED_ON();
delay(100);
myBC20.LED_OFF();
delay(100);
}
}
实验场景图 动态图