主模式开发指南



注意:该文档适用于IntoRobot-W32/W33,如果您想获知其他开发板/模组的文档,请点击顶部导航栏左侧选择栏选择相应的开发板/模组

功能概述

IntoRobot-W32/W33是一款居于ESP32芯片开发的WiFi/蓝牙模组。模组向外提供了19组GPIO,10组ADC,13组PWM,3组串口、2组I2C、2组I2S、2组SPI。点击获取更多产品信息

本章节我们针对IntoRobot-W32/W33,指引您尽快地进行设备硬件方案选择,熟悉设备开发流程、掌握开发工具使用、查找相关资料等, 让您在最短时间内完成产品的软件开发。

IntoYun 为智能软硬件整体解决方案服务商,为用户提供开放便捷的物联网云服务。虽然接入物联网的设备丰富多样,但按实现方案可以分为三类,具体如下:

  • 主模式方案

    主模式方案:即用户采取IntoYun提供的硬件开发板/模组作为设备主控,外部连接各类传感器和控制器。 IntoYun为用户提供了完善的SDK功能接口、公共库和跨平台编译环境等。用户可直接便捷的在主控上开发设备软件。

    主模式方案,适用于如下情况:

    - 适合新产品设计。
    - 期望降低设备成本,控制设备体积。
    - 期望降低设备开发难度,加快设备开发进度。
    

    主模式开发优势:

    - 提供`在线编程`和`离线编程`开发工具。开发工具功能强大、使用简单。支持跨平台开(windows、linux、MacOS)开发。
    - 提供完善、稳定的SDK功能库。提供丰富、统一、简洁的API接口。用户无需关心硬件MCU底层细节。
    - 提供数千个开源功能库和丰富详细的开源实例工程。
    - 支持自动代码生成,有效降低用户设备软件开发工作量。
    

    资源链接:

  • 从模式方案

    从模式方案:即用户直接使用自选的MCU作为主控,MCU连接各类传感器和控制器,MCU通过串口与IntoYun通讯模组进行通讯, 完成云端通讯。用户将直接在MCU端开发设备软件。
    了解更多请点击从模式设备方案开发指南

  • 第三方设备方案

    第三方设备方案:即用户采取自选硬件方案,用户采取硬件方案商官方提供的SDK进行开发设备软件。
    了解更多请点击第三方设备方案开发指南

下面我们将详细介绍主模式设备方案开发的流程步骤

创建产品

登陆IntoYun开发者中心: https://www.intoyun.com/account/login

点击左侧添加框创建新产品

创建产品

选项具体说明如下:

  • 产品名称 :请输入产品的名称。
  • 产品类别 :请选择产品的类别。目前分为工业类消费类其他
  • 数据格式 :请选择产品的数据格式。目前分为数据点-TLV自定义。具体请参考产品数据格式详解
  • 产品描述 :请输入产品的描述信息。
  • 接入方案 :请选择设备的接入方案。目前分为WiFiLoRaGPRS/3G/4G

输入产品相关信息后点击“创建产品”。

数据格式定义

打开创建的产品,选中数据格式定义选项。如果创建产品时,您选择的数据格式为自定义,不需要做其他操作,跳到下章节。 如果选择的数据格式为数据点-TLV,此时你便可以编辑数据点,如下图:

create_product

自动代码生成

进入“设备开发”->“IntoYun主模式方案开发”->"设备软件开发"页面,点击“自动生成工程”,如下图所示:

create_product

点击后弹出"自动生成代码"框,如下图所示:

create_product

选项具体说明如下:

  • 基础选项

    • 软件版本号 :设备软件版本号,标明设备软件的版本,设备固件升级有使用。软件版本号格式为<主版本号>.<次版本号>.<修订版本号>,例如1.0.0
    • 开发板/模组 :请选择对应的开发板和模组。
  • 高级选项

    • 数据发送 :数据发送类型包括自动处理和用户处理。该选项只对数据格式:数据点-TLV有效。
      自动处理即数据发送由系统控制,只有数据发送变化或者发送时间间隔(默认600秒)到才发送数据。
      用户处理即用户调用数据发送接口立即发送数据。

输入和选择相关信息,点击“生成工程”,将在在线编程工具自动创建工程。

软件编程开发

目录结构

自动生成的工程目录结构如下:

+-- project.ino : 项目主代码文件 +-- project_config.h : 项目配置文件 +-- user_interface.cpp : 设备按键和指示灯处理代码文件 +-- user_interface.h : 设备按键和指示灯处理头文件

代码分析

project.ino 代码包括如下几部分:

a. 程序入口

该函数上电只运行一次。
void setup()
{
    userInit();
}

该函数上电后循环调用。
void loop()
{
    //loop不能阻塞
    userHandle();
}

b. 程序初始化

//该函数负责程序的初始化工作,用户可以把初始化代码到此处。
void userInit(void)
{

}

b. 程序功能处理

//该函数循环调用负责程序的功能处理,用户可以把程序逻辑处理放入此处。
void userHandle(void)
{

}

//该函数为事件通知函数,用户可以通过该函数处理平台数据和系统事件。
void system_event_callback(system_event_t event, int param, uint8_t *data, uint16_t datalen)
{

}

二次开发

1. 二次开发简介

自动代码工程生成后,开发者便可在工程基础上做二次开发。开发者需要开发的部分包括:

a. 初始化:完成硬件接口,逻辑的初始化工作灯。

b. 上行处理:状态或传感器数据的上送等。

c. 下行处理:控制指令的响应和处理。

2. 二次开发实例

#include "project_config.h"

PRODUCT_ID(PRODUCT_ID_DEF)                                 //产品标识
PRODUCT_SECRET(PRODUCT_SECRET_DEF)                         //产品密钥
PRODUCT_SOFTWARE_VERSION(PRODUCT_SOFTWARE_VERSION_DEF)     //产品软件版本号
PRODUCT_HARDWARE_VERSION(PRODUCT_HARDWARE_VERSION_DEF)     //产品硬件版本号

//定义数据点ID
//格式:DPID_数据类型_数据点英文名. 如果英文名相同的,则在后面添加_1 _2 _3形式。
//说明:布尔型: BOOL. 数值型: NUMBER. 枚举型: ENUM. 字符串型: STRING. 扩展型: BINARY
#define DPID_BOOL_SWITCH                      1  //布尔型     开关(可上送可下发)
#define DPID_NUMBER_TEMPATURE                 2  //数值型     温度(只上送)
#define DPID_NUMBER_HUMIDITY                  3  //数值型     湿度(只上送)
#define DPID_ENUM_COLOR                       4  //枚举型     颜色模式(可上送可下发)
#define DPID_STRING_DISPLAY                   5  //字符串型   显示字符串(可上送可下发)
#define DPID_BINARY_LOCATION                  6  //扩展型     位置(可上送可下发)

//定义数据点变量
//格式:数据类型+数据点英文名. 如果英文名相同的,则在后面添加_1 _2 _3形式。
//布尔型为bool
//枚举型为int
//整型为int
//浮点型为double
//字符串型为String
//扩展型为uint8_t*型
//扩展型长度为uint16_t型
bool dpBoolSwitch;              //开关
double dpDoubleTemperature;     //温度
int dpIntHumidity;              //湿度
int dpEnumColor;                //颜色模式
String dpStringDisplay;         //显示字符串
uint8_t *dpBianryLocation;      //位置
uint16_t dpBianryLocationLen;   //位置长度

uint32_t timerID;

void system_event_callback(system_event_t event, int param, uint8_t *data, uint16_t datalen)
{
    if((event == event_cloud_data) && (param == ep_cloud_data_datapoint))
    {
        /*************此处修改和添加用户控制代码*************/
        //开关
        if(RESULT_DATAPOINT_NEW == Cloud.readDatapoint(DPID_BOOL_SWITCH, dpBoolSwitch))
        {
            //用户代码
        }

        // 颜色模式
        if (RESULT_DATAPOINT_NEW == Cloud.readDatapoint(DPID_ENUM_COLOR, dpEnumColor))
        {
            //用户代码
        }

        // 显示字符串
        if (RESULT_DATAPOINT_NEW == Cloud.readDatapoint(DPID_STRING_DISPLAY, dpStringDisplay))
        {
            //用户代码
        }

        // 位置信息
        if (RESULT_DATAPOINT_NEW == Cloud.readDatapoint(DPID_BINARY_LOCATION, dpBianryLocation, dpBianryLocationLen))
        {
            //用户代码
        }
#if(false == DEV_REPORT_POLICY_AUTO)
        //数据上报手动处理
        Cloud.sendDatapointAll();
#endif
        /*******************************************************/
    }
}

void userInit(void)
{
    //定义数据点事件
    System.on(event_cloud_data, system_event_callback);
    //设置数据上报策略
#if(false == DEV_REPORT_POLICY_AUTO)
    Cloud.datapointControl(DP_TRANSMIT_MODE_MANUAL);
#endif
    //定义产品数据点
    Cloud.defineDatapointBool(DPID_BOOL_SWITCH, DP_PERMISSION_UP_DOWN, false);                            //开关
    Cloud.defineDatapointNumber(DPID_NUMBER_TEMPATURE, DP_PERMISSION_UP_ONLY, 0, 100, 1, 0);              //温度
    Cloud.defineDatapointNumber(DPID_NUMBER_HUMIDITY, DP_PERMISSION_UP_ONLY, 0, 100, 0, 0);               //湿度
    Cloud.defineDatapointEnum(DPID_ENUM_COLOR, DP_PERMISSION_UP_DOWN, 1);                                 //颜色模式
    Cloud.defineDatapointString(DPID_STRING_DISPLAY, DP_PERMISSION_UP_DOWN, 255, "hello! intoyun!");      //显示字符串
    Cloud.defineDatapointBinary(DPID_BINARY_LOCATION, DP_PERMISSION_UP_DOWN, 255, "\x12\x34\x56\x78", 4); //位置信息

    /*************此处修改和添加用户初始化代码**************/
    timerID = timerGetId();

    /*******************************************************/
}

void userHandle(void)
{
    /*************此处修改和添加用户处理代码****************/
    if(timerIsEnd(timerID, 3000))  //处理间隔  用户可自行更改
    {
        timerID = timerGetId();
        //更新数据点数据(数据点具备:上送属性)
        Cloud.writeDatapoint(DPID_BOOL_SWITCH, dpBoolSwitch);
        Cloud.writeDatapoint(DPID_NUMBER_TEMPATURE, dpDoubleTemperature);
        Cloud.writeDatapoint(DPID_NUMBER_HUMIDITY, dpIntHumidity);
        Cloud.writeDatapoint(DPID_ENUM_COLOR, dpEnumColor);
        Cloud.writeDatapoint(DPID_STRING_DISPLAY, "hello! intoyun!");
        Cloud.writeDatapoint(DPID_BINARY_LOCATION, "\x12\x34\x56\x78", 4);
#if(false == DEV_REPORT_POLICY_AUTO)
        //数据上报手动处理
        Cloud.sendDatapointAll();
#endif
    }
    /*******************************************************/
}

void setup()
{
    userInit();
}

void loop()
{
    //loop不能阻塞
    userHandle();
}

设备联网调试

添加设备

WEB端添加设备

登录主页后在导航栏处选择我的设备进入到设备界面。

1.:点击大蓝块添加设备; add_device_step1

2.这里需要打开MolmcBridge串口工具, 其安装说明请点击MolmcBridge安装。并将设备置于配置模式,有关设备模式说明请点击这里。点击下载并安装完MolmcBridge。 启用MolmcBridge后,填写设备名称和描述, 点击“添加设备”;

add_device_step2

3.接着进行配置网络 add_device_step3

这样设备就添加到您的账户中。

add_fin

设备联网调试

下载

在程序编辑好后需下载到板子,下载方式有串口下载和在线烧录2种方式。 目前LoRa和GPRS型板子只支持串口下载烧录,WiFi类设备2种方式都支持。

串口下载

串口下载和在线下载的功能一致,主要完成程序下载。串口下载需要MolmcBridge工具的支持,下载时需要启动MolmcBridge, 选择对应设备的串口,如下图所示,确保设备处于工作模式,并不要求设备处于联网状态(闪白灯)。点击【烧录】按钮进行编译下载。

串口下载速度较在线下载快,且不要求设备联网,适合于设备不联网的情况下使用。但串口下载必须有MolmcBridge工具的支持。 程序下载后,在进入【我的设备】界面点击进入“智能灯”设备,此时可以看到定义产品时定义的各个数据点,如下图所示。左边为设备信息包括头像,名称,设备标识等信息。中间栏展示产品数据点,用于控制。右边栏这显示通讯日志,数据的上送和下发情况。

设备烧录成功后,发生变化的还有【运营中心】下的设备管理界面,如下图所示。选择产品智能灯过滤后,在【已确认设备】列表下多出来一个“智能灯设备”,这个设备即刚刚通过在线编程烧录程序,服务器验证合法后批准到产品的设备列表中来的。

在线烧录

设备添加成功后,刷新Web端设备列表,如下图所示。说明设备“智能灯”已经添加成功。在线下载只需要设备通电,并连接网络(闪白灯)接口,无需MolmcBridge工具。

注意:设备需要处于工作模式(闪白灯),此时设备没有烧录程序,没有指定产品标识,因此,点击进入设备,并没有数据点可以查看,设备为空的。

进入在线编程,刷新界面选择刚刚创建的设备“智能灯”,如下图所示。在确保Nut设备在线的情况下点击左上角的【烧录】按钮,开始进行编译下载程序,设备会转为闪黄色等,直到程序下载完成,设备又返回闪白灯。

数据收发

设备联上平台后,会自动与产品绑定在一起,就可以看到数据点的数据了。

add_device_step1