下面我就来讲讲软件部分的制作。
分为两个部分,一个是机智云的云端设置,还有一个就是固件的修改。
我们可以来先看看云端的设置,先登入机智云的开发者中心
然后创建一个设备,我们这里就叫排插吧。下面就按照实际情况填上。
然后就会要求创建数据点。
我们这里是五个插孔,所以创建五个排插。
当初我做的时候已经有个模板保存住了,所以这里直接使用即可,
导入了。
然后我们继续,就会得到这样一个文档,下载下来
这里我们先来看看这个文档,
看到这一部分。
还有这一部分
这两部分分别是上报数据点状态和下发控制命令的说明。
先说上报,上报就是将设备目前的状态上报给云端,有两种情况需要进行上报操作,一种是隔了一段时间(比如 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).
安装好了之后,打开吧。
打开之后,要求移动,移动吧。
然后就是开始修改了,首先要去掉液晶屏的支持,这里,直接把
#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/
有任何疑问欢迎在评论区和我交流。