Giter Club home page Giter Club logo

esp32_homekit_airconditioner's Introduction

接入HomeKit的ESP32空调控制器

更新日志

  • 2021.9.25:根据power_save例程添加了light-sleep模式及DFS,系统自动决定CPU频率和是否进入light-sleep模式。

    因为手里只有一个量程为20A的电流表(小量程用不了),测得结果肯定不准确,之前的代码在不用家庭App操控时的电流大约为30~40mA,现在大约为10~20mA,如果与家庭App通信时电流大约为40~70mA

    目前只添加了WiFi使用HARDCODED时的代码;以及rmt_config_t变量中的成员flags设置为RMT_CHANNEL_FLAGS_AWARE_DFSclk_div1以支持DFS;在发生红外指令时,调用电源管理锁esp_pm_lock_handle_t防止自动进入light-sleep模式。

    1. 需要在menuconfig中启动Support for power managementTickless idle support选项,以及进行WiFi listen intervalpower save modeMaximum/Minimum CPU frequency配置

    2. 需要在esp-homekit-sdk/examples/common/app_wifi/app_wifi.c中275行

    #ifdef CONFIG_APP_WIFI_USE_HARDCODED
    #define APP_WIFI_SSID   CONFIG_APP_WIFI_SSID
    #define APP_WIFI_PASS   CONFIG_APP_WIFI_PASSWORD
    

    下面添加如下宏定义:

    #define DEFAULT_LISTEN_INTERVAL CONFIG_APP_WIFI_LISTEN_INTERVAL
    
    #if CONFIG_APP_POWER_SAVE_MIN_MODEM
    #define DEFAULT_PS_MODE WIFI_PS_MIN_MODEM
    #elif CONFIG_APP_POWER_SAVE_MAX_MODEM
    #define DEFAULT_PS_MODE WIFI_PS_MAX_MODEM
    #elif CONFIG_APP_POWER_SAVE_NONE
    #define DEFAULT_PS_MODE WIFI_PS_NONE
    #else
    #define DEFAULT_PS_MODE WIFI_PS_NONE
    #endif /*CONFIG_POWER_SAVE_MODEM*/
    1. app_wifi_start()函数中password下面添加一行

    .listen_interval = DEFAULT_LISTEN_INTERVAL,

    1. ESP_ERROR_CHECK(esp_wifi_start() );下面添加
    ESP_LOGI(TAG, "esp_wifi_set_ps().");
    esp_wifi_set_ps(DEFAULT_PS_MODE);

    相关宏定义会在main/Kconfig.projbuild文件中自动生成。

    附上修改后的app_wifi.c文件。

介绍

  • 因为宿舍空调遥控器有问题,而且最近没啥事情做,所以想到使用ESP32做一个空调伴侣,接入Apple的HomeKit实现iOS设备对空调的控制,目前只能对美的空调进行控制,只包括基本功能:开关模式(自动、制冷、制热)、温度(制冷17-30℃,制热17-25℃)、风速(自动风、低、中、高风)。锂电池供电,可用MicroUSB接口充电,充满自动断开,基本的锂电池保护(硬件是设计了但我也没实际测试过O(∩_∩)O),锂电池保护,DW07D这里要注意一点,就是如果第一次装上电池,需要先充电一下才能正常供电,只要不把电池拆下来,就不必再这样做。

  • 目前问题或bug(具体原因笔记中会解释):

    • 家庭App界面,在设定空调一些参数后(比如模式),长按配件后出现的设定界面会更新状态,但是打开家庭的初始界面中不能立刻更新,必须把家庭App切到后台再切回来才能更新。
    • 家庭App中空调制热的设定范围,注意是显示的设定范围,是到0~25℃,制冷温度的设定范围是10~35℃,实际上如果超出了17~30℃这个范围的话就还是17℃或者30℃。
  • 这个项目参考了乐鑫的homekitSDK和ESP-IDF中的红外NEC编码示例。以及美的的R05D编码的文档。相关链接放在下面:

ESP HomeKit SDK 其中的/examples/emulator例程相当于是一个仿真,在这个例程里可以创建很多的homekit支持的配件,但是没有实际的效果,参考了里面air conditioner的一段程序。这个SDK都是没有MFI认证的Non-Commercial-Version,所以配对时都会提示此配件不可信任,具体关于homekit协议的参考HAP-Specification-Non-Commercial-Version这个文档。

ESP-IDF NEC 乐鑫官方的SDK ESP-IDF中的关于NEC编码的例程。

R05D介绍 介绍了关于美的空调的红外编码R05D格式,以及一些红外遥控的代码,其中最重要的就是高位先发,低位后发,而且发的是和定义的码电平相反的,这个其他很多文档我都没看到说。以及ir_Coolix.h 这个红外库的头文件中也可以部分参考(我能发现的就是模式那里这个ir_Coolix.h中多了一位)。

  • 这个项目,我很多东西也都是才接触,所以难免有不准确不合适或者错误的地方,看到的兄弟麻烦指出来。
  • 视频地址

硬件连接

只用了一个GPIO18,你可以选择IO直接驱动红外二极管,最好加个NPN三极管或者N沟道的MOSFET驱动。一开始测试的时候我是IO18接到红外二极管正极,通过一个220欧的电阻再到GND,我担心把IO搞坏掉,所以电阻阻值比较大,在220欧的情况下,红外发射距离大致只有5m。所以后面打样的PCB中设计的电路如下:

具体的AD文件

如果图片不显示,请科学上网。或者到/docs/images/目录下查看。

H0

环境搭建

  • ESP-IDF
  • ESP HomeKit SDK

ESP-IDF

要搞好关于ESP-IDF的安装,需要一个比较好的网络,我安装失败了很多次,几乎都是网络问题。具体请参考官方教程。我只是补充一下,如果用windows的ESP-IDF 工具安装器嫌麻烦建议直接下载离线版本,虽然大,但是解千愁,不会出现什么失败的问题。如果是想用VS Code的IDE插件的话,也最好找个网好的地方安装,如果本地没有esp-idf,那么要是esp-idf下载失败就会从头开始下载,即使使用本地的esp-idf文件,但是还是需要下载其他东西的,而且这些东西,也挺容易下载失败的,我自己下的时候就算科学上网也是失败了很多次。我下载的时候是4.2版本的,后面更新到4.3也是可以的(4.3好像会弹一些警告),下面以VS Code的IDE插件为例。

ESP HomeKit SDK

具体也请参考官方教程,前提是先安装好ESP-IDF。

项目编译、烧录

编译准备

1、先把这个项目文件夹放到/esp-homekit-sdk/examples目录下面.

切记项目文件夹的路径不要太深,导致路径太长,这样会导致编译过程中出现问题。

因为默认CMakeList.txt的文件是读取上上级目录中的HomeKitSDK的路径,如下面所示。或者修改根目录下的CMakeLists.txt文件里面添加HomeKitSDK的组件也可以,CMakeLists文件说明传送门。或者自己定义系统变量HOMEKIT_PATH

if(DEFINED ENV{HOMEKIT_PATH})
  set(HOMEKIT_PATH $ENV{HOMEKIT_PATH})
else()
  set(HOMEKIT_PATH ${CMAKE_CURRENT_LIST_DIR}/../..)
endif(DEFINED ENV{HOMEKIT_PATH})

2、使用VS Code打开这个项目文件夹,先clean一下项目,按F1输入ESP Full Clean Project(如果有build文件夹就是把build文件夹删除)要不然里面的某些文件路径可能会导致编译会报错,除非项目路径和我编译时候的一模一样。

0

3、F1打开输入ESP Device configuration 选择自己使用的设备。

1

4、选择端口,同样的F1后输入ESP Select port to use选择使用的端口,要先插上板子才会显示。

2

5、提前设置好wifi的名称和密码,点击左下角的插件中的齿轮图标,然后点击App Wi-Fi,选择使用 Use Hardcoded,填入wifi名称和密码,保存。

3 4

这个如果使用的是ESP-IDF的CMD或者PowerShell的话(就是安装完ESP-IDF,开始菜单里面多的那俩),再进入到项目根目录下敲入idf.py menuconfig这个命令,也会出现相同的设置。 这个设置完后,我的理解是把设置的信息都保存到了一个sdkconfig文件里面,如果上面的wifi名称有中文,那么这个文件里面的CONFIG_APP_WIFI_SSID的值实际上是乱码的,需要在sdkconfig文件中找到CONFIG_APP_WIFI_SSID这个定义然后改正确

或者在App WiFi中也可以不选择Use HardCode而选择Use Provisioning,这样不需要先准备好wifi名称和密码,而是在烧录完程序后,他会弹出个二维码,需要下载ESP BLE Prov这个App去扫描,用蓝牙连接后再设置wifi。

这里还可以改变到时候在家庭App中配对的代码,默认是11122333,也可以在sdkconfig文件中修改。

5

如果上面的过程中遇到什么问题了,先别忘了clean project,然后可以试一试ESP-IDF PowerShell来搞上面的这些,我在使用的时候,有时候就是VS Code插件里面的会报错,但是ESP-IDF PowerShell里就不会。

编译、下载、监视 一条龙服务

上面没问题的话,就可以点击左下角的火焰按钮了,或者依次点击左边三个也是一样的。

下载的时候,先把GPIO0拉低(按住GPIO0的按钮SW1不放),然后让EN引脚拉低一下(按下EN的按钮SW2松开),看见控制台有提示连接上后就可以松开GPIO0的按钮SW1了。

6

在监视的输出界面中,他会弹出个二维码,在iOS设备和ESP32在同一个wifi的情况下,使用家庭App扫描这个二维码就可以配对了,这样就不需要输出那个配对码11122333了

如果二维码扫描不了,但是又想扫的话,可以点击二维码下面的链接。

7

或者也可以选择“我没有或无法扫描代码”,手动输入配对码添加配件。

8

一般没有问题的话,他会直接找到这个配件,就像下面这样,点击后输入11122333就可以配对了。

9

没有MFI认证就会有这个弹窗,点击仍然添加就是啦

10

配对完成后,监视控制台应该也可看到相应的输出,按“Ctrl+]”可以退出监视器。

使用

12

在家庭App刚刚添加的这个空调配件中,自动模式、制冷模式、制热模式、关闭和设置温度都可以使用,只要不是关闭其他模式都会打开空调。

温度虽然可以设定为小数xx.5℃,但是实际上设定的温度会去掉小数部分。关于设定范围,这个问题在开头提了。

下面的风扇速度对应着空调的风速,因为是一个滑块,滑倒最左边相当于关闭空调,0~33%低风,33~66%中风,66~99%高风,100%也就是最右边为自动风。

因为这个滑块在滑动的时候会不断的发送新的值给配件,所以在配件程序里设置了一个延时发送的程序,如果在接收到新的指令后的1.5S内,没有新的指令到来了,才发送红外指令,如果有新的指令,那么上一个指令会被覆盖,再等待1.5S,直到没有新的指令到来后才发送。

所以存在1.5S+的延时,有种反应速度慢的感觉。

有一个值得提醒的是:你在长按配件打开详情界面时,这时会发送一次红外指令出去,也就是你当时设置的状态。

至于延时关机开机的功能,没有加上去,第一因为懒,第二是因为在快捷指令App中的自动化可以完成这些功能。

具体的细节,硬件设计思路,程序思路可以参考本人的笔记

遇到的bug

  • 在添加DFS和light-sleep调试的时候,遇到过下载程序后复位发生两次或者数次重启的情况,在断开USB接口重新插入后正常启动,后来这些bug莫名其妙消失了,也许是因为清空了FLASH。

  • 在IOS15时,添加配件完成后,对配件进行相关操作时,家庭App中无法切换至显示操作后的状态,比如一开始是关闭状态,要设置为制冷模式,家庭App中设置以后,配件实际上执行了相应的操作,但是在家庭App中还是立马切换至了关闭的状态。这种情况关闭家庭App后重新打开即可。

  • IOS15中,改变风速后,遇到过一次配件接收不到相应的指令的情况。也许是因为power save mode设置为minimum modem的原因。

esp32_homekit_airconditioner's People

Contributors

damibear avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

esp32_homekit_airconditioner's Issues

IO输出波形逻辑1似乎由38.46k的脉冲构成

如果将脉冲序列定义为逻辑1,可以符合美的空调红外协议,但美的空调协议应该是由高电平构成逻辑1。
另外,似乎up的逻辑1与协议是恰好相反的。
请问是我理解有问题嘛?
附逻辑分析仪所抓到图形:
QQ截图20210831205609

此设备已经被添加到其他家庭

复现办法:
1.烧录并添加esp-homekit-sdk\examples\fan下的工程,并且在手机上添加,可以通过monitor看出设备能够正常响应工作
2.烧录并添加esp-homekit-sdk\examples\ESP32_HomeKit_AirConditioner-master下的工程(也就是up的工程),手机上不能直接出现配对设备,通过二维码添加时,则报错“此设备已经被添加到其他家庭”。

如果过很久后再添加的话,似乎就能够正常工作。

附上HomeKit组件的部分LOG,第二行提到了设备已经被配对过。
Keystore initialised
Accessory is Paired with atleast one controller
Updated state number to 45
Database initialised. Accessory Device ID: 0C:0C:F1:80:05:1A
HAP Initialization succeeded. Version : 4.0-
I (739) gpio: GPIO[0]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:3
I (749) app_hap_setup_payload: -----QR Code for HomeKit-----
I (749) app_hap_setup_payload: Scan this QR code from the Home app on iOS

█▀▀▀▀▀█ ▀ █▄ █▀▀▀▀▀█
█ ███ █ ▀ ▄▀▀ █ ███ █
█ ▀▀▀ █ ▄█▄▀▀ █ ▀▀▀ █
▀▀▀▀▀▀▀ ▀▄▀ █ ▀▀▀▀▀▀▀
▀ █▄▄ ▀▀ ▀▄█▀ ▄▀▄▄▀ █
██▄██▀▀▄ ▀▄█▀█▄▀ ▀ ▄█
▀▀▀ █▄▀▀█▀▀▄▀█ ▄
█▀▀▀▀▀█ ▀█▀█▀ ▀▀▄▄ █
█ ███ █ █▀▀▄ ▀█▄ ▄▀
█ ▀▀▀ █ ▀▄▄▀▄█▄ ▀▄█▀█
▀▀▀▀▀▀▀ ▀ ▀ ▀▀

I (839) app_hap_setup_payload: If QR code is not visible, copy paste the below URL in a browser.
https://espressif.github.io/esp-homekit-sdk/qrcode.html?data=X-HM://00KUG4GWTES32
MFi auth not supported. Falling back to HAP_MFI_AUTH_NONE
I (869) wifi:wifi driver task: 3ffb7ba0, prio:23, stack:6656, core=0
I (869) system_api: Base MAC address is not set
I (869) system_api: read default base MAC address from EFUSE

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.