1. 简介
TinkerNode NB-IoT物联网开发板是ESP32平台(WiFi+Bluetooth4.0)的具有NB-IoT低功耗蜂窝通信和GPS/BeiDou双星精确定位功能的四模低功耗物联网开发硬件平台,为广大创客和软硬件开发者提供NB-IoT项目开发与制作的全方位支持,一板玩转物联网。
开发板在不到一半手掌大的面积上集成了ESP32主控模组、NB-IoT/GNSS通信模组、RGB指示灯、按钮、电源管理系统等功能,并通过过孔焊盘引出如IIC、SPI、UART等所有常用的IO、通信接口和电源管脚,性能强悍,扩展性极强。最难得的是,在开发板集成了专用的太阳能电源管理芯片和多电源管理电路,可直接使用5V太阳能板给3.7V锂电池充电和系统供电,同时支持MPPT,最大化太阳能板的输出效率,实现系统在户外应用场景的不间断供电,免去定期充电维护的麻烦。而对于之前已经使用过ESP32平台(如:FireBeetle、掌控、乐鑫官方开发板等)的用户,可以方便地将之前的Arduino程序移植到这块新主控板,在尽享ESP32主控模组所有的强大功能和低功耗能力之余,还能根据我们所提供的丰富示例代码和不断更新的配套项目教程,加入NB-IoT通信和GNSS定位导航相关的代码,快速掌握与实现户外物联网项目的搭建。
2. 物联网与NB-IoT简介
物联网(The Internet of things,IoT)顾名思义,就是物与物相连的互联网。这有两层意思:第一,物联网的核心和基础仍然是互联网,是在互联网基础上的延伸和扩展的网络;第二,其用户端延伸和扩展到了任何物品与物品之间,进行信息交换和通信。
**窄带物联网(Narrow Band Internet of Things,NB-IoT)**是物联网领域一个新兴的技术,主要用于低移动性、小数据量、对时延不敏感的连接服务,其支持低功耗设备在网络中的数据传输,因此也是一种低功耗广域网(Low Power Wide Area Network,LPWAN)通信技术。相对于被逐渐淘汰的2G通信,NB-IoT具有三大优势:
- 大连接:海量链接的能力,在同一基站的情况下, NB-IoT 可以比现有无线技术提供 50~100 倍的接入数。一个扇区能够支持,10 万个连接,设备成本与功耗有效降低,网络架构得到优化。
- 广覆盖:在同样的频段下, NB-IoT比现有的网络增益提升了 20 dB,相当于提升了 100 倍的覆盖面积。
- 低功耗:NB-IoT借助 PSM(Power Saving Mode,节电模式)和 eDRX(Extended Discontinuous Reception,超长非连续接收)可实现更长待机。
3. 特性
- 移动、电信、联通三大运营商NB-IoT全网通,广覆盖、大连接、低功耗
- GPS/BeiDou双星精确定位,设备位置实时监控
- 太阳能、锂电池、USB、6-24V供电,安全、高效、灵活的全方位电源管理
- 支持5V太阳能板供电/充电,户外物联永不断电
- ESP32双核低功耗主控,WiFi+BT4.0二合一
- 内置8MB微型U盘,数据轻松记录与导出
4. 应用场景
NB-IoT原型开发
- 数据手册、原理图、底层驱动开源开放
- 提供NB-IoT物联网专用卡进行开发与测试
- 双星定位,进一步拓宽户外应用场景
户外物联网(NB-IoT+GPS/BeiDou)
- 太阳能自动气象/环境监控站
- 车载GPS定位追踪器
- 自动水电气抄表
- 智能路灯管理
- 共享单车
室内物联网(WiFi+BT4.0)
- 智能门锁
- 室内环境监控
- 照明自动化控制
- WiFi智能控制网关
5. 技术规格
主控制器 乐鑫ESPRESSIF ESP32
- 处理器:Tensilica LX6双核处理器(一核处理高速连接;一核独立应用开发)
- 主频:240MHz
- SRAM:520KB
- Flash:16MB
- Wi-Fi标准:FCC/CE/TELEC/KCC
- Wi-Fi协议:802.11 b/g/n/d/e/i/k/r (802.11n,速度高达150 Mbps)
- 频率范围:2.4~2.5 GHz
- 蓝牙协议:符合蓝牙v4.2 BR/EDR和BLE标准
- 蓝牙音频:CVSD和SBC音频低功耗:10uA
- 频率范围:2.4~2.5GHz
- 深度休眠功耗:<10uA @ RTC定时器+RTC存储器工作(仅ESP32芯片)
NB-IoT通信模组 移远QUECTEL BC20
- 通信频段:B5/B8(移动、电信、联通NB-IoT全网通)
- 传输速率:16.7 kbps(上行),25.5 kbps(下行)
- GNSS导航定位系统:GPS/BeiDou(北斗)双星导航定位
- 支持DFOTA差分固件升级
- 深度休眠功耗:<5uA @ Modem处于PSM,CPU处于深度休眠,GNSS关闭
IO接口
- 通用数字I/O:5个
- 模拟输入(12位):2个
- SPI:1个
- I2C:1个
- UART(兼容3.3V/5V):1个
电源管理
- USB:5V,供电数据二合一
- 电池(BAT):3.7V锂电池
- 太阳能(SOLAR IN):5V太阳能板
- 外部供电(VIN):6V - 24V
- 最大充电电流:500mA
- 集成3.7V锂电池充电功能,USB、太阳能、外部供电任一接口均可充电
- 太阳能支持MPPT注1,最大化太阳能板利用率
其它功能与特性
-
开发环境:支持Win7,Win10
-
开发工具与语言:支持Arduino IDE,C/C++
-
RGB全彩状态指示灯
-
电池、太阳能板、外部供电防反接(带反接指示LED)
-
充电指示LED、自定义指示LED
-
系统复位RST和设置SET按键
-
自弹式防反插micro SIM卡座
-
u.FL外接天线接口:2个(NB-IoT外接PCB天线,GPS/BeiDou外接有源陶瓷天线)
-
尺寸:65.0×31.0 mm
-
重量:14g (仅主板)
-
工作温度:-40℃~+85℃
- 注1:采用恒定电压比例MPPT算法,与DFR0559 太阳能电源管理模块5V使用相同主芯片方案,当使用太阳能板供电时,可最大化太阳能板的输出效率。
6. 接口说明
7. 系统原理框图
8. 快速使用
8.1 硬件连接
- 连接GNSS导航定位天线:将GPS/BeiDou陶瓷有源天线连接在开发板背面标有GNSS的u.FL天线连接座。
注意
- 蓝色导热硅胶垫(带双面3M胶)作为双面胶使用(并非用于散热),用于固定陶瓷天线,贴于天线背部金属屏蔽壳与固定物表面之间。
- 连接NB-IoT天线:将PCB天线(标有GSM Band Antenna)连接在开发板背面标有NB的u.FL天线连接座。PCB天线有两种规格尺寸,两种规格尺寸的天线性能相同,发货时随机发放。
注意
- PCB天线背后有3M双面胶,撕开保护层后可贴附于非金属表面,在非金属箱体中使用,如:水质监控站或太阳能气象站的塑料防水盒,项目制作常用的亚克力表面。但是不能贴附于金属表面或在金属箱体中使用,否则会严重影响信号质量。
- 插入SIM卡:将NB-IoT物联网专用SIM卡从大卡里取出,裁成micro SIM卡大小并插入开发板背面标有MICRO-SIM的SIM卡座中,当卡正确插到底后,会听到轻微的咔一声,SIM卡被扣住。SIM卡座具有防反接功能,当插卡方向不正确,卡座将无法插到底,也无法扣住SIM卡。
- 连接PC:使用USB数据线将开发板与PC相连。
8.2 安装开发板驱动
- TinkerNode NB-IoT 物联网开发板需要专用驱动程序,否则无法上传程序(无串口)或弹出微型U盘。目前仅支持Windows系统(Win7、Win10)。点击下载专用驱动程序,解压缩压缩包,双击驱动安装包341dz_sign.exe,如下图点击安装即可。
如果如法下载,请点击:专用驱动程序
注意
- 若安装驱动后,设备管理器中提示Windows 无法验证此设备所需的驱动程序的数字签名,点击查看解决方案。
- 驱动安装好后下面将介绍在Arduino IDE中安装开发板的板卡驱动包。打开Arduino IDE,首先需要添加开发板驱动的下载地址。菜单栏中选择File->Preferences(或使用快捷键“ctrl+ ,”)。
- 点击Additional Boards Manager URLs右边的小图标。
- 在弹出窗口的最后一行,如图复制开发板驱动的URL地址:https://downloadcd.dfrobot.com.cn/TinkerNode-NB-IoT/package_TinkerNode-NB-IoT_index.json
- 分别在Additional Boards Manager URLs和Preferences窗口点击OK确认。
- 菜单栏中选择Tools->Board->Boards Manager...
- 弹出Boards Manager开发板管理器,管理器会自动更新板卡信息。
- 等待更新完成后,搜索栏输入TinkerNode,选择TinkerNode_NB-IoT,选择最新版本的开发板驱动,单击Install安装驱动。
- 成功安装完成后会显示INSTALLED已安装,关闭该窗口即可。
- 菜单栏中选择Tools->Board->TinkerNode NB-IoT (CH),此时可向开发板烧录程序或查看串口打印的数据。
- 开发板所有的相关样例代码,可在菜单栏中选择File->Examples->Examples for TinkerNode NB-IoT (CH),其中DFRobot_NBIoT目录为开发板专用的样例代码,NB-IoT通信与串口调试、GNSS定位、NB-IoT低功耗收发、RGB灯光控制、数据记录仪datalogger、电池电量监控等功能的样例代码均在此,其它目录为ESP32的通用样例代码,用户可通过这些通用样例学习掌握ESP32的各类基本功能与应用开发。
8.3 运行出厂默认程序
- 开发板在出厂前已烧录程序,便于用户体验与验证开发板的主要功能。程序包括下面7个功能,短按SET在7种功能中循环切换,长按SET打开/关闭该功能:
1.RGB七彩变换:上电默认运行。板载RGB灯进行七彩变换,可验证RGB灯是否正常显示。
2.NB-IoT信号测试:RGB指示灯白色。自动尝试连接NB-IoT网络,并串口打印各类联网信息和当前NB-IoT信号强度(单位:dBm),同时通过RGB灯的闪烁频率来表示三种信号强度。
- **爆闪:**信号弱(-95 dBm或以下),0.1s亮,2.9s灭。
- **慢闪:**信号中等(-93 ~ - 65 dBm之间),1s亮,1s灭。
- **快闪:**信号强(- 63 dBm或以上),0.1s亮,0.1s灭。
3.NB-IoT AT指令串口透传:RGB指示灯紫色。用户可使用Arduino IDE自带的串口监视器或第三方的串口助手向开发板输入AT指令,该指令将会通过ESP32透传至NB-IoT通信模组BC20,可使用注释中提供的常用AT指令对BC20进行测试。完整的AT指令可参考该文档最后的附件BC20软硬件开发资料包中的相关用户手册。
4.WiFi信号扫描:RGB指示灯黄色。每隔5s扫描并打印当前环境的WiFi信号及其相应的信号强度。
5.WiFi连接:RGB指示灯绿色。用户可根据提示,在串口监视器,输入WiFi SSID(WiFi名称)和密码以连接相应的WiFi信号,若SSID或密码任一输入错误,连接会超时,程序会要求重新输入SSID或密码。若WiFi成功连接,ESP32会利用网络服务器校准RTC,并每秒打印一次日期和时间。
6.蓝牙BLE透传:RGB指示灯蓝色。程序广播TinkerNode NB-IoT(0xXXXX)蓝牙信号,其中XXXX为随机的十六进制数,用于与其它蓝牙信号作区别。用户可使用第三方的手机APPBLE蓝牙串口助手连上该蓝牙信号,即可与开发板通过蓝牙进行串口透传通信。当开发板收到字符“1”时,指示灯L点亮;收到字符“0”时,指示灯L熄灭,接收到的其它字符将会打印到串口监控器上。
注意
- 使用手机系统自带的蓝牙信号搜索功能无法搜出蓝牙信号。
7.GNSS定位:RGB指示灯青色。程序通过串口打印所有GNSS定位和卫星信息,如当地时间,经纬度,所使用的卫星等信息。首次获取GNSS定位信号通常需要30s以上,请耐心等待。
注意
- GPS/BeiDou陶瓷有源天线的陶瓷面应该面向天空,尽可能在室外使用,否则无法获取有效的定位信息。
-
第一部分为定位信息:
- 时间与日期(Time):2019/10/15 08:01:10表示当地时间与日期为2019年10月15日,17时01分10秒(北京时间)。需要注意的是,这里8时是指格林尼治时间GMT+0,北京时间为GMT+8,需要用户手动加上8小时才能得到北京时间,也可以自行根据经纬度计算出当地时区,从而自动换算出当地时间。
- 纬度坐标(Latitude):单位,度。31.204395 deg N表示北纬31.204395°,精确到小数点后6位。南纬用S表示。
- 经度坐标(Longitude):单位,度。121.599236 deg E表示东经121.599236°,精确到小数点后6位。西经用W表示。
- 海拔高度(Altitude):单位,m。WGS84 椭球面为基准。
- 对地速度(Speed):单位,km/h。由于数据会有一定抖动,可能出现在静止状态时也不为零的情况。
- 对地朝向(Heading):单位,度。
- 定位状态(Status):为2D fix或3D fix,代表成功定位。
- N:数据无效
- 2D fixed,3D fixed:2维定位,3维定位。
- 位置精度因子(PDOP):位置精度的相对误差;为纬度、经度和高程等误差平方和的开根号值,数值越小精度越高,一般小于3比较理想。
- 水平精度因子(HDOP):水平分量的相对误差,为纬度和经度等误差平方和的开根号值。数值越小,代表经纬坐标精度越高。
- 垂直精度因子(VDOP):垂直分量的相对。数值越小,代表海拔高度精度越高。
PDOP,HDOP和VDOP三者有如下关系:
HDOP^2+VDOP^2=PDOP^2 -
第二部分为卫星信息:显示**当前可见卫星(xx in view)与参与到定位的卫星(xx in used)**的数量和相关参数
- **PRN:**伪随机噪声码(Pseudo Random Noise code)的缩写,但并非卫星编号
- **Elev:**卫星仰角,单位:度(0~90°)。
- **Azim:**卫星方位角,单位:度(0~359°)。
- **SNR:**信噪比,单位:dBHz(0~99)
- SYS:卫星定位系统
- GPS:美国GPS系统
- BeiDou:中国北斗系统
- **Used:**该卫星是否参与到定位,是Y,否N。
注意
每次按SET切换到下一个功能,该功能都默认处于关闭状态(无论之前是否打开过),需要再长按SET才能开启该功能。
如果需要重新烧录该程序,可以在菜单栏的文件->示例->DFRobot_NBIOT->Default_Run中找到该程序。
9. 详细说明
9.1 电源管理
开发板支持四种供电方式:太阳能(SOLAR)、锂电池(BAT)、USB、6-24V外部供电(VIN),提供安全、高效、灵活的全方位电源管理(详情可参考系统原理框图),具有以下特性:
- 锂电池充电:太阳能、USB或外部供电三种方式均可为锂电池提供最高500mA的充电电流。**充电时,充电指示灯CHG红灯点亮,充满时CHG绿灯点亮,红灯熄灭。**当由其它方式供电且未连接电池时,CHG红灯常亮(绿灯熄灭),此为正常现象,并非充电指示灯故障。当仅使用太阳能板供电时,可最大化太阳能板的输出效率。
- 防反接:太阳能、锂电池和外部供电的接口都具有防反接功能。当供电正负极接反,相应的保护电路被激活,橘黄色反接指示灯REV SOLAR、REV BAT、REV VIN被分别点亮。
- 供电优先级:四种供电方式有各自的优先级,外部供电 > USB > 太阳能 > 电池。例如:当四种供电全部接入时,系统优先使用外部供电对电池进行充电同时给主控板进行供电;当断开外部供电,系统自动切换为USB为电池和主板供电;当进一步断开USB时,系统自动切换为太阳能板供电;断开太阳能板,则自动切换为电池供电。切换过程不会导致系统断电。
- 外部供电与太阳能供电接口的正负极标注位于板背。
注意
受限于低功耗设计,只有当使用到外部供电或USB为系统供电时,标有5V的过孔焊盘输出5V,RGB指示灯可用。否则仅使用太阳能或电池供电时,标有5V的过孔焊盘输出约为4.2V或电池电压,RGB指示灯不可用。
只能使用标称电压为5V的太阳能板接入太阳接线端,更大额定电压的太阳能板极有可能永久损坏充电芯片。
当使用太阳能板为系统供电时,强烈建议同时连上锂电池。因为太阳能受天气与光照不稳定影响,供电的也会变得不稳定,极有可能导致系统无法正常启动或稳定工作。使用锂电池供电作为缓冲,可解决这个问题。
9.2 天线
开发板的WiFi和Bluetooth通信使用PCB板载天线,而NB-IoT通信和GNSS定位功能需要外接天线。用户可使用产品包装中所提供的天线,也可额外购买兼容的外接天线以进一步增强收发信号的能力或缩小天线占用的空间。
NB-IoT天线
- 开发板支持B5/B8这两个频段的NB-IoT通信,而目前国内移动、电信、联通三大运营商NB-IoT也主要运行在在这两个频段,具体参数如下:
频段 | 中心频率 | 上行频率 | 下行频率 | 运营商 |
---|---|---|---|---|
B5 | 850 MHz | 824 MHz ~ 849 MHz | 869 MHz ~ 894 MHz | 中国电信 |
B8 | 900MHz | 880 MHz ~ 915 MHz | 925 MHz ~ 960 MHz | 中国移动、中国联通 |
- 用户可使用覆盖B5/B8频段(即工作频率在824MHz~960MHz)的PCB天线(产品附送)、FPC柔性PCB天线、弹簧天线、胶棒天线等各类天线,通常用于2G/GSM/GPRS蜂窝通信的天线也可用于NB-IoT通信(只要工作频率覆盖B5/B8频段),需要注意天线的接头为1代 IPEX接头。
GNSS天线
- 开发板支持GPS/BeiDou(北斗)双星定位导航,具体参数如下:
定位系统 | 接收频段 |
---|---|
GPS | L1 C/A 1575.42 MHz |
BeiDou(北斗) | B1 C/A 1561.098 MHz |
GNSS通信频段
- 用户可使用有源GPS/BeiDou(北斗)双频陶瓷天线(产品附送),也可使用单频的有源GPS或BeiDou(北斗)陶瓷天线,需要注意天线的接头为1代IPEX接头。
- 建议使用正方形的右旋圆极化有源陶瓷天线,以便和卫星信号极化匹配,获得更好的信号。陶瓷天线形状为正方形的为右旋圆极化,长方形为线极化。
- 不建议使用无源天线。无源天线需要配合LNA放大器来提高接收信号的强度,而开发板并未搭载LNA放大器。
9.3 SIM卡
NB-IoT通信需要专用的NB-IoT物联网SIM卡,如手机SIM卡,4G物联网卡等其它类型的SIM卡无法代替。目前产品包装内包含有一张中国联通NB-IoT物联网专用SIM卡,包含一份年度基础套餐,插入NB-IoT开发板或通信模组内即可使用,若流量满足不了使用需求,可通过充值月度流量包增加当月流量。后续将会推出更多运营商的NB-IoT物联网专用SIM卡供用户选择。
联通NB-IoT SIM卡资费情况如下表:
套餐 | 流量 | 有效期 | 资费 | 备注 |
---|---|---|---|---|
年度基础套餐(续费,必需) | 30 MB/月×12=360MB | 360天 | 12元 | 1.有效期自激活之日(首次成功通信)起开始计算,共360天。 2.每30天为一个月度结算周期,每月流量不累计到下个月,超量停机,直到下个月度结算周期或充值月度流量包恢复。 3.360天到期后自动停机,续费年度基础套餐自动恢复开通。 4.有效期结束前续费年度基础套餐,下一年可不停机无缝继续使用。 |
月度流量包(可选) | 30M/个 | 30天 | 3元 | 1.有效期自充值当天开始计算 2.随充随用,可无限叠加。 3.仅在年度基础套餐有效期内使用。 |
NB-IoT物联网专用SIM卡(补卡) | 30 MB/月×12=360MB | 360天 | 15元 | 1.需要联系客服核实信息方可购买,不单独销售。 |
注意
- 根据国家工业和信息化部等六部门要求,为有效防范和打击通讯信息诈骗,所有NB-IoT物联网专用SIM卡均具有机卡绑定功能,不可取消。
- SIM卡插入设备,首次上电(与基站)成功通信即视为激活且与通信模组绑定(机卡绑定),开始年度计费周期(360天)。
- 2G/3G/4G手机SIM卡或大流量物联网卡无法代替用于NB-IoT设备。
- 物联网SIM卡不能用于手机、平板、2G/3G/4G模组等非NB-IoT设备,否则会导致SIM卡停机。
- 已机卡绑定的SIM卡若被插入其它设备内进行通信会导致SIM卡停机。
- 物联网SIM卡仅能数据传输,无语音通信和短信功能。
流量查询与充值
-
用户可通过微信搜索并关注公众号DF物联网,自助查询SIM流量使用情况或对SIM卡进行充值。
-
点击下方的流量查询或流程充值。
-
在进行流量查询或充值前需要输入卡的唯一序列号ICCID(共20位,末尾字母屏蔽,可忽略,实际只需要输入前19位),该号码在SIM卡的外壳和卡体上各有一个。用户可手动输入该号码,也可点击输入框左边的扫描图标,扫描外壳背后的条码进行输入。
-
流量查询页面显示了当前SIM卡的各种状态:
- 设备状态:SIM卡当前状态(并非指开发板当前状态)。SIM卡未使用时默认为可测试状态;当SIM卡插入设备使用流量后被激活,状态变为已激活。当SIM卡由于欠费或不正当使用时,会进入停用状态,遇到这种情况请联系技术支持。
- 实名状态:通常为否。NB-IoT专用SIM卡与手机SIM卡不同,无需个人实名。
- **有效日期:**当前套餐使用的到期日。
- **总流量:**当前套餐的总流量。
-
充值页面显示当前SIM卡可充值的套餐,包括资费、流量和有效期等信息。
注意
- 微信公众号DF物联网目前处于建设和测试状态,部分页面可能不完善,但不影响SIM卡的流量查询与充值功能。
9.4 通信接口
开发板通过左右两侧的10P过孔焊盘引出外部通信和供电的接口,便于用户的项目制作与原型开发,各管脚功能详见接口说明图。
通用IO
- D0~D4,共5个,3.3V电平。其中D3(IO13)与SET按钮相连并通过10K电阻上拉至3.3V,D4(IO2)通过2K电阻与蓝色LED L的阳极相连(高电平点亮)。
- 所有通信IO:A0~A1,D0~D4,SCL,SDA,MISO,MOSI,SCK,TXD,RXD接口均可作为通用IO进行调用。其中D0~D4既可使用Arduino兼容的管脚号进行调用,也可使用物理管脚号进行调用。例如,标有D4的管脚,对应物理管脚号为IO2,可使用如下两种方法进行调用。下方样例通过将D4(IO2)拉高或者拉低,让板载的蓝色LED L以1s亮,1s灭的方式闪烁。
#define PIN_IO 2 //使用物理管脚号
//#define PIN_IO D4 //使用Arduino兼容的管脚号
void setup() {
pinMode(PIN_IO, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
注意
- 除D0~D4外的IO在作为通用IO调用时,只能使用物理管脚号进行调用。
- A0(IO36)和A1(IO39)作为通用IO调用时,仅能作为输入,不能输出。
模拟输入
- A0(IO36)和A1(IO39),共2个,输入范围0-3.3V。调用方式如下:
//使用A0或A1调用模拟输入管脚
#define ANALOG_IN_PIN0 A0
#define ANALOG_IN_PIN1 A1
#define VREF 3.3 //参考电压为3.3V
#define ADC_RESOLUTION 4096 //与Arduino UNO10位ADC不同,ESP32主控ADC为12位
uint16_t analogVal0, analogVal1;
float volt0, volt1;
void setup() {
Serial.begin(115200);
}
void loop() {
//使用anlogRead函数读取模拟管脚
analogVal0 = analogRead(ANALOG_IN_PIN0);
analogVal1 = analogRead(ANALOG_IN_PIN1);
volt0 = VREF / ADC_RESOLUTION * analogVal0;
volt1 = VREF / ADC_RESOLUTION * analogVal1;
Serial.print("A0 ADC Val:");
Serial.println(analogVal0);
Serial.print("A0 Voltage:");
Serial.print(volt0);
Serial.println(" V");
Serial.print("A1 ADC Val:");
Serial.println(analogVal1);
Serial.print("A1 Voltage:");
Serial.print(volt1);
Serial.println(" V");
Serial.println();
delay(1000);
}
数字通信接口
- I2C,SPI和UART,各1个,3.3V电平。
- I2C和SPI使用方法与Arduino兼容,接线连好后可直接使用相应Arduino的驱动代码,无需修改。
- UART经过5V电平兼容设计,可与Arduino等5V主控系统或5V电平的传感器、执行器进行通信。UART通过Serial2进行调用,具体使用方式通过下方样例展示:实现PC与外部设备(单片机,通信模组,传感器等)的数据通过UART双向透传:
void setup() {
//与PC通信通过USB转UART,使用Serial进行调用
Serial.begin(115200);
//开发板上标有TXD和RXD的串口UART使用Serial2进行调用
Serial2.begin(115200);
}
void loop() {
if (Serial.available()) {
Serial2.write(Serial.read());
}
if (Serial2.available()) {
Serial.write(Serial2.read());
}
}
9.5 微型U盘与Flash
开发板可以利用部分板载Flash空间作为U盘,用户可以与普通U盘一样对该U盘进行文件操作,便于与开发板的数据交换。这种方式可将开发板记录的数据方便地通过CSV文件导出到PC,并制作数据图表,也可以方便地将PC上的数据导入U盘,供开发板利用。
注意:
-
为了方便客户的调试和使用,开发板在出厂时默认不带有U盘功能(默认烧录不带U盘固件),可以通过烧录固件的方式,开启/关闭U盘功能。
-
U盘功能(U盘+USB转串口)通过CH552固件实现,但仅支持Win7和Win10,且需要安装专用驱动。无U盘功能的CH552固件(仅USB转串口)具有更好的兼容性,无需安装专用驱动,Windows、Linux、MacOS三大平台无驱使用。用户可根据应用场景和开发的便利性自行调整固件,更新方法见固件烧录部分的内容。
固件下载地址:
U盘功能介绍:
开发板在连接PC时将会弹出一个约8MB的微型U盘(首次使用需要格式化,详见快速使用指南一节的安装开发板驱动)。
注意
当使用USB与PC连接时,请等待U盘正常弹出(是指在电脑中可以正常显示U盘,且可以正常打开U盘)后,再对开发板烧录程序,也只有U盘弹出后,程序才会开始正常运行。
关于Flash的容量:16MB Flash这里指16MB×8bit,即16MB=16384KB=16777216B,与硬盘的计算方式1MB=1000KB,1KB=1000B不同。其中8MB用于U盘功能,剩下约8MB用于程序代码。由于烧录机制,8MB程序代码空间会被分成两部分,均约为3.9MB,烧录时,会先在其中一部分烧录,完成后再复制到另外一部分运行,因此实际程序可用空间约为3.9MB。
传输速度:由于读写微型U盘的文件经过USB转UART芯片的转换,同时受NOR FLASH的读写速率限制,传输速度较慢。目前实测写入速度约为3KB/s,读取速度约为30KB/s。
10. 固件烧录
开发板使用CH552用于USB转UART和U盘功能,为了不断优化使用体验和新增功能,将会不定期推出新版固件,用户可按照下述方法更新开发板固件:
- 点击下载CH552固件烧录程序,解压缩压缩包,双击驱动安装包WCHISPTool_Setup.exe,按照提示进行安装即可。
- 打开WCHISPTool(目前版本为V2.60),如下图依次进行选择操作
- 点击8位CH55X系列标签
- 芯片型号选择CH552
- 点击下载CH552固件,解压缩压缩包。用户程序文件选择解压缩出来的以**.hex为后缀的固件**。下载配置如下图保持默认。
- 在确保开发板完全断电的状态下,如图示短接开发板中的两个测试点,然后使用USB线连接开发板和PC上电,程序会自动检测到CH552(检测到了以后,可断开测试点的短接),USB设备列表会弹出类似如下图字样,左下角显示“Linked Device is:CH552”。
- 点击“下载”开始烧录固件。
- 下载记录会显示下载进度,一般会在2s内完成固件烧录。
- 重新上电后即可正常使用。
11. 应用样例
11.1 使用DFRobot Easy-IoT测试云端通信
通过上面的样例可完成NB-IoT或WiFi的信号测试,确认附近有NB-IoT或WiFi信号后,接下来可测试设备与云端的通信情况。这里以DFRobot出品的Easy-IoT轻量级物联网云平台为样例进行介绍。该平台极大地简化了用户设备上云所需要的大量配置,让创客与入门开发者10分钟内实现设备与云端的连接,尤其适用于物联网通信的快速测试和简单物联网项目的搭建。下面简述测试过程
-
登录Easy-IoT物联网云平台,点击右上角的注册/登录。
-
跳转至用户中心页面,按照提示注册新账号或登录现有账号。
-
登录后会自动跳转到工作间。首先点击添加新的设备,系统新增随机生成一个Topic。此外注意到左边栏,点击重新生成右边的眼睛按钮,平台已经自动为用户随机生成当前账号的Iot_id和Iot_pwd。为了后续让设备与云平台正常通信,就需要记录这里的三个参数,填入样例代码中
- Iot_id:HJZv1ZFRSQ
- Iot_pwd:ByfP1-YABX
- Topic:JoUOAg_WR
设备发送消息到云端(NB-IoT版)
- 将记录下来Iot_id、Iot_pwd和Topic这三个参数的值分别填入样例代码的Iot_id、Iot_pwd和pubTopic中,其它参数不变。(Client_ID用于区分不同设备,可任意配置一个数值)
/*配置设备的认证信息*/
String Iot_id = "HJZv1ZFRSQ"; //填入Iot_id
String Client_ID = "12345"; //任意数值,用于区分不同设备
String Iot_pwd = "ByfP1-YABX"; //填入Iot_pwd
/*配置IoT云平台的IP地址和端口号*/
String EasyIot_SERVER = "182.254.130.180";
uint16_t PORT = 1883;
/*配置要推送(Publish)或订阅(Subscribe)的topic*/
const char * pubTopic = "JoUOAg_WR"; //填入Topic
- 如下,将经过修改后的样例代码上传至主控板。
- 打开串口监控器,波特率设为115200。
#include "DFRobot_BC20.h"
#include "DFRobot_Iot.h"
/*配置设备的认证信息*/
String Iot_id = "HJZv1ZFRSQ"; //填入Iot_id
String Client_ID = "12345"; //任意数值,用于区分不同设备
String Iot_pwd = "ByfP1-YABX"; //填入Iot_pwd
/*配置IoT云平台的IP地址和端口号*/
String EasyIot_SERVER = "182.254.130.180";
uint16_t PORT = 1883;
/*配置要推送(Publish)或订阅(Subscribe)的topic*/
const char * pubTopic = "JoUOAg_WR"; //填入Topic
DFRobot_BC20 myBC20;
DFRobot_Iot myDevice;
/*连接到IoT云服务器*/
void ConnectCloud(){
while(!myBC20.connected()){
Serial.print("Attempting MQTT connection...");
if(myBC20.connect(myDevice._clientId, myDevice._username, myDevice._password)){
Serial.println("Connect Server OK");
}else{
myBC20.getQMTCONN();
}
}
}
void setup(){
/*初始化串口,波特率115200*/
Serial.begin(115200);
/*初始化NB-IoT模组BC20*/
Serial.print("Starting the BC20.Please wait. . . ");
while(!myBC20.powerOn()){
delay(1000);
Serial.print(".");
}
Serial.println("BC20 started successfully !");
/*检查SIM卡是否插入*/
while(!myBC20.checkNBCard()){
Serial.println("Please insert the NB card !");
delay(1000);
}
/*检查是否已连入网络(NB-IoT基站)*/
Serial.println("Waitting for access ...");
while(myBC20.getGATT() == 0){
Serial.print(".");
delay(1000);
}
/*配置需要连接的IoT云服务器(Easy-IoT)*/
myDevice.init(EasyIot_SERVER, Iot_id, Client_ID, Iot_pwd);
myBC20.setServer(myDevice._mqttServer,PORT);
/*连接到Easy-IoT*/
ConnectCloud();
}
void loop(){
/*IoT云服务器断线重连*/
if (!myBC20.connected()) {
ConnectCloud();
}
myBC20.loop();
myBC20.publish(pubTopic, "Hello");
delay(5000);
}
结果
- 串口打印类似于如下信息,表明模块已通过NB-IoT连接上Easy-IoT云平台。程序会每隔5s向Easy-IoT云平台的指定的Topic:JoUOAg_WR,发送一串字符“Hello”。
- 为了验证云平台是否确实收到设备端所发送的信息“Hello”,回到Easy-IoT云平台的工作间,点击Topic下方的查看详情。
- 在查询结果一栏中可找到云端接收到的消息。
云端发送消息到设备(NB-IoT版)
- 与上一节相同,首先将记录下来Iot_id、Iot_pwd和Topic这三个参数的值分别填入样例代码的Iot_id、Iot_pwd和pubTopic中,其它参数不变。(Client_ID用于区分不同设备,可任意配置一个数值)
/*配置设备的认证信息*/
String Iot_id = "HJZv1ZFRSQ"; //填入Iot_id
String Client_ID = "12345"; //任意数值,用于区分不同设备
String Iot_pwd = "ByfP1-YABX"; //填入Iot_pwd
/*配置IoT云平台的IP地址和端口号*/
String EasyIot_SERVER = "182.254.130.180";
uint16_t PORT = 1883;
/*配置要推送(Publish)或订阅(Subscribe)的topic*/
const char * pubTopic = "JoUOAg_WR"; //填入Topic
- 如下,将经过修改后的样例代码上传至主控板。
- 打开串口监控器,波特率设为115200。
#include "DFRobot_BC20.h"
#include "DFRobot_Iot.h"
/*配置设备的认证信息*/
String Iot_id = "HJZv1ZFRSQ"; //填入Iot_id
String Client_ID = "12345"; //任意数值,用于区分不同设备
String Iot_pwd = "ByfP1-YABX"; //填入Iot_pwd
/*配置IoT云平台的IP地址和端口号*/
String EasyIot_SERVER = "182.254.130.180";
uint16_t PORT = 1883;
/*配置要推送(Publish)或订阅(Subscribe)的topic*/
const char * subTopic = "JoUOAg_WR"; //填入Topic
DFRobot_BC20 myBC20;
DFRobot_Iot myDevice;
/*回调函数。当从订阅的topic收到消息时,该函数被调用。*/
void callback(char * topic, byte * payload, unsigned int len){
Serial.print("Recevice [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < len; i++){
Serial.print((char)payload[i]);
}
Serial.println();
}
/*连接到IoT云服务器*/
void ConnectCloud(){
while(!myBC20.connected()){
Serial.print("Attempting MQTT connection...");
if(myBC20.connect(myDevice._clientId, myDevice._username, myDevice._password)){
Serial.println("Connect Server OK");
myBC20.SubTopic(0,1,subTopic,0);
}else{
myBC20.getQMTCONN();
}
}
}
void setup(){
/*初始化串口,波特率115200*/
Serial.begin(115200);
/*初始化NB-IoT模组BC20*/
Serial.print("Starting the BC20.Please wait. . . ");
while(!myBC20.powerOn()){
delay(1000);
Serial.print(".");
}
Serial.println("BC20 started successfully !");
/*检查SIM卡是否插入*/
while(!myBC20.checkNBCard()){
Serial.println("Please insert the NB card !");
delay(1000);
}
/*检查是否已连入网络(NB-IoT基站)*/
Serial.println("Waitting for access ...");
while(myBC20.getGATT() == 0){
Serial.print(".");
delay(1000);
}
/*配置需要连接的IoT云服务器(Easy-IoT)*/
myDevice.init(EasyIot_SERVER, Iot_id, Client_ID, Iot_pwd);
myBC20.setServer(myDevice._mqttServer,PORT);
/*配置回调函数*/
myBC20.setCallback(callback);
/*连接到Easy-IoT*/
ConnectCloud();
}
void loop(){
/*IoT云服务器断线重连*/
if (!myBC20.connected()) {
ConnectCloud();
}
myBC20.loop();
}
结果
- 串口打印类似于如下信息,表明模块已通过NB-IoT连接上Easy-IoT云平台。
- 在Easy-IoT云平台的工作间,点击Topic下方的发送消息。
- 在发送新消息输入框中输入需要发送的消息,点击发送向设备端发送消息。每条发送的消息都会记录在下方最新消息中。
- 为了验证设备是否确实收到消息,回到串口监控器,可发现程序打印出刚才在云端发送的消息内容,并显示消息来自于哪个Topic。
至此,通过上述两个样例,完成了开发板(设备端)与Easy-IoT云平台(云端)的NB-IoT双向通信测试。
设备发送消息到云端(WiFi版)
- 相对于通过NB-IoT的接入,通过WiFi接入网络首先需要填入WiFi SSID和密码,然后将与云平台相关,记录下来Iot_id、Iot_pwd和Topic这三个参数的值分别填入样例代码的Iot_id、Iot_pwd和pubTopic中,其它参数不变。(Client_ID用于区分不同设备,可任意配置一个数值)
/*配置WIFI名和密码*/
const char * WIFI_SSID = "DFRobot-guest"; //填入WiFi SSID
const char * WIFI_PASSWORD = "dfrobot@2017"; //填入WiFi 密码
/*配置设备的认证信息*/
String Iot_id = "HJZv1ZFRSQ"; //填入Iot_id
String Client_ID = "12345"; //任意数值,用于区分不同设备
String Iot_pwd = "ByfP1-YABX"; //填入Iot_pwd
/*配置IoT云平台的IP地址和端口号*/
String EasyIot_SERVER = "182.254.130.180";
uint16_t PORT = 1883;
/*配置要推送(Publish)或订阅(Subscribe)的topic*/
const char * pubTopic = "JoUOAg_WR"; //填入Topic
- 如下,将经过修改后的样例代码上传至主控板。
- 打开串口监控器,波特率设为115200。
#include <WiFi.h>
#include <PubSubClient.h>
#include "DFRobot_Iot.h"
/*配置WIFI名和密码*/
const char * WIFI_SSID = "DFRobot-guest";
const char * WIFI_PASSWORD = "dfrobot@2017";
/*配置设备的认证信息*/
String Iot_id = "HJZv1ZFRSQ";
String Client_ID = "12345";
String Iot_pwd = "ByfP1-YABX";
/*配置IoT云平台的IP地址和端口号*/
String EasyIot_SERVER = "182.254.130.180";
uint16_t PORT = 1883;
/*配置要推送(Publish)或订阅(Subscribe)的topic*/
const char * pubTopic = "JoUOAg_WR";
DFRobot_Iot myEasyIoT;
WiFiClient espClient;
PubSubClient client(espClient);
/*连接WiFi*/
void connectWiFi() {
WiFi.disconnect();
delay(100);
Serial.print("Connecting to ");
Serial.println(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.print("IP Adderss: ");
Serial.println(WiFi.localIP());
}
/*连接到IoT云服务器*/
void ConnectCloud() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect(myEasyIoT._clientId, myEasyIoT._username, myEasyIoT._password)) {
Serial.println("Connect Server OK");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" Try again in 5 seconds");
delay(5000);
}
}
}
void setup() {
/*初始化串口,波特率115200*/
Serial.begin(115200);
/*连接WIFI*/
connectWiFi();
/*配置需要连接的IoT云服务器(Easy-IoT)*/
myEasyIoT.init(EasyIot_SERVER, Iot_id, Client_ID, Iot_pwd);
client.setServer(myEasyIoT._mqttServer, PORT);
/*连接到Easy-IoT*/
ConnectCloud();
}
void loop() {
/*IoT云服务器断线重连*/
if (!client.connected()) {
ConnectCloud();
}
client.loop();
/*每隔一段时间向Easy-IoT*/
Serial.println("Sending message to cloud...");
client.publish(pubTopic, "Hello");
Serial.println("Message is sent.");
delay(10000);
}
结果
- 串口打印类似于如下信息,表明模块已通WiFi连接上Easy-IoT云平台。程序会每隔10s向Easy-IoT云平台的指定的Topic:JoUOAg_WR,发送一串字符“Hello”。
- 为了验证云平台是否确实收到设备端所发送的信息“Hello”,回到Easy-IoT云平台的工作间,点击Topic下方的查看详情。
- 在查询结果一栏中可找到云端接收到的消息。
云端发送消息到设备(WiFi版)
- 与上一节相同,通过WiFi接入网络需要首先填入WiFi SSID和密码,然后将与云平台相关,记录下来Iot_id、Iot_pwd和Topic这三个参数的值分别填入样例代码的Iot_id、Iot_pwd和pubTopic中,其它参数不变。(Client_ID用于区分不同设备,可任意配置一个数值)
/*配置WIFI名和密码*/
const char * WIFI_SSID = "DFRobot-guest"; //填入WiFi SSID
const char * WIFI_PASSWORD = "dfrobot@2017"; //填入WiFi 密码
/*配置设备的认证信息*/
String Iot_id = "HJZv1ZFRSQ"; //填入Iot_id
String Client_ID = "12345"; //任意数值,用于区分不同设备
String Iot_pwd = "ByfP1-YABX"; //填入Iot_pwd
/*配置IoT云平台的IP地址和端口号*/
String EasyIot_SERVER = "182.254.130.180";
uint16_t PORT = 1883;
/*配置要推送(Publish)或订阅(Subscribe)的topic*/
const char * pubTopic = "JoUOAg_WR"; //填入Topic
- 如下,将经过修改后的样例代码上传至主控板。
- 打开串口监控器,波特率设为115200。
#include <WiFi.h>
#include <PubSubClient.h>
#include "DFRobot_Iot.h"
/*配置WIFI名和密码*/
const char * WIFI_SSID = "DFRobot-guest";
const char * WIFI_PASSWORD = "dfrobot@2017";
/*配置设备的认证信息*/
String Iot_id = "HJZv1ZFRSQ";
String Client_ID = "12345";
String Iot_pwd = "ByfP1-YABX";
/*配置IoT云平台的IP地址和端口号*/
String EasyIot_SERVER = "182.254.130.180";
uint16_t PORT = 1883;
/*配置要推送(Publish)或订阅(Subscribe)的topic*/
const char * subTopic = "JoUOAg_WR";
DFRobot_Iot myEasyIoT;
WiFiClient espClient;
PubSubClient client(espClient);
/*连接WiFi*/
void connectWiFi() {
WiFi.disconnect();
delay(100);
Serial.print("Connecting to ");
Serial.println(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.print("IP Adderss: ");
Serial.println(WiFi.localIP());
}
/*连接到IoT云服务器*/
void ConnectCloud() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect(myEasyIoT._clientId, myEasyIoT._username, myEasyIoT._password)) {
Serial.println("Connect Server OK");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" Try again in 5 seconds");
delay(5000);
}
}
}
/*回调函数。当从订阅的topic收到消息时,该函数被调用。*/
void callback(char * topic, uint8_t * payload, unsigned int len) {
/*显示收到的topic名称和消息内容*/
Serial.print("Recevice [Topic:");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < len; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void setup() {
/*初始化串口,波特率115200*/
Serial.begin(115200);
/*连接WIFI*/
connectWiFi();
/*配置需要连接的IoT云服务器(Easy-IoT)*/
myEasyIoT.init(EasyIot_SERVER, Iot_id, Client_ID, Iot_pwd);
client.setServer(myEasyIoT._mqttServer, PORT);
/*配置回调函数*/
client.setCallback(callback);
/*连接到Easy-IoT*/
ConnectCloud();
/*订阅(Subscribe)指定topic*/
client.subscribe(subTopic);
Serial.print("Topic:");
Serial.print(subTopic);
Serial.println(" subscribed!");
}
void loop() {
/*IoT云服务器断线重连*/
if (!client.connected()) {
ConnectCloud();
}
client.loop();
}
结果
- 串口打印类似于如下信息,表明模块已通过WiFi连接上Easy-IoT云平台。
- 在Easy-IoT云平台的工作间,点击Topic下方的发送消息。。
- 在发送新消息输入框中输入需要发送的消息,点击发送向设备端发送消息。每条发送的消息都会记录在下方最新消息中。
- 为了验证设备是否确实收到消息,回到串口监控器,可发现程序打印出刚才在云端发送的消息内容,并显示消息来自于哪个Topic。
至此,通过上述两个样例,完成了开发板(设备端)与Easy-IoT云平台(云端)的WiFi双向通信测试。
12. 固件更新记录
12.1 Arduino SDK板卡支持包
- V1.0.3(2020/04/08)
- 解决了WiFi连接MQTT超时问题。(Attempt MQTT connection,rc=-1)。
- V1.0.2(2020/02/27)
- 解决因CH552波特率误差导致的U盘通信过程中的丢包、重传问题,最终导致无法弹出U盘的问题。
- DataLogger.ino增加按SET按钮控制是否保存进flash的功能,以提醒用户在掉电前可以先暂停将数据保存进flash中。
- V1.0.1(2019/12/17)
- 增加了PubSubClient、ArduinoJson、OneWire作为内置库。
- 修改了ProductKey、DeviceName、DeviceSecret等参数,使用户可以双击选中。
- 在easy-IoT相关样例的头部注释中添加Easy-IoT相关链接
- 移除了开发板选项里的TinkerNode NB-IoT(GL)选项。
12.2 CH552固件
12.2.1 CH552固件(有U盘版本)
- V0.0.8(2020/01/15)
1.仅支持Win7和Win10系统,需要安装专用驱动程序。
12.2.1 CH552固件(无U盘版本,CH340固件)
- V0.3(2020/04/08)
- 修复MacOS兼容性问题。
- V0.2(2020/03/26)
- 调整波特率,修复串口打印乱码问题。
- V0.1(2020/03/24)
- 无需安装专用驱动,Windows、Linux、MacOS三大平台无驱使用。
- 无U盘功能。
- 固件更新后,在设备管理器中可看到类似如下的串口设备
13. 常见问题
Q1. 是否可以直接通过过孔焊盘的5V或3V3对开版板进行供电?
A1.
- 标有3V3的焊盘不能作为供电输入,作为对外供电输出的驱动能力约为1A。作为替代可在标有BAT的焊盘上为系统供电,输入电压范围3V3-5.5V,需要注意由于BAT与电池输入端的正极直接相连,如果使用BAT作为供电输入,必需先断开其它所有的电源供电方式外部供电、USB、太阳能和电池,否则可能损坏电源系统。
- 标有5V的焊盘可以作为供电输入,但必需先断开USB和外部供电,太阳能和电池供电可正常同时接入,此时5V替代USB和外部供电为电池充电,同时为系统供电。
Q2. 可以边冲边放吗?(太阳能、外部供电、USB)
A2. 可以。
Q3. CH341驱动安装后,设备管理器中提示Windows 无法验证此设备所需的驱动程序的数字签名。
A3.目前仅带U盘固件可能出现该问题。驱动经过数字签章,对于大部分Windows系统没有安装问题,但仍有小部分会遇到数字签名的问题,可通过禁用Windows系统的数字签名认证解决,点击查看解决方案
Q4. 使用适配器通过USB口进行外部供电时,TinkerNode不工作。
A4. 目前仅带U盘固件会出现该问题。由于部分适配器内部会借助D+、D-区分设备类型,从而导致TinkerNode会卡在等待U盘加载的步骤,无法正常工作。推荐需要外部供电时,使用VIN接线柱,或使用只能供电(不包含“D+D-”数据线)的USB线。
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。