数码之家

 找回密码
 立即注册
搜索
查看: 2174|回复: 103

[家电] 使用ESP8266对永速落地扇进行改装,接入homeassistant,实现无极调速

    [复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式
前些时候气温渐升,但又不是特别热。普通风扇一档吹都觉得凉。。又刷视频看到永速这玩意儿。价格也合适,那么直接拿下。



七叶款卷后81要啥自行车。78.15是因为到货后发现底座壳子破了点,客服补偿了3元。。。无所吊畏。

本人是有使用homeassistnat的,那么肯定要想着改装接入一下。找了下现有的方案,发现只是模拟按下按键。这种肯定达不到我要的效果,改为自己折腾。很幸运一下就找到了pwm信号。于是围绕它开始做工作。

废话不多说,直接贴我改装后的接线图

就是这样子


改装原理:
通过截断原单片机的pwm占空比信号(拆掉R11),先交给8266检测占空比值,然后8266通过这个值判断单片机是开还是关。配合IO4对4个按键的检测,判断出按的是增减档待机,还是定时,以及是否是长安电源键。实现对ha中功能的反馈。

下面是实际接好的图。


有一点需要注意的是,我使用的是0603规格的10k电阻,实测没有问题。有模仿的注意连接后,要按下按键,万用表测量IO4对地电压,最好低于1v,否则检测不到按下。这时8266的程序不会给它自己控制的pwm输出(对应风扇的速度值)设置新值,就会导致反馈挡位的动作一直按按下增档或减档。没有低于的话尝试更换下拉电阻。

8266的供电我使用的是DC-DC模块,本来准备从7505后面串个LDO,但8266的功耗会让这个封装的7505非常烫。。。。

程序我使用的是ESPHOME,下面贴上主要的配置,同时也会上传一个现成的esphome固件到附件里面。


然后是ha中的效果

所有功能实体↑


风扇控制实体↑


简单的UI界面↑。使用蘑菇卡片


功能解释:
定时时间:用于在ha显示设置了多久的定时
嗡鸣器开关: 需要通过IO5接一个继电器模块,断开嗡鸣器任意一根线把继电器串进去。
自动息屏:开启后,操作完12秒后息屏
息屏:按下后立即模拟长按电源键息屏
定时:按下后模拟按下定时键,同时定时时间对应+1。
风扇的摇头:我自己定义了IO16,遥控款的把它接到摇头电机驱动的信号输入。。。应该就行,没实测。

演示视频:永速风扇改装WiFi接入homeassistant控制的究极演示,通过巴法云对接小爱语音,同时支持天猫


好了,先写这些吧



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 9家元 +231 收起 理由
augl + 6 優秀文章
jf201006 + 30 原創內容
xuyaz + 30 人才啊
aping365 + 30 優秀文章
落叶风 + 30
vip2128 + 30 優秀文章
newnet1234 + 30 謝謝分享
微醉 + 30 謝謝分享
nokia5320 + 15

查看全部打赏

 楼主| 发表于 7 天前 | 显示全部楼层
没有homeassistant环境的可以试试浏览器https://esplink.app/
进入后点加号,输入刷好固件的模块的IP地址。

就可以有一个简单的操作界面。
然后可以通过把网页安装到桌面,实现近似app的效果
配网热点密码:hlhkhlhk

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +30 收起 理由
200birds + 30

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
额。。发现代码没贴上,那么放到一楼吧
  1. globals: ##定义全局变量
  2.   - id: duty_previous  ##存储占空比值
  3.     type: float
  4.     restore_value: no
  5.     initial_value: '0.0'      
  6. binary_sensor:  #定义二进制传感器组件
  7.   - platform: gpio  #使用GPIO类
  8.     pin:
  9.       number: 4     #定义检测IO4
  10.       mode: INPUT_PULLUP   #定义IO为上拉模式
  11.       inverted: True       #定义反向触发,即IO和负极短接(变为低电平)触发
  12.     id: button1
  13.     filters:    #过滤
  14.       - delayed_on: 100ms   #持续多久才触发,不要小于下面模拟按键按下的时间.一般不用改
  15.     on_multi_click:  ##判断多次按下及长按,这里使用是为了避免模拟长按电源键被检测到,只响应单击操作。
  16.       - timing:  #单击
  17.           - ON for at most 0.4s
  18.           - OFF for at least 0.1s
  19.         then:
  20.         - delay: 500ms  #等待450毫秒,使单片机输出的占空比稳定后再检测
  21.         - number.to_min:  #归零上次按下的时间
  22.             id: number2
  23.         - if: #检测按下的是定时键
  24.             condition:
  25.               - fan.is_on: dc_fan   
  26.             then:      
  27.               - lambda: |-
  28.                   float duty_current = id(duty).state;
  29.                   if (abs(duty_current - id(duty_previous)) <= 1) {
  30.                     // 对比按下前后的占空比值,用来判断按下的是定时键,因为按它占空比不会变。。。
  31.                     // 当是定时键就使数定时时间加1
  32.                       auto call = id(number1).make_call();
  33.                       call.number_increment(true);
  34.                       call.perform();
  35.                   }
  36.                   // 更新duty_previous值为当前duty值
  37.                   id(duty_previous) = duty_current;     
  38.         - if:           #如果
  39.             condition:  #判断条件,下面是占空比小于9
  40.               lambda: |-
  41.                 return id(duty).state < 9;
  42.             then:       #执行动作,关掉风扇
  43.               - fan.turn_off:
  44.                   id: dc_fan
  45.             else:      #反之则打开风扇,并将检测到的占空比值设为风速
  46.               - fan.turn_on:
  47.                   id: dc_fan
  48.                   speed: !lambda |-
  49.                     return  id(duty).state/1.0;                       
  50.       - timing:  #双击
  51.             - ON for at most 1s
  52.             - OFF for at most 1s
  53.             - ON for at most 1s
  54.             - OFF for at least 0.1s
  55.         then:
  56.           - if:
  57.               condition:
  58.                 fan.is_on: dc_fan
  59.               then:
  60.                 - lambda: |-
  61.                     if (id(dc_fan).oscillating) {
  62.                       auto call = id(dc_fan).turn_on();
  63.                       call.set_oscillating(false);
  64.                       call.perform();
  65.                     }  else {
  66.                       auto call = id(dc_fan).turn_on();
  67.                       call.set_oscillating(true);
  68.                       call.perform();
  69.                     }
  70.       - timing: #长按
  71.           - ON for 1s to 5s
  72.           - OFF for at least 0.1s
  73.         then:

  74. output:  #定义输出组件
  75.   - platform: esp8266_pwm  ##PWM信号,风扇调速
  76.     pin: 15  #使用的IO
  77.     frequency: 1000 Hz
  78.     id: pwm1   
  79.   - platform: esp8266_pwm  ##PWM信号,摇头电机
  80.     pin: 16
  81.     frequency: 1000 Hz
  82.     id: pwm2  

  83. ##下面定义模拟按下按键的输出IO   
  84.   - platform: gpio
  85.     pin: 0
  86.     id: key_power  #电源键
  87.     inverted: True
  88.   - platform: gpio
  89.     pin: 12  
  90.     id: key_up    #加挡键
  91.     inverted: True
  92.   - platform: gpio
  93.     pin: 13
  94.     id: key_down  #减挡键
  95.     inverted: True
  96.   - platform: gpio
  97.     pin: 2
  98.     id: key_timer #定时键
  99.     inverted: True
  100. fan:  #定义风扇组件
  101.   - platform: speed #speed是可调速风扇
  102.     output: pwm1    #定义PWM的输出ID
  103.     name: "永速风扇"
  104.     id: dc_fan      #定义ID,用于自动化及其它组建的调用   
  105.     restore_mode: RESTORE_DEFAULT_OFF  #系统重启后的状态。RESTORE_DEFAULT_OFF为尝试恢复之前状态,如失败则为关
  106.     oscillation_output: pwm2    #定义摇头的输出
  107.     on_turn_on: #风扇开启时的动作
  108.       then:     #提供两种写法,lamba语句和ESPhome的自动化配置流程(已注释)
  109.         - lambda: |-
  110.             if (id(duty).state < 1) {
  111.               // 占空比小于1,表示单片机没有开,执行模拟按下电源键,开启单片机
  112.               id(power).press();
  113.             }   

  114.         # - if:
  115.         #     condition:
  116.         #       - sensor.in_range: #传感器值小于1
  117.         #           id: duty
  118.         #           below: 1
  119.         #     then:
  120.         #       - button.press: power

  121.     on_turn_off: #风扇关掉时的动作
  122.       then:
  123.         - number.to_min:  #让定时值归0
  124.             id: number1
  125.         - lambda: |-
  126.             if (id(duty).state > 1 && id(duty).state < 100) {
  127.               // 占空比大于1小于100,表示单片机还开着,执行模拟按下电源键,关闭单片机
  128.               id(power).press();
  129.             }   

  130.         # - if:
  131.         #     condition:
  132.         #       - sensor.in_range: #传感器值大于1
  133.         #           id: duty
  134.         #           above: 1
  135.         #           below: 100
  136.         #     then:
  137.         #       - button.press: power
  138.     on_speed_set:  ##状态变化12秒后按下息屏
  139.       then:
  140.         - delay: 12s  
  141.         - if:
  142.             condition:
  143.               - switch.is_on: auto_off
  144.             then:  
  145.               - button.press: dispaly                 
  146. sensor:
  147.   - platform: duty_cycle  #检测单片机输出的占空比,用于判断单片机控制风扇是否关机,以及设置风速。
  148.     pin: 14    #这里使用IO14进行检测,可自行根据实际连接引脚进行更改
  149.     update_interval: 200ms  #检测间隔
  150.     id: duty   #定义ID,用于自动化及其它组建的调用


  151. button:  #定义模拟按下的按键
  152.   - platform: output
  153.     name: "1 息屏"
  154.     internal: false    #定义是否仅内部使用,修改为true将不在ha界面中显示。
  155.     output: key_power  #使用的输出id
  156.     duration: 1500ms   #模拟长按电源键,实现关闭数码管
  157.     id: dispaly      
  158.   - platform: output
  159.     name: "2 定时"
  160.     internal: false
  161.     output: key_timer
  162.     duration: 70ms   #模拟按下多久,实测70毫秒OJBK,小于50不触发似乎。
  163.     on_press: #每次按下使数值定时时间+1
  164.       then:
  165.         if:
  166.           condition:
  167.             - fan.is_on: dc_fan
  168.           then:  
  169.             - number.increment:
  170.                 id: number1
  171.                 cycle: true  
  172.   - platform: output
  173.     name: "3 电源键"
  174.     internal: True  
  175.     output: key_power  
  176.     id: power
  177.     duration: 70ms                  
  178.   - platform: output
  179.     name: "4增加挡位"
  180.     internal: true
  181.     output: key_up
  182.     duration: 70ms
  183.     id: up
  184.   - platform: output
  185.     name: "5 减小挡位"
  186.     internal: true
  187.     output: key_down
  188.     duration: 70ms   
  189.     id: down                 
  190. number:  #定义数值组件
  191.   - platform: template  #number1用于显示定时时间
  192.     name: "0 定时时间"
  193.     id: number1
  194.     optimistic: true
  195.     min_value: 0
  196.     max_value: 12
  197.     step: 1  
  198.     mode: BOX
  199.   - platform: template #number2用于最后一次操作的时间,秒
  200.     id: number2
  201.     optimistic: true
  202.     min_value: 0
  203.     max_value: 100
  204.     step: 1  
  205.     mode: BOX     

  206. switch:
  207.   - platform: gpio
  208.     name: "0 嗡鸣器开关"
  209.     pin: 5
  210.     restore_mode: RESTORE_DEFAULT_ON  
  211.   - platform: template
  212.     name: "0 自动息屏"
  213.     optimistic: true
  214.     id: auto_off
  215.     restore_mode: RESTORE_DEFAULT_OFF            
  216. #反馈状态到单片机
  217. interval:  #定义间隔时间组件
  218.   - interval: 1s  #每秒一次
  219.     then:
  220.       - number.increment:
  221.           id: number2
  222.           cycle: false
  223.       - if:
  224.           condition:  ##按键操作超过12秒才进行动作
  225.             - number.in_range:
  226.                 id: number2
  227.                 above: 12
  228.           then:
  229.             if:
  230.               condition:
  231.                 - fan.is_on: dc_fan
  232.               then:  
  233.                 - lambda: |-
  234.                     if (id(dc_fan).speed > id(duty).state + 5) {
  235.                       // 如果风扇速度大于占空比值+5,则触发增加挡位
  236.                       id(up).press();
  237.                     } else if (id(dc_fan).speed < id(duty).state - 5) {
  238.                       // 如果风扇速度小于占空比值-5,则触发减小挡位
  239.                       id(down).press();
  240.                     }           
  241.   - interval: 60min  #每1小说使数值定时时间-1
  242.     then:
  243.       - number.decrement:
  244.           id: number1
  245.           cycle: false
  246.       
复制代码

打赏

参与人数 2家元 +60 收起 理由
200birds + 30
海上生明月丶 + 30 優秀文章

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
板凳占位 楼主牛逼
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
楼主真是厉害
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
这线飞的真销魂!
回复 支持 反对

使用道具 举报

发表于 7 天前 来自手机浏览器 | 显示全部楼层
这风扇成论坛明星产品了
回复 支持 反对

使用道具 举报

发表于 7 天前 来自手机浏览器 | 显示全部楼层
有马达驱动芯片资料玩法会更灵活
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
楼主真厉害
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 来自手机浏览器 | 显示全部楼层
微笑生活 发表于 2024-6-6 01:54
这风扇成论坛明星产品了

回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
楼主真是厉害
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
感觉很复杂的样子,高手
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 来自手机浏览器 | 显示全部楼层
yyulxy 发表于 2024-6-6 01:44
这线飞的真销魂!

一开始是想飞美观的,调啊调的就乱了
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
一来就玩高大上啊,会玩单片机就是牛
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 来自手机浏览器 | 显示全部楼层
tslaozhang 发表于 2024-6-6 07:58
感觉很复杂的样子,高手

如果只是实现无极调速和保留原按键操作,只需要3个IO,检测pwm的14,发pwm的i5,检测按键按下的io4。
主要就是8266程序检测按键按下和单片机占空比的变化,对8266输出的占空比进行调节。
其它功能都是补充,想着尽善尽美才加的,
定时啊,息屏,以及ha操作后对原机的反馈我个人觉得有没有都行
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 来自手机浏览器 | 显示全部楼层
微醉 发表于 2024-6-6 08:17
一来就玩高大上啊,会玩单片机就是牛

我还是菜的,只是刚好有esphome这个东西。实现起来简单了很多。
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
高大上的玩法,全网你第一个把永速接入ESPhome的高端玩家。
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
今年坛红产品,要知识还要动手能力
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
高级技术帖  能写代码的就是牛! 下一步是美化?期待……
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
厂家会不会拿过去改造一个新型号
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-6-13 19:48 , Processed in 0.249600 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表