iDea 发表于 2016-10-2 13:58:42

基于UCOSIII+机智云的简易远程格力空调遥控器

本帖最后由 Genius 于 2017-1-3 16:56 编辑

       夏天特别的热,特别是上完课以后,回到宿舍开空调要一段时间才能凉下来,于是我便用机智云的套件做了一个远程的空调遥控器,这样我可以在下课前就把宿舍的空调打开,在床上的时候也不用下去拿遥控器关空调,特别方便。下面是制作过程:做得不好,主要是给新手提供一个入门教程。本次使用的空调是格力空调,遥控器型号为:YB0F2
       第一步:要有注册一个开发者账号,这个我就不多说了,很简单。
       第二步:创建产品,如图1所示,点击创建;然后选择产品类型等,如图2所示;创建成功后,如图3所示;点击数据点菜单,创建数据点,如图4所示,因为我常用的就只有这两个功能,开空调和设温度,所以没有做其他的数据点,大家可以自行设置。

图1
      
图2

图3图4      第三步:生成MCU代码包并下载,这里的主要是机智云的通信协议,我们可以把他移植到其他型号上,不一样是STM32F103C8xx的MCU。下载下来之后,可以看见如图5所示这几个文件:其中用红色框住的是最重要的,是跟机智云服务器进行数据收到的协议,不可更改,其他的可更改,wifi模组默认使用的是USART2,串口打印调试信息为USART1。图5       第四步:移植,根据自己的需要进行移植,由于我使用的是GoKit2的套件,我就全部移植进行入我建好的UCOSIII工程中。       第五步:把GAgent固件烧录到wifi模组中。不是只有机智云的GoKit套件才可以使用机智云的服务,只要你有开发者账号就可以和使用有进行合作的WIFI模组就可以。但是你的WIFI模组要烧录GAgent固件,机智云对这个不开源。支持的模组如图6所示。       ESP8266看这个帖子:http://club.gizwits.com/forum.ph ... 1&highlight=ESP8266       汉枫LPB-100看这个帖子:http://club.gizwits.com/forum.ph ... 19&highlight=LPB100       其他的自行搜索,没用过。图6       第六步:修改相应的函数:只要在int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t len);相应的位置上写上自己所以执行的函数就行了。非常简单。图7       到这里就全部完成了,只要你下载一下Demo APP就可以进行控制了,会写APP的可以自己写一个。       注意:在任务中执行gizwitsHandle((dataPoint_t *)¤tDataPoint);任务堆栈要为256,之前开128一跑就挂了。       下面是我自己的工程文件:


bigfanofloT 发表于 2016-10-2 20:21:41

赞一个

许许 发表于 2016-10-6 21:28:12

顶起:):):):):):)

iDea 发表于 2017-1-6 20:09:49

本帖最后由 iDea 于 2017-1-7 10:14 编辑

最近又搞了一下MCU上面的程序,主要改到了按键配置入网的地方,源码是采用开定时器2(TIM2)的方式循环扫描,看是不是有被按下。
但是在UC/OS上,我们就不用这么麻烦了,因为我们有定时任务,而且优先级也很高的。所以这次我就改用定时器任务来代替定时器。我们要怎么做呢?首先要创建一个定时器任务:

/*定时器1*/
OS_TMR tmr1;
void tmr1_callback_led(void *p_tmr, void *p_arg);void tmr1_callback_led(void *p_tmr, void *p_arg)
{
      IWDG_FREE();
      keyHandle((keysTypedef_t *)&keys);
}我在这里连看门狗也一起喂了,最后我们再对定时器任务进行初始化和开始:
/*初始化定时器1任务*/
OSTmrCreate      ((OS_TMR                                  *)&tmr1,
                              (CPU_CHAR             *)"tmr1_led",
                              (OS_TICK               )0,//初始延迟0*10ms
                              (OS_TICK               )1,//定时周期1*10ms
                              (OS_OPT                )OS_OPT_TMR_PERIODIC,//周期模式
                              (OS_TMR_CALLBACK_PTR   )tmr1_callback_led,
                              (void               *)0,
                              (OS_ERR               *)&err);
OSTmrStart(&tmr1,&err);//开启定时器1接下来,我们要把void keyParaInit(keysTypedef_t *keys)函数中初始化定时器的语句注释掉

最后修改一下消抖的时间,有需要的也可以修改一下长按计时的时间,我这里没有修改。因为运行起来的时间也是我想要的。这样就大功告成啦!
下次我看一下能不能把机智云的TIM3的基准时间也给用定时取代了。目测不行,一个时间片是10MS,TIM3每1ms自加一次,不知道改次成自加10行不行。试完了告诉大家。先更新这么多

iDea 发表于 2017-1-7 10:26:19

今年早上起来又改了一下我上面说的用定时任务代替定时器的东西,试了一下,没有问题,能正常运行,但是我不知道怎么做测试,我现在就把这个方法贴上来,有测试能力的同学可以跟我说一下怎么测试。下面是改的教程:
第一步:创建定时任务,先开一个定时器要用的堆栈:
OS_TMR tmr2;
void tmr2_gizwtime(void *p_tmr, void *p_arg);第二步:创建定时任务:
/*初始化定时器2任务*/
OSTmrCreate      ((OS_TMR                                  *)&tmr2,
                     (CPU_CHAR             *)"tmr1_giztime",
                     (OS_TICK               )0,//初始延迟0*10ms
                     (OS_TICK               )1,//定时周期1*10ms
                     (OS_OPT                )OS_OPT_TMR_PERIODIC,//周期模式
                     (OS_TMR_CALLBACK_PTR   )tmr2_gizwtime,
                     (void               *)0,
                     (OS_ERR               *)&err);
OSTmrStart(&tmr2,&err);//开启定时器2第三步:写定时器2的任务函数,在这里,我们要先引用协议全局变量:
extern gizwitsProtocol_t gizwitsProtocol;
void tmr2_gizwtime(void *p_tmr, void *p_arg)
{
        gizwitsProtocol.timerMsCount += 10;
}这里为什么要自加10?因为UC/OS中一个时间片是10ms,而机智云源码中使用定时器3来进行自加1,也就是1ms加1,所以我这里10ms自加10。溢出自动归零。
最后,我们再把void gizwitsInit(void);中的timerInit();注释掉。

这样就完成了,目前我也不能确定这种方法是否会引发一些问题,用用再看,说不定给自己挖了一个坑。

GKXW 发表于 2017-1-9 12:51:32

空调是红外遥控器,你的stm32c8t6上有相关遥控器的解码程序吗?空调是不是自身带有WIFI控制功能?

iDea 发表于 2017-1-11 10:23:43

GKXW 发表于 2017-1-9 12:51
空调是红外遥控器,你的stm32c8t6上有相关遥控器的解码程序吗?空调是不是自身带有WIFI控制功能? ...

空调就是普通的空调,5年前的那种吧。没有写解码程序,只是自己把空调的码写在程序里,宿舍空调就一种,没有写学习功能。

szuser 发表于 2017-1-16 10:33:29

iDea 发表于 2017-1-11 10:23
空调就是普通的空调,5年前的那种吧。没有写解码程序,只是自己把空调的码写在程序里,宿舍空调就一种, ...

6楼的问题是 STM32 如何将控制信号 输送给空调的,“把空调的码写在程序里"------没理解这句是什么意思.

iDea 发表于 2017-1-16 11:46:55

szuser 发表于 2017-1-16 10:33
6楼的问题是 STM32 如何将控制信号 输送给空调的,“把空调的码写在程序里"------没理解这句是什么意思 ...

用红外啊,就是自己做一个可以联网的遥控器。

cyqsd 发表于 2017-7-6 00:16:13

谢谢分享。好东西

lifuyao 发表于 2017-8-15 20:23:21

楼主你好,我也想做一个类似的,想问问红外发射器用的硬件是什么?stm32芯片开发板上面有红外发射器吗

lifuyao 发表于 2017-8-15 20:25:16

你用的开发板吗?我用的正点原子的,只有红外接收功能,没有发射功能

iDea 发表于 2017-8-15 20:27:45

lifuyao 发表于 2017-8-15 20:23
楼主你好,我也想做一个类似的,想问问红外发射器用的硬件是什么?stm32芯片开发板上面有红外发射器吗 ...

红外发射就用的一个三极管放大驱动红外发射管。很简单的电路

iDea 发表于 2017-8-15 20:28:30

lifuyao 发表于 2017-8-15 20:25
你用的开发板吗?我用的正点原子的,只有红外接收功能,没有发射功能

我自己画的板子

lifuyao 发表于 2017-8-17 22:35:19

iDea 发表于 2017-8-15 20:28
我自己画的板子

自己画的板子是什么意思,能解释一下吗?

iDea 发表于 2017-8-18 19:14:55

lifuyao 发表于 2017-8-17 22:35
自己画的板子是什么意思,能解释一下吗?

自己画的PCB,自己焊的板子
页: [1]
查看完整版本: 基于UCOSIII+机智云的简易远程格力空调遥控器