下面我就来讲讲软件部分的制作。

分为两个部分,一个是机智云的云端设置,还有一个就是固件的修改。

我们可以来先看看云端的设置,先登入机智云的开发者中心

然后创建一个设备,我们这里就叫排插吧。下面就按照实际情况填上。

然后就会要求创建数据点。

我们这里是五个插孔,所以创建五个排插。

当初我做的时候已经有个模板保存住了,所以这里直接使用即可,

导入了。

然后我们继续,就会得到这样一个文档,下载下来

这里我们先来看看这个文档,

看到这一部分。

还有这一部分

这两部分分别是上报数据点状态和下发控制命令的说明。

先说上报,上报就是将设备目前的状态上报给云端,有两种情况需要进行上报操作,一种是隔了一段时间(比如 10 秒)之后,就会进行一次例行上报,还有一种就是在执行完下发的命令之后,也要进行上报。

这里也顺带解释一下这些数据点的意义,看到 byte ,这个是单字节,我们都知道一个字节为八位,而我的插座对于一个插孔来说,只有两个状态,即开和关,所以只需要一位即可完整地表达一个插孔的状态,而温度和插座只是证书,完整地表达需要占用满完整的一个字节,即一个字节可以表达 00000000B (0) ~ 11111111 (255) 这个范围的数,所以对于温度和湿度来说足够了。

下面的下发也是基本一样的,这里不再赘述,在后面改固件的时候,再做详述。

然后就是固件和 APP 部分,APP 的话我这里就直接用 IOE demo 了,反正可以直接用,这里重点讲述固件部分的修改。

机智云官方一共提供了两种 MCU 的固件,一个是 Arduino ,一个是 STM32.

而我这里为了开发方便,就选用 Arduino 了,不过请注意,Arduino 的 MCU 基本上都很羸弱,所以,我们要阉割蛮多东西去。

好,先自己安装好 Arduino 的开发环境吧。

然后,到 github 拖代码。

https://github.com/gizwits/GoKit-Arduino-MCU.git

自己想办法拖到本地。

然后,按照 Readme.txt (居然不是 md= =~)里的提示安装好。

            ******************************************************************

            * *


            * gokit_2 arduino 工程配置说明 2015-01-04 *
            * *


            ******************************************************************

            串口属性

            波特率 : 9600

            流控制 : 无

            数据位 : 8

            停止位 : 1

            奇偶校验 : 无

            把lib 文件夹下的lib.zip解压之后,把所有的文件拷贝到Arudino IDE 安装路径下的库目录下,
            (x/Contents/Resources/Java/libraries).

安装好了之后,打开吧。

打开之后,要求移动,移动吧。

https://www.zhaojin97.cn/wp-content/uploads/2015/12/微信截图_20151220170815.png

然后就是开始修改了,首先要去掉液晶屏的支持,这里,直接把

            #include <ssd1306 .h>

给去掉,然后,编译吧,没错,编译,这样就根据错误提示,把液晶屏的支持一个个删掉,不删掉,卡出翔。

哦,差点忘记了,这几个要移动到这个文件夹内。

再次打开 Arduino IDE ,继续删支持。

删完,建议用 Git 进行版本控制。

我这里删完是这样的。

https://git.zhaojin97.cn/glzjin/GoSwitch/commit/adc7622b7a7164f844981698d9e1015ae3703f04

然后继续,我们来修改数据点,这里

protool.h 里的 _status_writable & _status_readonly

我这里修改成这样,记得顺序一定要正确,且 writeable (可写) 在前,readonly (只读在后)。

            struct  _status_writable
            {
                uint8_t             cmd_byte;
            };

            struct  _status_readonly
            {
                uint8_t             temputure;
                uint8_t             humidity;
            };

同样地,编译,然后根据错误提示进行修改。

提交记录在这:https://git.zhaojin97.cn/glzjin/GoSwitch/commit/18619e9d820820854a7ece7b5f2724d77ffb0d9f

然后是添加数据点使能,当然我们要先定义好 IO 接口,我这里是用了 A1-A5 5个接口来作为输出口,先在 Gokit_2.ino 里定义好

            pinMode(A1,OUTPUT);
            pinMode(A2,OUTPUT);
            pinMode(A3,OUTPUT);
            pinMode(A4,OUTPUT);
            pinMode(A5,OUTPUT);
            digitalWrite(A1,HIGH);
            digitalWrite(A2,HIGH);
            digitalWrite(A3,HIGH);
            digitalWrite(A4,HIGH);
            digitalWrite(A5,HIGH);

然后是使能部分,主要在 protocol.cpp 里,找到

              //
                if(m_w2m_controlMcu.sub_cmd == SUB_CMD_CONTROL_MCU){
                //
                SendCommonCmd(CMD_SEND_MCU_P0_ACK, m_w2m_controlMcu.head_part.sn);
                //want to control LED R 
                if((m_w2m_controlMcu.cmd_tag & 0x01) == 0x01)
                {
                    //0 bit, 1: R on, 0: R off;
                    if((m_w2m_controlMcu.status_w.cmd_byte & 0x01) == 0x01)
                    {
                        //Serial.println("GoKit init  OK!");
                        digitalWrite(A1,LOW);
                        m_m2w_mcuStatus.status_w.cmd_byte = (m_m2w_mcuStatus.status_w.cmd_byte | 0x01);
                    }
                    else
                    {
                        digitalWrite(A1,HIGH);
                        m_m2w_mcuStatus.status_w.cmd_byte = (m_m2w_mcuStatus.status_w.cmd_byte & 0xFE);
                    }
                }
                //¿ØÖÆLED×éºÏÑÕÉ«
                if((m_w2m_controlMcu.cmd_tag & 0x02) == 0x02)
                {
                    if((m_w2m_controlMcu.status_w.cmd_byte & 0x02) == 0x02)
                    {
                        digitalWrite(A2,LOW);
                        m_m2w_mcuStatus.status_w.cmd_byte = (m_m2w_mcuStatus.status_w.cmd_byte | 0x02);
                    }
                    else
                    {
                        digitalWrite(A2,HIGH);
                        m_m2w_mcuStatus.status_w.cmd_byte = (m_m2w_mcuStatus.status_w.cmd_byte & 0xFD);
                    }
                }
                if((m_w2m_controlMcu.cmd_tag & 0x04) == 0x04)
                {
                    if((m_w2m_controlMcu.status_w.cmd_byte & 0x04) == 0x04)
                    {
                        digitalWrite(A3,LOW);
                        m_m2w_mcuStatus.status_w.cmd_byte = (m_m2w_mcuStatus.status_w.cmd_byte | 0x04);
                    }
                    else
                    {
                        digitalWrite(A3,HIGH);
                        m_m2w_mcuStatus.status_w.cmd_byte = (m_m2w_mcuStatus.status_w.cmd_byte & 0xFB);
                    }
                }
                if((m_w2m_controlMcu.cmd_tag & 0x08) == 0x08)
                {
                    if((m_w2m_controlMcu.status_w.cmd_byte & 0x08) == 0x08)
                    {
                        digitalWrite(A4,LOW);
                        m_m2w_mcuStatus.status_w.cmd_byte = (m_m2w_mcuStatus.status_w.cmd_byte | 0x08);
                    }
                    else
                    {
                        digitalWrite(A4,HIGH);
                        m_m2w_mcuStatus.status_w.cmd_byte = (m_m2w_mcuStatus.status_w.cmd_byte & 0xF7);
                    }
                }
                if((m_w2m_controlMcu.cmd_tag & 0x10) == 0x10)
                {
                    if((m_w2m_controlMcu.status_w.cmd_byte & 0x10) == 0x10)
                    {
                        digitalWrite(A5,LOW);
                        m_m2w_mcuStatus.status_w.cmd_byte = (m_m2w_mcuStatus.status_w.cmd_byte | 0x10);
                    }
                    else
                    {
                        digitalWrite(A5,HIGH);
                        m_m2w_mcuStatus.status_w.cmd_byte = (m_m2w_mcuStatus.status_w.cmd_byte & 0xEF);
                    }
                }

                //m_m2w_mcuStatus.status_r.switches=m_w2m_controlMcu.status_w.cmd_byte;
                gokit_ReportStatus(REPORT_STATUS);
            }

修改成这样,就可以了,

提交历史:https://git.zhaojin97.cn/glzjin/GoSwitch/commit/222a089e6a877d5f25e2331553d46461ecc71e2a

然后编译,烧写进 Arduino ,然后用 APP 绑定即可使用,

源码地址:https://git.zhaojin97.cn/glzjin/GoSwitch/

有任何疑问欢迎在评论区和我交流。