Skip to content

玄武一号

模组介绍

玄武一号

玄武一号专为零编程经验且想快速搭建物联网系统者提供,其核心是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

电路图纸

核心板电路原理图.PDF

底板电路原理图.PDF

1、核心板电路原理图

2、底板电路原理图

测试例程(待更新)

点击下载例程

扩展工程的测试例程,主控采用STM32F103C6T6,开发环境为keil for arm 5.30。

例程中STM32F103C6T6采集环境中的温湿度、光照强度、烟雾浓量,定时上报环境数据,同时驱动三路继电器开关以及一路PWM控制的LED。