【训练营】涂鸦智能家居空调控制器-695432A - 嘉立创EDA开源硬件平台

编辑器版本 ×
标准版 Standard

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版 professional

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

标准版 【训练营】涂鸦智能家居空调控制器-695432A

  • 4.8k
  • 1
  • 27

简介:智能空调控制器,具备自动控温,定时启停,APP管理,可学习多种空调遥控指令。

开源协议: GPL 3.0

(未经作者授权,禁止转载)

创建时间: 2020-11-23 15:37:53
更新时间: 2021-10-05 09:10:58
描述
# 项目描述 ## 设计描述 ### 应用需求 参加此次立创EDA&涂鸦智能实战训练营,要求做物联网相关的,使用涂鸦的云模组。一提到云,我最先想到的是智能家居,自己平时工作之余,也做了不少的与物联网相关的项目,做的大大小小的项目不少。家里电器差不多都自己改成智能的。正好最近有做红外遥控空调的想法,加上工作原因,有涂鸦智能云开发需求,所以参加此次训练营。 冬天来了,早上起床太早都不敢掀被子(太冷 /笑哭),一直想改成智能的,用手机控制,支持定时开启/关闭,支持智能场景联动。 ### 功能设计 要实现空调控制,就是要发送红外,所以要有红外发送功能。市面上空调种类繁多,肯定要适用多种品牌和机型,所以要有红外学习功能。要支持场景联动,就要有环境感知传感器。要支持手机控制,就要有云端和模组。 综上,设计功能有: 1、红外发送(红外发射管);2、红外学习(一体化接收头);3、室内温度检测(DHT11);4、手机控制(涂鸦模组)。 ## 成品效果 在实际场景中,空调的安装位置一般都不固定,所以,红外控制器不能近距离控制。参考其他大品牌红外控制器设计,采用壁挂式设计。可以挂在天花板或墙壁上。 控制板全部用立创EDA绘制,自己手工贴片,涂鸦模组上面的文字是被清洗剂洗掉了,操作时大意了(/捂脸)。 ![14.png](//image.lceda.cn/pullimage/ONcw01bkrXcL99gnYUCT4LOB7acPjLZnuqQz5CJ7.png) 使用的公模外壳,安装效果。 ![00113.png](//image.lceda.cn/pullimage/6nIvvl2719GzHJAGpNrD1w1MEiLXY6RDnOIFShjK.png) ![00112.png](//image.lceda.cn/pullimage/aWuPog1Fe2jboOVscyjgUCfZilbsHELXbNoSjgot.png) ![001111.png](//image.lceda.cn/pullimage/ts8Fq9zNysex1JnCvAJHtiPq1X9KOzd2Dx1NxLPl.png) ## 硬件设计 ### 原理图设计 ### 电源 电源部分采用Micro USB接口,直接提供5V电源,经过内部分压得到3.3V电压,为MCU、涂鸦模组和外围电路供电。降压采用TI的TLV62569DBVR电源芯片,外围器件少,功率大,纹波小。 ![image-20201206172543398](https://i.loli.net/2020/12/06/Qhp932DwsSrEvN8.png) ### 云模组 采用涂鸦智能提供的WBR1D-IPEX模组,WBR1D是双频双模模组,支持WIFI和蓝牙,采用MCU接入方案。通过串口与MCU连接。 ![image.png](//image.lceda.cn/pullimage/B89igcfFoBAhApC1oqyXe78mD2LTQRDbFWTd90Dd.png) ### MCU MCU采用ST的STM32F103C8T6,64K的Flash。 ### 红外发射 红外发射采用红外管,因为是壁挂式安装方式,所以对控制范围要求,本设计中采用8颗红外发射管并联,每科管子由一颗大功率三极管驱动,所有三极管由一个控制端驱动。以提高发射功率,提高发射功率后,红外控制范围会明显扩大。(多颗红外管最好并联控制,不要为画PCB方便或者节省器件而选择串联,串联的管子都不会正常工作,发射功率会大幅度下降。) ![image.png](//image.lceda.cn/pullimage/UNY2LRjeX1nSHsj9z6tXiqi6y4ws7XSDBAiLluzg.png) ### 红外接收 红外接收比较简单,直接采用一体化接收头。 ![image-20201206173549250](https://i.loli.net/2020/12/06/tgRTjcn2a716Vkd.png) ### 附加电路 #### 按键 按键用于配网使用,但是在实际调试时,模组会自动配网,所以按键改为清除红外预存的数据。 #### LED LED用于只是配网状态和指示进入红外学习模式,以及故障闪烁。 #### DHT11 DHT11用于检测室内温湿度,在本设计中,红外遥控器做为单品使用,DHT11可以向云端上报室内温度、湿度,可实现智能场景联动。 ### PCB设计 PCB设计时,因为是壁挂式,所以选了一个公模外壳,[采购链接](https://item.taobao.com/item.htm?spm=a1z09.2.0.0.20272e8dzstiKJ&id=570522908699&_u=62n6hgju95e3)。在设计时器件布局和PCB外形要符合外壳尺寸。 外壳: ![image.png](//image.lceda.cn/pullimage/XMLyIWhUJZKWYAl5nXXiq02Va1rzZXa9Kw0DQ24T.png)
PCB:初版PCB有几个错误,按键位置与LED位置反了,丝印错误,已经更新。

![image.png](//image.lceda.cn/pullimage/T5tiQpTITjoGk3K7MvMgVdFf5nP6vTFKfNwd7tS9.png) ## 软件设计 ### 红外接收实现 红外接收比较简单,如果是易于解析的NEC格式编码,直接用定时器捕获外部输入电平时间长度即可,对于不易解析的编码(厂家自定义的编码)采用外部中断和定时器方式测电平时间长度。对于NEC格式编码,按照NEC编码格式的规范,先判断低电平时间,通过长度区分起始码、数据码和结束码。网上例程比较多,这里就不赘述了,要注意的是:有的厂家空调虽然是NEC编码,但是他们的编码中高低电平长度一般都不同,所以在中断中判断电平长度时,要注意设置范围。 具体实现代码请参阅附件中的程序。 ### 红外发射实现 红外发射是红外管完成,注意:红外管不发射红外在接收端输出1,发射红外在接收端输出是0,这里要注意区分。 实现方式用定时器输出一个38K的方波,控制方波输出的时间长度即可实现发送不同的数据和编码。本项目采用两个定时器来实现发送红外,TIM1输出38K载波,TIM3定时,由TIM3计时,控制TIM1输出/关闭PWM,这样可以实现任意时间长度发送。但是这样比较耗费MCU资源,对于STM32来说,影响不大,对于小型MCU就要考虑资源了。 下面是实现红外发送的关键代码: 发送一组完整红外编码Inf\_RX\_NECcoding() ``` cpp void Inf_RX_NECcoding(uint8_t *pbuff,uint8_t Length,uint8_t quantity) { uint8_t i; TIM_CtrlPWMOutputs(TIM1,ENABLE); //开输出 TIM_Cmd(TIM3,ENABLE); //开定时器 TIM_Cmd(TIM1,ENABLE); while(Inf_RX_StartCode()); //起始码 if(Length>InfraredDataLength) //数据有效长度限制 Length = InfraredDataLength; for(i=0;iInfraredDataLength) Length = InfraredDataLength; for(i=0;i数据发送(1个8位) ``` cpp uint8\_t Inf\_RX\_StartCode\(void\)  {   if(!retemp)   {   retemp=1;   TimerOclk=0;   TIM_SetCompare1(TIM1,1100); //设置占空比为50%   }   if(TimerOclk==441) //低电平时间到   TIM_SetCompare1(TIM1,0); //设置占空比为0   if(TimerOclk==881) //高电平时间到   {   retemp=0;   TimerOclk=0;   }   return retemp; //状态返回  } ``` 篇幅有限,其余代码请参阅附件。 ### 红外学习功能 本项目中只实现NEC编码红外学习,当按下手机端控件时,如果没有指令,会自动进入学习状态,等待发送红外指令。红外指令接收到以后,会自动保存。 ### 云功能实现 因为使用涂鸦的MCU接入方案,云端只做功能和APP界面的配置,并下载MCU的SDK,将SDK移植到代码中即可 云端功能配置 ![image.png](//image.lceda.cn/pullimage/NjEtsx6kNznABtZgydoXwcnynUa3ef7deQpe5SdN.png) APP界面配置 ![image.png](//image.lceda.cn/pullimage/9be1bwFRr3PjRXhgXvB1UPePOjWDI4AJUXSLrxNv.png) ### 防跑飞 在实际测试过程中遇到了,设备掉线和控制无反应问题,起初以为是网络问题,更换网络以后,问题依旧存在。拆下板子发现整个PCB发烫,测量MCU供电只有接近2V左右,照理说可以正常工作。拔掉电源,重插,MCU供电恢复。等待问题再次出现时,测得红外管驱动三极管控制端一直是低电平,问题发现了:8颗红外发射管的发射功率比较大,在关闭输出时可能是被中断打断,导致关断不成功,红外管一直处于发送状态,时间一长,8红外管总电流增大,提供给MCU的电流减小,出现假死现象。 为了解决这个问题,增加了三道防线,一是每次发送完成后将输出和定时器一起关闭,这样可以减少中断冲突的几率。二是增加STM32内部测温,一旦检测到温度超过允许值,再管定时器和PWM输出1次,如果超过警报值,直接复位MCU。三是增加看门狗,定时喂狗,防止假死和程序跑飞。 加上这三道防线后,实测问题不再发生。具体实现代码,请参阅附件。 ## 关键点分析 ### MCU_SDK 移植 涂鸦提供配套的MCU SDK,具体使用方式涂鸦也提供很多的文档,b站也有很多案例。我们只需要移植到MCU中即可,通过串口通讯,实现MCU接入。注意接涂鸦模组串口的波特率,一般默认是9600,也可以修改为115200,具体在云端控制台的硬件开发->模组固件中修改。在移植时有以下几个地方要注意: **mcu_api.c** 1、串口接收函数uart\_receive\_input\(\),要用中断法接收,防止数据丢包 涂鸦提供串口数据接收缓存和数据处理方法,我们不需要再单独去做处理,只需要在串口接收中断里面调用uart\_receive\_input\(\)函数即可。 ``` cpp //USART2中断服务函数  void USART2_IRQHandler(void)  {    uint8_t value ;    if\(USART\_GetITStatus\(USART2\, USART\_IT\_RXNE\) \!= RESET\)  //接收中断   {     value = USART_ReceiveData(USART2); //读取接收数据   uart\_receive\_input\(value\); //数据存入涂鸦缓冲器   }  } ``` 2、数据轮询函数wifi\_uart\_service\(\),要轮询这个函数,不然模组下发的数据MCU接收不到。放在主循环里面就行。 ``` cpp while (1)  {      wifi\_uart\_service\(\); //轮询涂鸦数据      /*        用户其他函数      */  } ``` 3、协议初始化函数wifi\_protocol\_init\(\),这是为涂鸦串口数据提供一个缓存空间,在初始化中调用,初始化后不需要再调用。 ``` cpp int main(void)  {   wifi\_protocol\_init\(\); //涂鸦模组协议初始化      /*        用户其他初始化函数      */* *     while(1)* *    {* \*        wifi\_uart\_service\(\); //轮询涂鸦数据\* *     /*        用户其他函数      */     }  } ``` **protocl.c** 1、串口发送函数uart\_transmit\_output\(\),用调用法发送,也可以用中断。 涂鸦提供串口发送数据处理方法,我们也不需要再单独去做处理,只需要将串口发送语句放在uart\_transmit\_output\(\)函数里即可。 ``` cpp void uart\_transmit\_output\(unsigned char value\)  {    while((USART2->SR &(1<<7))==0);   USART2->DR = value;  } ``` 2、所有数据上报函数all\_data\_update\(\) 我们要在all\_data\_update函数中实现设备数据的传入,涂鸦模组或向MCU申请返回设备全部数据,设备数据通过all\_data\_update函数发送,所以要把设备的数据项传入到对应的函数中。注意:这个函数根据自己云端定义的功能对应,不能直接添加。 ``` cpp void all\_data\_update\(void\)  {      //此代码为平台自动生成,请按照实际数据修改每个可下发可上报函数和只上报函数      mcu\_dp\_bool\_update\(DPID\_SWITCH\,AirControlStructure\.AirPowerControl\); //BOOL型数据上报; //当前开关      mcu\_dp\_value\_update\(DPID\_TEMP\_SET\,AirControlStructure\.AirRunTemper\); //VALUE型数据上报; //当前温度设置  // mcu\_dp\_value\_update\(DPID\_TEMP\_CURRENT\,AirControlStructure\.AirRunTemper\); //VALUE型数据上报; //当前当前温度      mcu\_dp\_enum\_update\(DPID\_MODE\,AirControlStructure\.AirRunMode\); //枚举型数据上报; //当前工作模式      mcu\_dp\_enum\_update\(DPID\_FAN\_SPEED\_ENUM\,AirControlStructure\.AirRunFan\); //枚举型数据上报; //当前风速  //   mcu\_dp\_enum\_update\(DPID\_STATUS\,AirControlStructure\.AirRunFlag\); //枚举型数据上报; //当前状态      mcu\_dp\_bool\_update\(DPID\_AUTO\,AirControlStructure\.AirForceful\); //BOOL型数据上报; //当前自动模式      mcu\_dp\_bool\_update\(DPID\_HEAT\,AirControlStructure\.AirHeat\); //BOOL型数据上报; //当前辅热  } ``` 3、单个数据下发处理函数,在protocl.c中涂鸦定义了与功能对应的处理函数,我们要在对应函数中实现控制代码。示例 ``` cpp static unsigned char dp\_download\_switch\_handle\(const unsigned char value\[\]\, unsigned short length\)    //开关  {      //示例:当前DP类型为BOOL      unsigned char ret;      //0:关/1:开      unsigned char switch_1; switch\_1 = mcu\_get\_dp\_download\_bool\(value\,length\);      if(switch_1 == 0) {   AirControlStructure.AirPowerControl=OFF;//关   AirControlStructure.AirHeat = OFF;       //辅热关      AirControlStructure.AirForceful = OFF;   //强劲关     }else {   AirControlStructure.AirPowerControl=ON; //开     }   AirControlInfRX(); //发送红外代码 //处理完DP数据后应有反馈      ret = mcu\_dp\_bool\_update\(DPID\_SWITCH\,switch\_1\);      if(ret == SUCCESS)          return SUCCESS;      else          return ERROR;  } ``` **其实MCU接入方案,就是串口通讯。涂鸦提供有SDK,在云端定义好功能,配置好固件和APP面板,下载SDK包,移植到MCU代码中就可以用,不要单独做函数设置配网,上云等繁琐的工序。这对产品研发者来讲,不管是测试,还是研发,都是非常友好的。** ### 空调控制 以上工作完成后,重点来了,代码写得再漂亮,电路设计在完美,控制不了空调都等于0。大家都知道空调是红外遥控控制,所以本项目就是发射空调遥控器发射得红外编码,代替遥控器控制控制空调。这里的难点在于如何获得空调的红外编码,目前市面上销售的空调,红外编码都是厂家自定义的。售后或者说明书里面也不会提供具体的编码协议,所以只能自己去解析。下面简述解析过程,解析过程繁琐,文档篇幅较多,详细内容请移步语雀文档[空调遥控码解析](https://www.yuque.com/zhongkezhikuliyongyuanfang/qcr6dc/ke4l6u) 首先要获得红外的编码,我的方式是用逻辑分析仪和红外接收头,按遥控器的一个键,查看分析仪捕获的波形,通过波形解析出数据,这个过程不难,但是很繁琐。 ![image.png](//image.lceda.cn/pullimage/QRmoFE4RnTguEl19kZI8n6FbvpVgCRWG9XbpcxXH.png) 以开机为例,按下开机键,遥控器发送一组红外编码,逻辑分析仪捕获到波形,如图 ![image.png](//image.lceda.cn/pullimage/yQBPyM7X796h01Y9uUo3dTD3f6mLt7b1rnkASD8I.png) 重复按下开机键,每次分析仪捕获的波形都相同,将波形放大后打印,如图: ![全波形](https://i.loli.net/2020/12/06/HFnbRhtelKQL2jv.png) 这就是完整的一组红外波形,我只要发送与这组波形一样的编码即可控制空调开机。但是现在只是知道了电平变换时间,具体变换的时间长度代表什么还不知道。但是通过这组完整的波形可以看出,它是符合NEC编码格式(不了解NEC红外编码格式的,请先查查相关资料),只是电平变换时间长度略有不同而已,所以先尝试用NEC编码接收程序试一下。通过NEC编码红外接收程序测试,发现能够接收到数据: ![image.png](//image.lceda.cn/pullimage/qYKXWROFw1AS6ckqrXgWrl5ytRukw8E7GS3PFqut.png) 那么现在直接发送这组红外数据,就能控制空调开机。但是实测没有办法控制,空调无反应。反过来查看逻辑分析仪捕获的波形,这个波形与标准NEC编码的发射波形除了高低电平变换时间长度不同,总长度也不同。细看这个开机波形,它的前半部分和后半部分是相同,按照NEC格式截取前后半个部分波形, 前半部分: ![第一帧](https://i.loli.net/2020/12/06/7TBfnhFom9MUjIs.png) 后半部分: ![第二帧](https://i.loli.net/2020/12/06/Kha4XFoSyGJH9eg.png) 惊奇的发现它们的起始码、数据码是相同的,结束码略有不同,由此可以看出,这个红外编码是由两帧构成,两帧之间有一个中间码,是连接以及第一帧和第二帧用的。将第一帧波形、第二帧波形和完整波形,得到中间码的波形。 ![image.png](//image.lceda.cn/pullimage/5fs1Zd6a8qz7jlX2pb79K3o0JdKcyTTbKByvOsDK.png) 通过逻辑分析仪得出,中间的电平变化时间关系: ![中间码](https://i.loli.net/2020/12/06/KsbNRS5fVdlicTP.png) ![image-20201204153906054](https://i.loli.net/2020/12/06/4JhBEMGmlFonUSQ.png) 由此,解析出起始码、数据码、中间码和结束码的电平变化时间间隔,按照解析结果重新定义红外发送函数,测试能正常开机。 ### AAP功能配置 APP界面除了默认功能外,加了部分功能,因为使用的公版APP界面,所以界面UI和功能自定义的范围有限,后期会改成面板SDK开发,现阶段时间不多,做不了开发。 以强劲功能为例,本项目设计时,没有添加强劲功能。现在要添加,首先进入涂鸦IoT平台,找到项目,进入APP面板配置页面,在页面点击“编辑”, ![image-20201206193912638](https://i.loli.net/2020/12/06/vbXTHR7PaZsGCNz.png) 进入编辑页面,先选择按钮添加的位置,这里添加到更多页面 ![image-20201206194258509](https://i.loli.net/2020/12/06/TKA3gI5JM4rxaqk.png) 配置好属性和关联功能以后,点击发布,涂鸦会自动打包,打包好了以后,会提供测试二维码,扫二维码可以测试这个面板,如果测试通过点正式发布,发布以后,手机端退出“涂鸦智能”APP,重新进入,添加的功能就生效。
设计图
原理图
1 /
PCB
1 /
未生成预览图,请在编辑器重新保存一次
ID Name Designator Footprint Quantity
1 330 R11 R0603 1
2 10uF C3 C0603 1
3 10K R5,R14,R9,R30,R31,R13,R1,R27,R29,R16,R32 R0603 11
4 1K R18 R0603 1
5 204-10SYGD/S530-E3 LED2 LED-TH_BD3.8-P2.54-FD 1
6 Header-Male-2.54_1x4_C124378 H1,H2,H3 HDR-TH_4P-P2.54-V 3
7 TLV62569DBVR U5 SOT-23-5_L3.0-W1.7-P0.95-LS2.8-BR 1
8 22pF C21,C20 C0603 2
9 2 R6,R7,R10,R15,R19,R22,R24,R26 R0603 8
10 52.3K R3 R0603 1
11 100nF C9,C6,C13,C11,C22,C10,C17 C0603 7
12 0.1u C4,C7,C14,C15 C0603 4
13 micro 5PFour-legged board7.2There is a column card point0.4m USB1 MICRO-USB-SMD_5P-P0.65-H-F-C40943 1
14 STM32F103C8T6 U1 LQFP-48_L7.0-W7.0-P0.50-LS9.0-BL 1
15 M3铜柱 TP4,TP3,TP2,TP1 SCREWHOLE 4
16 1825027-5 SW1 KEY-TH_4P-L7.5-W6.8-P4.50-LS7.2 1
17 1uH L2,L3 L0603 2
18 WBR1D-IPEX U3 WBR1D-IPEX 1
19 2.2uH L1 IND-SMD_L4.0-W4.0 1
20 22uF C5,C8,C12,C16 CAP-SMD_L3.5-W2.8-R-RD 4
21 MHL512IR049CRT IRF1,IRF2,IRF3,IRF4,IRF5,IRF6,IRF7,IRF8 LED-TH_BD5.8-P2.54-FD 8
22 100 R4,R8,R12,R17,R20,R21,R23,R25,R28 R0603 9
23 11.5K R2 R0603 1
24 22uF C1,C2 C0603 2
25 ZheJiang X2 HC-49US_L11.5-W4.5-P4.88 1
26 BC858B Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8 SOT-23-3_L2.9-W1.3-P1.90-LS2.4-BR 8
27 IRM-3638MF31 IR1 OPTO-TH_3P_IRM-3638MF31 1

展开

工程成员
侵权投诉
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

温馨提示
动态内容涉嫌违规
内容:
  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

support
  • 开源平台公众号

MP