玄武一号
模组介绍¶
玄武一号
玄武一号专为零编程经验且想快速搭建物联网系统者提供,其核心是wifi模块,无需自己搭建服务器和开发微信小程序,上电即用;同时,强大的扩展功能支持自定义自己的系统,可以将扩展功能理解为"硬件API",将其嵌入自己的系统中即可快速实现物联网功能。
系统框图

核心板+底板照片

下图为核心板素颜照,从照片看,核心板尺寸明显小于一枚1元硬币

核心板引出的接口定义如下:
接口 | 功能 | 接口 | 功能 |
---|---|---|---|
IN1-IN3 | 数字输入 0/3.3V DC | LED | 状态指示引脚 |
OUT1-OUT3 | 数字输出 0/3.3V DC | EN | 复位按钮 低电平复位 |
AD1-AD3 | 模拟输入 0-2.5V DC | KEY | 长按三秒恢复出厂设置 |
VDD | 电源3.3V | RXD0/TXD0 | UART用于扩展功能 |
GND | 电源GND | D+/D- | USB通讯接口 |
核心板上的系统状态指示LED
状态 | 指示 |
---|---|
常亮 | 出厂设置或连不上网 |
闪烁一次 | 接收到小程序信息 |
闪烁两次 | 连接上了系统 |
闪烁十次 | 恢复出厂设置 |
演示视频¶
快速上手¶
- 微信小程序搜索"易方电子",并且使用手机号注册
- 在小程序中添加设备后即可使用(添加方式下面会讲)
- 设备列表页面右滑可以给删除设备和重命名设备

- 若要使用扩展功能,则需要其他设备(如MCU)通过UART_TTL与模块板进行交互
添加设备
点击右上方的+号,有三种方式添加设备

添加方式
请确保wifi信号是2.4G频段的,且wifi名和密码均非中文,手机端不要开启网络代理。
配网添加方式是针对wifi模块的,玄武一号也可用,使用时确保设备处于出厂待入网状态,手机需先连接待加入的路由器,输入wifi密码后点击配网,等待结果。
若只是为了简单使用,文档看到此即可,不需要往下再看了。

当设备已具备联网能力后(对于wifi模块,通过配置工具提前给模块设置了正确的wifi名称和wifi密码,或者设备本身就具备联网能力,如4G模块)只需扫码添加和手动输入设备号添加即可,需要注意的是,若设备还在其他用户名下则这两种方式不可行。
windows配置工具
使用工具前先确保已安装好了CH340驱动,若没则可点击 下载
windows配置工具下载链接: 配置工具
用Type-c线连接设备和电脑,工具可查询设备信息以及配置wifi名称和密码,用户可根据获取到的设备号在小程序中扫码添加和手动添加设备

Web UART
易方电子网页串口工具提供了与windows配置工具相同的功能,且增加了扩展功能的测试。具体使用方式查看Web UART文档。
自带功能¶
自带功能
玄武一号自带三路输出、三路输入、三路电压采集功能,核心板的信号范围如下,用户可定制底板将范围进行扩大
功能 | 信号范围 |
---|---|
输出 | 输出高(显示值为1)时为直流3.3V 输出低(显示值为0)时为直流0V |
输入 | 输入范围为直流0-3.6V 低于0.8V时识别为低电平 高于2V时识别为高电平 |
电压采集 | 输入电压范围为直流0-2.5V |

玄武一号检测到外接传感器后(目前支持的有AHT10、BH1750,SCL:AD1 SDA:AD2),自带功能会保留三路输出,去除三路输入、三路电压采集功能,取而代之的是采集传感器和驱动SPI屏幕显示(128x160、ST7735,SCL:IN3 SDA:IN2 RST:3V3 DC:IN1 CS:OUT3),


扩展功能¶
扩展功能
玄武一号预留一个UART接口用于功能扩展,用户可以使用其他设备(如单片机)通过UART_TTL与模块板进行交互。通讯波特率固定为115200,停止位1位,数据位8位,无校验位。
通讯流程
用单片机进行举例
小程序下发给模块板的指令类型有:请求上报模型指令、请求上报数据指令、控制指令
单片机发送给模块板的指令类型有:新增模型指令、更新数据指令、响应控制指令

还有一类指令是系统指令,先由单片机发送给模块板,再又模块板进行响应

通讯的包格式如下:
// 编码格式为UTF-8 https://www.qqxiuzi.cn/bianma/Unicode-UTF.php
// CRC-16-MODBUS在线计算:https://www.lddgo.net/encrypt/crc
typedef struct{
char cmd;
unsigned char total_len;
unsigned char descr_len;
unsigned char value_len;
unsigned char unit_len;
char id[4];
char descr[48];
char value[48];
char unit[12];
unsigned char logo;
unsigned short crc16;
}mqtt_model_config;
校验算法如下:
// 计算 modbus_crc16
static uint16_t crc_16(uint8_t *buf,uint32_t len) {
uint32_t pos = 0;
uint16_t crc = 0xFFFF;
for (pos = 0; pos < len; pos++) {
crc ^= (uint16_t)buf[pos];
for (int i = 8; i != 0; i--) {
if ((crc & 0x0001) != 0) {
crc >>= 1;
crc ^= 0xA001;
}
else {
crc >>= 1;
}
}
}
return crc;
}
指令解析错误
玄武一号接收到的指令解析错误会返回:FF 06 5A A5 EA 2A
小程序界面模型介绍
用户可以给玄武一号发送对应的添加指令,在小程序端添加对应的模型进行展示,同一类模型会在一起显示。同时可以发送数据更新指令更新页面数据,玄武一号也可以接收小程序发来的扩展指令并且通过UART打印出来。
每个模型都有唯一的四位字符长度的id(前两位为种类,需要用户自定义),为了管理方便,强烈建议每一种模型按种类和顺序编号。比如数值模型为0101、0102、0103等等,开关模型为0201、0202、0203等等。
1、数值模型

2、开关模型

3、滑块模型

4、条状模型

5、拱状模型

6、地图模型

新增模型指令
其他设备往玄武一号发送新增模型指令,玄武一号正确解析指令后回返回:FF 06 A5 5A 5A 2B 随后执行指令
1、新增数值模型
example: 01 19 06 04 03 30 31 30 31 E6 B8 A9 E5 BA A6 32 35 2E 37 E2 84 83 0B C9 9A
命令字段 十六进制 命令解析
cmd: 01 // cmd头
total_len: 19 // descr_len + unit_len + value_len + 0x0c
descr_len: 06 // 描述信息的字节长度
value_len: 04 // 值信息的字节长度
unit_len: 03 // 单位信息的字节长度
id: 30 31 30 31 // 0101
descr: E6 B8 A9 E5 BA A6 // 温度(UTF-8编码)
value: 32 35 2E 37 // 25.7
unit: E2 84 83 // ℃ (UTF-8编码)
logo: 0B // 0x0B即十进制的12,图标选择12
CRC16: C9 9A // CRC16的计算结果 0xC9是高字节
2、新增开关模型
example: 02 14 07 01 00 30 32 30 31 E7 81 AF E6 B3 A1 31 30 04 59 47
命令字段 十六进制 命令解析
cmd: 02 // cmd头
total_len: 14 // descr_len + unit_len + value_len + 0x0c
descr_len: 07 // 描述信息的字节长度
value_len: 01 // 值信息的字节长度
unit_len: 00 // 单位信息的字节长度
id: 30 32 30 31 // 0201
descr: E7 81 AF E6 B3 A1 31 // 灯泡1(UTF-8编码)
value: 30 // 0 关闭状态,若为1则是打开状态
unit: // 没有单位
logo: 04 // 0x04即十进制的4,图标选择4
CRC16: 59 47 // CRC16的计算结果 0x59是高字节
3、新增滑块模型
example: 03 1B 06 02 07 30 33 30 31 E7 BA A2 E8 89 B2 35 39 23 46 46 30 30 30 30 FF E8 D3
命令字段 十六进制 命令解析
cmd: 03 // cmd头
total_len: 1B // descr_len + unit_len + value_len + 0x0c
descr_len: 06 // 描述信息的字节长度
value_len: 02 // 值信息的字节长度
unit_len: 07 // 单位信息的字节长度
id: 30 33 30 31 // 0301
descr: E7 BA A2 E8 89 B2 // 红色(UTF-8编码)
value: 35 39 // 59 滑块的滑动进度
unit: 23 46 46 30 30 30 30 // 滑块的颜色 color: #FF0000
logo: FF // 随便填一个数值
CRC16: E8 D3 // CRC16的计算结果 0xE8是高字节
4、新增条状模型
example: 04 18 07 02 03 30 34 30 31 E6 95 B0 E6 8D AE 31 37 37 37 37 25 FF 7E 37
命令字段 十六进制 命令解析
cmd: 04 // cmd头
total_len: 18 // descr_len + unit_len + value_len + 0x0c
descr_len: 07 // 描述信息的字节长度
value_len: 02 // 值信息的字节长度
unit_len: 03 // 单位信息的字节长度
id: 30 34 30 31 // 0401
descr: E6 95 B0 E6 8D AE 31 // 数据1(UTF-8编码)
value: 37 37 // 77 进度条的百分比进度显示
unit: 37 37 25 // 77% 进度条尾部显示内容
logo: FF // 随便填一个数值
CRC16: 7E 37 // CRC16的计算结果 0x7E是高字节
5、新增拱状模型
example: 05 1B 06 05 04 30 35 30 31 E6 B8 A9 E5 BA A6 32 37 E2 84 83 30 2E 32 37 FF E6 98
命令字段 十六进制 命令解析
cmd: 05 // cmd头
total_len: 1B // descr_len + unit_len + value_len + 0x0c
descr_len: 06 // 描述信息的字节长度
value_len: 05 // 值信息的字节长度
unit_len: 04 // 单位信息的字节长度
id: 30 35 30 31 // 0501
descr: E6 B8 A9 E5 BA A6 // 温度(UTF-8编码)
value: 32 37 E2 84 83 // 27℃(UTF-8编码)
unit: 30 2E 32 37 // 0.27 拱形的进度条显示比例27%
logo: FF // 随便填一个数值
CRC16: E6 98 // CRC16的计算结果 0xE6是高字节
6、新增地图模型
地图模型有且只有一个所以没有ID,新增地图模型和更新地图模型指令一模一样。
example: 06 1B 00 09 06 FF FF FF FF 31 31 36 2E 33 39 37 34 32 33 39 2E 39 30 39 FF 51 27
命令字段 十六进制 命令解析
cmd: 06 // cmd头
total_len: 1B // descr_len + unit_len + value_len + 0x0c
descr_len: 00 // 描述信息的字节长度
value_len: 09 // 经度信息的字节长度
unit_len: 06 // 维度信息的字节长度
id: FF FF FF FF // 随便写四个字符
descr: // 空
value: 31 31 36 2E 33 39 37 34 32 // 116.39742
unit: 33 39 2E 39 30 39 // 39.909
logo: FF // 随便填一个数值
CRC16: 51 27 // CRC16的计算结果 0x51是高字节
数据更新指令
其他设备往玄武一号发送数据更新指令,玄武一号正确解析指令后回返回:FF 06 A5 5A 5A 2B 随后执行指令
1、 指令解释:更新id为0101模型的数据值为0
指令: 50 0D 00 01 00 30 31 30 31 30 FF 68 25
命令字段 十六进制 命令解析
cmd: 50 // cmd头
total_len: 0D // descr_len + unit_len + value_len + 0x0c
descr_len: 00 // 描述信息的字节长度
value_len: 01 // 值信息的字节长度
unit_len: 00 // 单位信息的字节长度
id: 30 31 30 31 // 0101
descr: //
value: 30 // 0
unit: //
logo: FF // 滑块没有图标 随便填一个数值
CRC16: 68 25 // CRC16的计算结果 0xE6是高字节
2、 指令解释:更新id为0104模型的数据值为1.228
指令:50 11 00 05 00 30 31 30 34 31 2E 32 32 38 FF F7 32
3、 指令解释:更新id为0107模型的数据值为32.8
指令:50 10 00 04 00 30 31 30 37 33 32 2E 38 FF 59 4B
4、 指令解释:更新id为0204模型的数据值为0(关闭开关)
指令:50 0D 00 01 00 30 32 30 34 30 FF 69 71
5、 指令解释:更新id为0204模型的数据值为1(打开开关)
指令:50 0D 00 01 00 30 32 30 34 31 FF F9 70
6、 指令解释:更新id为0301模型的数据值为88
指令:50 0E 00 02 00 30 33 30 31 38 38 FF 3F 20
7、 指令解释:更新id为0401模型的数据值为22 描述为22%
指令:50 11 03 02 00 30 34 30 31 32 32 25 32 32 FF 4A 7A
8、 指令解释:更新id为0501模型的数据值为0.33 描述为33℃
指令:50 15 05 04 00 30 35 30 31 33 33 E2 84 83 30 2E 33 33 FF 33 3F
9、 指令解释:更新地图模型中的定位经纬度,地图模型有且只有一个所以没有ID,新增地图模型和更新地图模型指令一模一样。
指令:参考上方新增地图模型指令
响应命令指令
其他设备往玄武一号发送响应命令指令,玄武一号正确解析指令后回返回:FF 06 A5 5A 5A 2B 随后执行指令
1、 指令解释:响应id为0204模型发来的指令(开关指令),内容为:"设定成功"
指令: 51 18 0C 00 00 30 32 30 34 E8 AE BE E5 AE 9A E6 88 90 E5 8A 9F FF 5A F7
命令字段 十六进制 命令解析
cmd: 50 // cmd头
total_len: 18 // descr_len + unit_len + value_len + 0x0c
descr_len: 0C // 描述信息的字节长度
value_len: 00 // 值信息的字节长度
unit_len: 00 // 单位信息的字节长度
id: 30 32 30 34 // 0204
descr: E8 AE BE E5 AE 9A E6 88 90 E5 8A 9F // 设定成功(UTF-8编码)
value: // 空
unit: // 空
logo: FF // 随便填一个数值
CRC16: 5A F7 // CRC16的计算结果 0x5A是高字节
2、 指令解释:响应id为0301模型发来的指令(滑块指令),内容为:"设定成功"
指令: 51 18 0C 00 00 30 33 30 31 E8 AE BE E5 AE 9A E6 88 90 E5 8A 9F FF CF 33
系统指令
1、其他设备往玄武一号发送系统指令,数据格式:cmd(1B) total_len(1B) data(长度不定) crc16(2B)
cmd 指令含义 指令
0xA0 查询pid A0 04 73 78
0xA1 查询设备状态 A1 04 E3 79
0xA2 查询wifi账号 A2 04 13 79
0xA3 查询wifi密码 A3 04 83 78
0xA4 查询kind&version A4 04 B3 7A
0xA5 获取局域网ip A5 04 23 7B
0xA6 获取网络时间(北京) A6 04 D3 7B
0xA9 配置wifi名 A9 XX wifi_name(xx) crc16
0xAA 配置wifi密码 AA XX wifi_password(xx) crc16
0xAB 连接wifi AB 04 43 7F
0xAE 复位C3 AE 04 13 7C
0xAF 恢复出厂设置 AF 04 83 7D
配置wifi名称举例子 wifi_name:XY-FB1D A9 0B 58 59 2D 46 42 31 44 E1 00
配置wifi名称举例子 wifi_name:XY-FB1D2 A9 0C 58 59 2D 46 42 31 44 32 E5 46
配置wifi密码举例子 wifi_password:212345678 AA 0D 32 31 32 33 34 35 36 37 38 99 64
提示: 设置完wifi名和密码后需要在设定连接wifi后才能生效
2、玄武一号响应其他设备的系统指令,数据格式:cmd(1B) total_len(1B) data(长度不定) crc16(2B)
cmd 指令含义 指令
0xA0 上报pid A0 10 pid(12B) crc16
0xA1 上报设备状态 A1 05 g_dev_state_e(1B) crc16
0xA2 上报wifi账号 A2 total_len(1B) wifi_name(长度不定) crc16
0xA3 上报wifi密码 A3 total_len(1B) wifi_password(长度不定) crc16
0xA4 上报kind&version A4 06 kind(1B) version(1B) crc16
0xA5 上报局域网ip A5 total_len(1B) IP(长度不定) crc16
0xA6 上报网络时间(北京) A6 0B Year Month Day Hour Minute Second Week crc16
0xA9 响应配置wifi名 A9 04 23 7E
0xAA 正确响应配置wifi密码 AA 04 D3 7E
0xAB 正确响应连接wifi AB 04 43 7F
0xAE 正确响应复位C3 AE 04 13 7C
0xAF 正确响应恢复出厂设置 AF 04 83 7D
响应wifi名称举例子 wifi_name:XY-FB1D A2 0B 58 59 2D 46 42 31 44 D1 73
响应wifi密码举例子 wifi_name:212345678 A3 0D 32 31 32 33 34 35 36 37 38 05 4A
微信小程序端指令
微信小程序端通过网络发送指令给玄武一号,玄武一号会将指令通过UART发送给外部设备
1、微信小程序端请求硬件端发送自身数据模型(id:ffff value:ffff),包含玄武一号本身模型,玄武一号会自动上报自身数据模型,外部设备根据自身实际情况需要往玄武一号发送新增模型指令
指令: B0 10 00 04 00 66 66 66 66 66 66 66 66 FF CE A6
命令字段 十六进制 命令解析
cmd: B0 // cmd头
total_len: 10 // descr_len + unit_len + value_len + 0x0c
descr_len: 00 // 描述信息的字节长度
value_len: 04 // 值信息的字节长度
unit_len: 00 // 单位信息的字节长度
id: 66 66 66 66 // ffff
descr: // 空
value: 66 66 66 66 // ffff
unit: // 空
logo: FF // 随便填一个数值
CRC16: CE A6 // CRC16的计算结果 0xCE是高字节
2、微信小程序端请求硬件端发送自身数据模型(id:fffe value:fffe),不包含玄武一号本身模型,外部设备根据自身实际情况需要往玄武一号发送新增模型指令
指令: B0 10 00 04 00 66 66 66 65 66 66 66 65 FF 0D A6
3、微信小程序端发送用户退出小程序指令 (id:0000,value:bye)
指令:B1 0F 00 03 00 30 30 30 30 62 79 65 FF D2 88
4、微信小程序端设置id为0202的模型value值为1,即打开开关(id:0202,value:1)
指令:B1 0D 00 01 00 30 32 30 32 31 FF C7 C3
5、微信小程序端设置id为0301的模型value值为33 (id:0301,value:33)
指令:B1 0E 00 02 00 30 33 30 31 33 33 FF F0 29
5、微信小程序端请求获取id为ffff的数据 (id:ffff,value:ffff)外部设备和玄武一号更新自身所有模型数据
指令:B2 10 00 04 00 66 66 66 66 66 66 66 66 FF 0C A5
6、微信小程序端请求获取id为fffe的数据 (id:fffe,value:fffe)外部设备更新自身所有模型数据 玄武一号不上报
指令:B2 10 00 04 00 66 66 66 65 66 66 66 65 FF CF A5
电路图纸¶
1、核心板电路原理图

2、底板电路原理图



测试例程(待更新)¶
扩展工程的测试例程,主控采用STM32F103C6T6,开发环境为keil for arm 5.30。
例程中STM32F103C6T6采集环境中的温湿度、光照强度、烟雾浓量,定时上报环境数据,同时驱动三路继电器开关以及一路PWM控制的LED。