近期物联网综合应用课程设计,做一个关于手机APP控制智能家居的设计
这篇博客主要是讲述使用正点原子F407开发板+机智云开发的移植代码过程,以及数据点的分析,以下都是个人经验,如有错误敬请各位批评指正。
首先我们去正点原子的官方论坛www.openedv.com下载F4的相关资料,下载机智云移植文件,觉得麻烦的话可以去淘宝客服要,或者下载我发的资源,下载完之后我们在程序源码中打开机智云IOT实验1,协议移植实验,我在这里选用的是标准库的版本(个人不是很喜欢寄存器版本),将这个标准库复制到桌面。
如果你直接烧录这个本身自带的HEX文件也是可以的,但是这里面这是可以实现手机控制LED灯,而且只能是通过公版的机智云APP来控制,因为这个文件里面的Product key and secret 和你的自己创建的匹配不上,假设你有幸看到了这两个东西在的地方,把他直接修改为自己的key and secret ,但是数据点对应不上,标识名都对应不上,因为对于速成的人,是没有办法仔细看协议的,最重要的是正点原子的教程都比较老了,里面移植的文件有点对应不上。
好了,言归正传,开始移植。将协议移植实验复制一份到桌面上,我这边直接复制在我的D盘下,打开后,会有以下文件夹。
文件夹里包含了一些基本的c文件和h文件,都是一些stm32的底层库函数文件吧,可能是这个说法,反正就不用改,也绝对不要去改,除非报错出现很多头文件损失的error,类似reference from xxx.o什么的错误,只会是两种问题,一种是没有添加相对应的头文件,要么就是你根本没有,怎么判断,就去看你的结构体指针,是不是在库里引用相关的H文件。
我们重点关注的是Gizwits USER 以及待会平台上下载的文件Utils。
接下来做两个比较简单的移植,一个是控制LED灯了,另外一个是PWM调光吧。
我们先去机智云的开发者中心创建我们的数据点,如图
在APP界面一个是调光进度条,一个是BANGBANG开关,实物放在宿舍,在办公室没办法连接实物,大家应该也能知道。
数据点类型的定义和读写类型可以查看机智云的数据点定义手册(个人TIPS:如果你有安卓studio 开发的相关经验 我建议你可以多创建几个数据点,多创建了我可以选择不用,标识名嘛Android.text更好修改了,但是一旦你少了,你想要再添加一个数据点,那就麻烦了,特别是对于像我一样需要快速开发的,只需求应用阶段而不是需要服务器协议以及接口部分的。要么你再移植一遍,要么你在对应的地方加上结构体指针,KEY and secret 也需要修改,但是这需要你有多次开发经验,也不是很可取)
创建完成之后,我们在MCU开发中心选择其他平台,将MCU移植代码下载下来,下载完成之后将整个文件夹复制到我刚刚说的协议移植实验里,全部覆盖就可以了。
整完之后,使用KEIL5打开user里面的工程文件,具体你缺少什么package支持包啊,动动小手百度一下检查怎么安装支持包。
第一步,打开工程文件后编译一下,发现有5个错误,
还记得我们复制common包里面的Utils吗,这些都文件都在里面,所以我们需要添加对应的文件,以及在Gizwits的文件夹下引用这些头文件,先添加文件夹,把对应的C文件添加到里面去,再在魔术棒下引用他的头文件,
然后编译,这样就可以把里面的文件引用进去了,这些应该都是基操吧,然后开始真正的移植,哪里少头文件再往里边添加。
第二步:解决这个时钟WARMING.在product.h添加 void gizTimerMs(void);对这个函数进行声明。
第三步:操作product.c
在文件最后添加USART_SendData(USART3,buf[i]); while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);
什么意思,我也不是很会,可能就是CDMA的意思吧。
找到mcurestart,添加软复位按时,这又是什么,别问,问就是我也不会。
第四步,修改MAIN.C文件里边
把product里边的userhandler函数剪切到主函数界面来,
在这里写逻辑的话就不用跳来跳去,而且我个人比较喜欢在这里使用USERHANDLE,因为这个函数只和你的设备有关,所以的信息都是你的设备上报的信息,不会涉及到你的WIFI模组,也和你的APP无关。
第五步:在product.c里面的dataPoint_t currentDataPoint;改成extern dataPoint_t currentDataPoint;
注意这里我们需要添加用户区当前设备状态结构体 extern dataPoint_t currentDataPoint;
总体移植在这里差不多是完成了,接下来就是对于case_event进行逻辑编写,如图
这里面的0X01代表的是高低电平和逻辑关系,就举个简单的例子,如果你是低电平触发,这里就应该是0x00,如果你也0x01那么这里的LED灯智能被强制转换成开启状态,就是他当前是1 , 你再给他置1,要么状态不变,要么强制转换,也就是状态和按钮相反,一个是启停状态,一个是控制按钮,对于407板子的ds0,ds1就无所谓,所以这里使用不同的LED灯一定要知道他灯的触发方式,实在不行到时候反一下就可以了。
currentDataPoint.valueLEDonoff是当前用户APP所设定的值,这里的值和设备一点关系也没有,就是APP所想要传递的值,和前面说的那个userhandle函数是不一样的吧。这里多做几遍就有心得了。
对了 在这里我在补充一点,LED1对应的管脚是哪个,自己去看LED.C和LED.H就好,管脚使能啊 结构体一步一步来不要弄错就行了。
我这边的LED2你们可能没有。只要看住你们自己的就行了。
接下来是一个pwm 脉宽调制器的问题,需要有定时器的一部分知识,具体还是查看一下PWM原理,以及时钟方面的知识,这里贴出代码,
然后大家可以看一下我PWM定义的结构体
84M,每秒500个脉冲,但是注意为什么我在case_event传值的时候要乘以5呢,是因为我在数据点定义的时候的取值范围是0-100.因为这种板载的LED灯,亮度变化不明显,没有这种必要,当然这个大家随机选择,我在这里稍微解释一下。
终于差不多到最后一步了,来仔细盘一下main.c的代码,
添加协议初始化函数Gizwits_Init函数,
添加主函数,主函数里添加如下,
这里使用按键控制进行WIFI模式的设置,以及复位键的选择。
具体可以看我们的代码和演示视频。
给大家附上链接,第一写,想挣点积分,有问题可私聊。
我感觉我亏 了,服务器 APP 加keil代码只给5个积分,点我头像自取吧