【TinkerNode NB-IoT 物联网开发板】测评(二)运行出厂默认...
【TinkerNode NB-IoT 物联网开发板】测评(二)运行出厂默认程序【TinkerNode NB-IoT 物联网开发板】测评(一)开箱验机
【TinkerNode NB-IoT 物联网开发板】测评(二)运行出厂默认程序
【TinkerNode NB-IoT 物联网开发板】测评(三)MQTT控制板载LED灯开关
【TinkerNode NB-IoT 物联网开发板】测评(四)移动应用开发
出厂默认程序真是个好东西,里面有七大功能,涵盖了TinkerNoder的主要功能。运行默认程序能够很快上手并了解设备,进而做进一步开发。
/*!
* @file Default_run.ino
* @brief This code is TinkerNode NB-IoT Dev Board(CH) quick start demo
*
* @n Short press SET to switch different modes.
* @n Long press SET for over 1 sec to turn on/off a specific mode.
* @n Mode cycle: 1->2->3->4->5->6->7->1...
* @n 1. Default mode. (rainbow);
* @n 2. NB-IoT signal detection mode. (White)
* @n 3. NB-IoT AT command mode. (Purple)
* @n 4. WiFi scan mode. (Yellow)
* @n 5. WiFi connection mode. (Green)
* @n 6. Bluetooth mode. (Blue)
* @n 7. GNSS mode. (Cyan)
*
* @n AT commands can be sent to the BC20 module via USB Serial.(NB-IoT AT command mode)
* @n Commonly used AT commands:
* @n AT - AT command test
* @n AT+QRST=1 - Reset BC20
* @n ATI - Revision of the firmware release
* @n AT+CSQ - Signal quality report
* @n 0 - <=-113 dBm
* @n 1 - -111 dBm
* @n 2 - -109 dBm
* @n 3 - -107 dBm
* @n ...
* @n 30 - -53 dBm
* @n 31 - >-51 dBm
* @n 99 - Not known or not detectable
* @n AT+CGATT? - PS attach or detach. Query network connection state.
* @n 0 - Disconnected from the network
* @n 1 - Connected to the network
* @n AT+CGATT=1 - Connect to the network
* @n AT+CGATT=0 - Disconnected from the network
* @n AT+CIMI - Query the IMSI number of BC20
* @n AT+CGSN=1 - Query the IMEI of the BC20.
* @n AT+CGSN=0 - Query the SN(Serial Number) of the BC20.
* @n AT+QCCID - USIM Card Identification(ICCID). This is usually used to check SIM card state.
* @n AT+CCLK? - Return current date and time
* @n AT+QPOWD=0 - Power off the module.(use "myBC20.powerOn()" to power on the module)
*
* @n The following AT commands are for GNSS:
* @n AT+QGNSSC? - Query GNSS power state
* @n 0 - GNSS power off
* @n 1 - GNSS power on
* @n AT+QGNSSC=1 - power on GNSS
* @n AT+QGNSSC=0 - power off GNSS
* @n AT+QGNSSRD? - Obtain all GNSS info
*
* @n For more details please refer to the "Quectel BC20 AT Commands Manual"
* @n or the "BC20 GNSS AT Commands Manual"
*
* @Copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @licence The MIT License (MIT)
* @author Wuxiao(xiao.wu@dfrobot.com)
* @versionV1.0
* @date2019-10-29
* @get from https://www.dfrobot.com
*/
#include <DFRobot_NeoPixel.h>
#include <WiFi.h>
#include <DFRobot_BC20.h>
#include "DFRobot_LED.h"
#include "DFRobot_BLESerial.h"
#include "time.h"
/*Functions definition*/
//Buttom SET connected to ESP32 pin13 pulled up with a 10K Ohm resistor
#define ButtonPin 13
#define Default 0
#define NB_SIGNAL 1
#define NB_SERIAL 2
#define WIFI_SCAN 3
#define WIFI_CONNECT 4
#define BLE 5
#define GNSS 6
DFRobot_BC20 myBC20;
DFRobot_LED LED;
DFRobot_BLESerial SerialBLE;
static uint8_t SysMode = 0;
bool ModeStatus = false;
static bool WaitingStart(uint8_t status) {
//Serial.println("standing by...");
while (!ModeStatus) {
if (SysMode == status) {
RGB_LED.Breathing();
} else {
return false;
}
}
return true;
}
static void Default_Fun() {
//Introduction: start the default mode, standby state
//Flash 5 times in white. No error, rainbow change, standby state. There are errors, red indicates various errors.
Serial.println("Default mode. Standing by...");
RGB_LED.clear();
RGB_LED.setColor(WHITE);
for (int i = 0; i < 5; i++) {
RGB_LED.FastFlash();
}
while (1) {
if (SysMode == Default) {
RGB_LED.rainbow(5);
} else {
break;
}
}
}
static void NB_Signal_Fun() {
/*
* Introduction:
* Turn on the BC20 and automatically connect to the network,
* print the signal strength through the serial port,
* and indicate the signal strength (high, medium, low) by the blinking frequency of the RGB or L indicator.
* RGB:
* Off - breathing light.
* When NB is connected, the signal strength is indicated by the frequency of the flashing light,
* which divided into three steps:
* Strong signal - fast flash
* Medium signal - slow flash
* Weak signal - burst flash.
*/
Serial.println("NB-IoT signal detection mode.");
Serial.println("Long press SET for over 1 sec to start...");
RGB_LED.clear();
RGB_LED.setColor(WHITE);
if (!WaitingStart(NB_SIGNAL)) return;
// Power on NB-IoT module BC20
Serial.print("Starting the BC20. Please wait... ");
while (!myBC20.powerOn()) {
RGB_LED.BurstFlash();
Serial.print(".");
}
Serial.println("BC20 started successfully !");
//Check whether a NB-IoT SIM card is available.
while (!myBC20.checkNBCard()) {
Serial.println("Please insert the NB SIM card !");
delay(1000);
}
myBC20.getGSN(IMEI);
Serial.print("BC20 IMEI: ");
Serial.println(sGSN.imei);
Serial.print("SIM card ICCID:");
Serial.println(myBC20.getQCCID());
Serial.print("SIM card IMSI: ");
Serial.println((char *)myBC20.getIMI());
Serial.println("Connecting network ");
//Check whether it is attached to the network
//BC20 will automatically connect and register on network after power on
while (myBC20.getGATT() == 0) {
Serial.print(".");
delay(1000);
}
Serial.println("Network connected!");
while (1) {
/*
* The RGB indicator is ONLY available when powered by USB or VIN(6-24V external)
* Uncomment the "led" related sentences and comment the "RGB" to use L(blue) indicator
* The blue LED can be used when RGB indicator is not available (i.e. powered by battery or solar)
*/
if (SysMode == NB_SIGNAL && ModeStatus == true) {
myBC20.getSQ();
//Signal quality RSSI<10, weak signal strength
if (sSQ.rssi < 10 || sSQ.rssi == 99) {
RGB_LED.BurstFlash();
//led.BurstFlash();
if (sSQ.rssi == 99) {
Serial.println("Signal not detectable");
} else if (sSQ.rssi == 0) {
Serial.println("Signal Strength: -113 dBm or less");
} else {
Serial.print("Signal Strength: ");
Serial.print((sSQ.rssi - 2) * 2 - 109);
Serial.println(" dBm Weak");
}
}
//Signal quality 10<=RSSI<25, medium signal strength
else if (sSQ.rssi >= 10&& sSQ.rssi < 25) {
RGB_LED.SlowFlash();
//led.SlowFlash();
Serial.print("Signal Strength: ");
Serial.print((sSQ.rssi - 2) * 2 - 109);
Serial.println(" dBm Medium");
}
//Signal quality RSSI>=25, strong signal strength
else if (sSQ.rssi >= 25) {
if (sSQ.rssi < 31) {
for (int i = 0; i < 5 ; i++) {
RGB_LED.FastFlash();
//led.FastFlash();
}
Serial.print("Signal Strength: ");
Serial.print((sSQ.rssi - 2) * 2 - 109);
Serial.println(" dBm Strong");
}
else if (sSQ.rssi == 31) {
Serial.print("Signal Strength: -51 dBm or greater");
}
}
}
else {
break;
}
}
}
static void NB_Serial_Fun() {
/*
* Introduction:
* Open BC20 and transparently transmit the serial data of PC (host computer) to BC20
* RGB:
* Off - breathing light
* NB module starting - slow flash
* Start complete -constantly Bright
*/
Serial.println("NB-IoT AT command mode.");
Serial.println("Long press SET for over 1 sec to start...");
RGB_LED.clear();
RGB_LED.setColor(PURPLE);
if (!WaitingStart(NB_SERIAL)) return;
Serial.print("Starting the BC20. Powering on");
while (!myBC20.powerOn()) {
if (SysMode == NB_SERIAL && ModeStatus == true) {
RGB_LED.SlowFlash();
Serial.print(".");
} else {
break;
}
}
RGB_LED.ConstantlyBright();
myBC20.ConfigSleepMode(eSleepMode_Disable);
Serial.println();
Serial.println("Configure the serial monitor as \"Carriage return\" before sending the AT commands");
Serial.println("For AT commands, please refer to \"Quectel BC20 AT commands Manual\"");
Serial.println("Send AT commands to configure:");
while (1) {
if (SysMode == NB_SERIAL && ModeStatus == true) {
if (Serial.available()) {
BC20Serial.write((char)Serial.read());
}
if (BC20Serial.available()) {
Serial.write((char)BC20Serial.read());
}
} else {
break;
}
}
}
static void WiFiScan() {
//Wifi scan function WIFI_Scan_Fun () subroutine
Serial.println("Scan starts.");
// WiFi.scanNetworks will return the number of networks found
int n = WiFi.scanNetworks();
Serial.println("scan done");
if (n == 0) {
Serial.println("no networks found");
} else {
Serial.print(n);
Serial.println(" networks found");
for (int i = 0; i < n; ++i) {
// Print SSID and RSSI for each network found
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(" dBm )");
Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");
delay(10);
}
}
Serial.println("");
}
static void WIFI_Scan_Fun() {
/*
* Introduction:
* Scan the current wifi signal and print the wifi name and model strength through the serial port
* RGB:
* Off - breathing light
* WiFi scan starting- constantly Bright
* Scanned wifi - fast flash 5 times
*/
Serial.println("WiFi scan mode.");
Serial.println("Long press SET for over 1 sec to start...");
RGB_LED.clear();
RGB_LED.setColor(YELLOW);
if (!WaitingStart(WIFI_SCAN)) return;
RGB_LED.ConstantlyBright();
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
while (1) {
if (SysMode == WIFI_SCAN && ModeStatus == true) {
WiFiScan();
for (int i = 0; i < 5 ; i++) {
RGB_LED.FastFlash();
}
} else {
break;
}
}
}
const char* ntpServer = "pool.ntp.org";
const longgmtOffset_sec = 8 * 3600;
const int daylightOffset_sec = 0;
void printLocalTime(){
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time");
return;
}
AnalysisTime(&timeinfo);
//Print the current time format as "YYYY/MM/DD, week, hh:mm:ss"
Serial.printf("%04d/%02d/%02d,", timeinfo.tm_year, timeinfo.tm_mon, timeinfo.tm_mday);
Serial.print(&timeinfo, "%A,");
Serial.printf("%02d:%02d:%02d GMT+8\r\n", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
}
static void WIFI_Connect_Fun() {
/* Introduction:
* User is required to enter the WiFi SSID and password to be connected.
* If it is unable to connect within 10s(timeout), It will require to enter the correct SSID and password again.
* After the WiFi is connected, current date and time will be calibrated through the Internet and printed
* every 1s.
* RGB:
* Off - breathing light.
* Enter SSID and password - slow flash .
* Connecting WiFi device - fast flash.
* Connected WiFi - constantly Bright.
*/
char str_temp;
uint8_t timeout_cnt = 0;
uint32_t timeStamp;
Serial.println("WiFi connection mode.");
Serial.println("Long press SET for over 1 sec to start...");
RGB_LED.clear();
RGB_LED.setColor(GREEN);
if (!WaitingStart(WIFI_CONNECT)) return;
String WiFi_SSID = "";
String WiFi_Password = "";
while (WiFi.status() != WL_CONNECTED) {
if (SysMode != WIFI_CONNECT || ModeStatus == false) return;
//Enter WiFi SSID and Password in serial monitor.
//End with "Newline" or "Carriage return"
Serial.print("Enter WiFi SSID: ");
while (1) {
if (Serial.available()) {
str_temp = (char)Serial.read();
if ( str_temp != '\n' && str_temp != '\r') {
WiFi_SSID = String(WiFi_SSID + str_temp);
} else {
break;
}
}
}
Serial.println(WiFi_SSID.c_str());
RGB_LED.SlowFlash();
while (Serial.available()) Serial.read();
Serial.print("Enter WiFi Password: ");
while (1) {
if (Serial.available()) {
str_temp = (char)Serial.read();
if (str_temp != '\n' && str_temp != '\r') {
WiFi_Password = String(WiFi_Password + str_temp);
}
else {
break;
}
}
}
Serial.println(WiFi_Password.c_str());
RGB_LED.SlowFlash();
while (Serial.available()) Serial.read();
WiFi.begin(WiFi_SSID.c_str(), WiFi_Password.c_str());
WiFi_SSID = "";
WiFi_Password = "";
timeStamp = millis();
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
RGB_LED.FastFlash();
Serial.print(".");
if (millis() - timeStamp > 10000) {
Serial.println("Connection timeout!");
break;
}
}
}
RGB_LED.ConstantlyBright();
Serial.println();
Serial.println("WiFi connected.");
Serial.print("IP Adderss: ");
Serial.println(WiFi.localIP());
//Init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
while (1) {
if (SysMode == WIFI_CONNECT && ModeStatus == true) {
//Print current time every second
printLocalTime();
delay(1000);
} else {
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
break;
}
}
}
/*BLE configuration*/
String BLE_Name = String("TinkerNode NB-IoT(0x" + String(random(0xFFFF), HEX) + ")");
uint8_t ble_first = 1;
static void BLE_Fun() {
/*
* Introduction:
* Creates a bridge between Serial and Classical Bluetooth (SPP)
* RGB:
* Off - breathing light.
*/
char strTemp;
Serial.println("Bluetooth mode.");
Serial.println("Long press SET for over 1 sec to start...");
RGB_LED.clear();
RGB_LED.setColor(BLUE);
if (!WaitingStart(BLE)) return;
if (ble_first) {
SerialBLE.begin(BLE_Name.c_str());
ble_first = 0;
} else {
}
Serial.println("The device started, now you can pair it with bluetooth!");
Serial.print("BLE device name: ");
Serial.println(BLE_Name);
while (1) {
if (SysMode == BLE && ModeStatus == true) {
if (Serial.available()) {
SerialBLE.write(Serial.read());
}
//Send character "0" to turn off L, "1" to turn on L and "1" to blink L
if (SerialBLE.available()) {
strTemp = SerialBLE.read();
if ( strTemp == '0') {
led.off();
Serial.println("L is OFF.");
}
else if ( strTemp == '1') {
led.on();
Serial.println("L is ON.");
}
else{
Serial.write(strTemp);
}
}
} else {
break;
}
}
}
void Display_Location_Information() {
Serial.print("Time:\t\t");
Serial.print(sCLK.Year);
Serial.print("/");
Serial.printf("%02d", sCLK.Month);
Serial.print("/");
Serial.printf("%02d ", sCLK.Day);
Serial.printf(" %02d", sCLK.Hour);
Serial.printf(":%02d", sCLK.Minute);
Serial.printf(":%02d\r\n", sCLK.Second);
Serial.print("Latitude:\t");
Serial.print(sGGNS.LatitudeVal, 6);
Serial.print(" ");
Serial.println(sRMC.LatitudeDir);
Serial.print("Longitude:\t");
Serial.print(sGGNS.LongitudeVal, 6);
Serial.print(" ");
Serial.println(sRMC.LongitudeDir);
Serial.print("Altitude:\t");
Serial.print(sGGNS.Altitude, 1);
Serial.println(" m");
Serial.print("Speed:\t\t");
Serial.print(sGGNS.Speed);
Serial.println(" km/h");
Serial.print("Heading:\t");
Serial.print(sGGNS.Heading);
Serial.println(" deg");
Serial.print("Status:\t\t");
Serial.println(sGGNS.FixStatus);
Serial.print("PDOP:\t\t");
Serial.println(sGGNS.PDOP);
Serial.print("HDOP:\t\t");
Serial.println(sGGNS.HDOP);
Serial.print("VDOP:\t\t");
Serial.println(sGGNS.VDOP);
Serial.println();
}
void Display_Satellite_Information() {
Serial.print(sSAT.NUM);
Serial.println(" in view.");
Serial.print(sSAT.USE);
Serial.println(" in used.");
Serial.print("PRN:\t");
Serial.print("Elev:\t");
Serial.print("Azim:\t");
Serial.print("SNR:\t");
Serial.print("SYS:\t");
Serial.println("Used:");
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");
Serial.print(sSAT.data.Azim);
Serial.print("\t");
Serial.print(sSAT.data.SNR);
Serial.print("\t");
Serial.print(sSAT.data.SYS);
Serial.print("\t");
Serial.println(sSAT.data.Status);
}
}
static void GNSS_Fun() {
/*
* Introduction:
* Open GNSS BCSS to obtain positioning related information
* RGB:
* Off - breathing light.
* Open (search star) - fast flash.
* Connected (positioning via satellite) - Constantly Bright.
*/
Serial.println("GNSS mode.");
Serial.println("Long press SET for over 1 sec to start...");
RGB_LED.clear();
RGB_LED.setColor(CYAN);
WaitingStart(GNSS);
if (!WaitingStart(GNSS)) return;
Serial.print("Starting the BC20.Please wait. . . ");
while (!myBC20.powerOn()) {
delay(1000);
Serial.print(".");
}
Serial.println();
Serial.println("BC20 started successfully !");
Serial.println("check OK");
if (myBC20.getQGNSSC() == OFF) {
Serial.println("GNSS is ON");
myBC20.setQGNSSC(ON);
}
while (1) {
if (SysMode == GNSS && ModeStatus == true) {
myBC20.getQGNSSRD();
//Dispaly basic info of GNSS
Display_Location_Information();
//Dispaly satellite info of GNSS
Display_Satellite_Information();
Serial.println("");
if (!sRMC.PositioningMode.equals("N")) {
for (int i = 0; i < 5 ; i++)RGB_LED.FastFlash();
} else {
RGB_LED.SlowFlash();
}
}
else {
break;
}
}
}
void setup() {
Serial.begin(115200);
RGB_LED.begin();
RGB_LED.setBrightness(MIDDLE);
pinMode(ButtonPin, INPUT);
attachInterrupt(ButtonPin, IntFun, CHANGE);
//Print info. and instructions
Serial.println();
Serial.println("------------------------------------------------------------");
Serial.println("Welcome to TinkerNode NB-IoT Dev Board(CH) quick start demo.");
Serial.println("------------------------------------------------------------");
Serial.println("Short press SET to switch different modes");
Serial.println("Long press SET for over 1 sec to turn on/off a specific mode");
Serial.println("Mode cycle: 1->2->3->4->5->6->7->1...");
Serial.println("1. Default mode. (rainbow)");
Serial.println("2. NB-IoT signal detection mode. (White)");
Serial.println("3. NB-IoT AT command mode. (Purple)");
Serial.println("4. WiFi scan mode. (Yellow)");
Serial.println("5. WiFi connection mode. (Green)");
Serial.println("6. Bluetooth mode. (Blue)");
Serial.println("7. GNSS mode. (Cyan)");
}
void loop() {
switch (SysMode) {
case NB_SIGNAL:
NB_Signal_Fun();
break;
case NB_SERIAL:
NB_Serial_Fun();
break;
case WIFI_SCAN:
WIFI_Scan_Fun();
break;
case WIFI_CONNECT:
WIFI_Connect_Fun();
break;
case BLE:
BLE_Fun();
break;
case GNSS:
GNSS_Fun();
break;
default:
Default_Fun();
break;
}
}
static uint32_t nextTime = 0;
void IntFun() {
if (digitalRead(ButtonPin) == HIGH) {
//long press: hold over 1 sec
if (millis() - nextTime > 1000) {
if ( ModeStatus == false) {
ModeStatus = true;
Serial.println("Starting...");
} else {
ModeStatus = false;
Serial.println("Turning off...");
}
}
//short press: 100 ms debounce
else if (millis() - nextTime > 100) {
ModeStatus = false;
SysMode++;
if (SysMode > 6) {
SysMode = 0;
}
Serial.println("Switching mode...");
}
}
else {
}
nextTime = millis();
}
因为板子写过其他程序,所以需要重新烧录出厂默认程序。
开发板在出厂前已烧录程序,便于用户体验与验证开发板的主要功能。程序包括下面7个功能,短按SET在7种功能中循环切换,长按SET打开/关闭该功能:
"每次按SET切换到下一个功能,该功能都默认处于关闭状态(无论之前是否打开过),需要再长按SET才能开启该功能。"
* @n Short press SET to switch different modes.
* @n Long press SET for over 1 sec to turn on/off a specific mode.
* @n Mode cycle: 1->2->3->4->5->6->7->1...
* @n 1. Default mode. (rainbow);
* @n 2. NB-IoT signal detection mode. (White)
* @n 3. NB-IoT AT command mode. (Purple)
* @n 4. WiFi scan mode. (Yellow)
* @n 5. WiFi connection mode. (Green)
* @n 6. Bluetooth mode. (Blue)
* @n 7. GNSS mode. (Cyan)
1.RGB七彩变换:上电默认运行。板载RGB灯进行七彩变换,可验证RGB灯是否正常显示。
这个模式无需长按,上电后自动运行。
2.NB-IoT信号测试:RGB指示灯白色。
[*]爆闪:信号弱(-95 dBm或以下),0.1s亮,2.9s灭。
[*]慢闪:信号中等(-93 ~ - 65 dBm之间),1s亮,1s灭。
[*]快闪:信号强(- 63 dBm或以上),0.1s亮,0.1s灭。
我测试的时候是慢闪,1秒亮,1秒灭。
下面的动图可以看到模式的切换。
在NB IOT模式下从串口监视器可以看到IMIE、SIM卡的UUID和IMSI
3.NB-IoT AT指令串口透传:RGB指示灯紫色。
* @n AT commands can be sent to the BC20 module via USB Serial.(NB-IoT AT command mode)
* @n Commonly used AT commands:
* @n AT - AT command test
* @n AT+QRST=1 - Reset BC20
* @n ATI - Revision of the firmware release
* @n AT+CSQ - Signal quality report
4.WiFi信号扫描:RGB指示灯黄色。
会扫描wifi信号,最后显示所有扫描到的wifi的SSID及信号强度。
5.WiFi连接:RGB指示灯绿色。
输入SSID和密码登录wifi,注意大小写。连接成功后会显示IP地址、时间、时区。
6.蓝牙BLE透传:RGB指示灯蓝色。
手机上运行nRF Connect,扫描蓝牙,在发现的设备中找到TinkerNode NB-IoT(0xXXXX),其中XXXX为随机的十六进制数,我这里是0XAA55。
发送0,关闭板载LED灯,发送1,点亮板载LED灯。
串口监视器接收到相应内容;
如果在串口监视器发送信息,手机上会接受到相应信息。
下面为演示视频:
https://v.qq.com/x/page/l0938yw4pbu.html
7.GNSS定位:RGB指示灯青色。
下面的动图可以看到模式刚启动时各参数都显示不出来,随着信号的稳定,参数慢慢出现。
页:
[1]