『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 1561|回复: 24

[硬件DIY] 6月4日更新!永速直流风扇改装WiFi和无极调速

[复制链接]

14

主题

240

帖子

2420

积分

论坛DIY达人

积分
2420
金钱
2170
HASS币
40
发表于 2024-6-1 23:16:27 | 显示全部楼层 |阅读模式
本帖最后由 花落花空 于 2024-6-4 15:46 编辑

6.4日更新:
修改了8266这边风速变动后对单片机反馈的动作。
在按下按键后12秒内,不进行反馈,避免了按下按键后反复横跳

6.2日更新:
1:增加了关闭数码管的功能
2:增加一个嗡鸣器开关,配置为IO5,可以连接一个高电平触发继电器模块。断开嗡鸣器的连线,把继电器串进去即可。
3:提供一个esphome固件,需要按下面的说明接线。

目前存在的bug:
1:挡位反馈在调到某些值的时候反复横跳

先看效果吧,放个B站连接。
https://www.bilibili.com/video/BV1u7421R7sc




虽然家里已经有三把风扇了。。。但还是需要挪着用。。很不爽。
然后刷视频看到一款永速的风扇,直流无刷。价格只要85元起(五叶)。那么必拿下!
实际购买7叶款拼夕夕用卷81元购入。

到手第一时间拆机
IMG_20240531_110545.jpg
主控板长这样。
这个风扇之前有改装方案,但只是模拟按键按下。所以我另行探索。研究一番发现数码管左下是主控单片机,嗡鸣器上方的是无刷驱动芯片
PWM信号就是那四个焊盘的第二个,通过下方的R11连接连接到单片机
本次改装的重点就是围绕这单片机出来的PWM占空比信号
接下来上我的电路连接图:
微信图片编辑_20240602111057.jpg

首先去掉R11,下端经过原先的电阻,过10k电阻下拉。中间点引出到8266.用来检测占空比,因为单片机电平是5v,下拉是为了控制电压不高于3.3v。避免损坏8266。
然后四个按键除了直连8266的IO的,还有一组经过串电阻后并联,下拉后接到8266的IO4,聪明的朋友猜猜这是为了啥

然后看看我的最终连接效果

微信截图_20240601230931.png
就是这个样子


8266的供电我本来准备在7505后面再串个ldo,但实测7505很烫,所以换成dcdc直接12v-3.3。
我买的没有遥控摇头,如果是遥控摇头,程序里我已经定义了摇头的输出是IO16,接到对应点,然后找个io检测摇头按键,就不另说了

再来看看ha中的样子
微信截图_20240601231310.png
风扇主实体

微信截图_20240602131038.png
所有实体

然后定时时间只用来显示,输入无用。

程序依旧使用esphome
我直接贴上主要配置
globals: ##定义全局变量
  - id: duty_previous  ##存储占空比值
    type: float
    restore_value: no
    initial_value: '0.0'      
binary_sensor:  #定义二进制传感器组件
  - platform: gpio  #使用GPIO类
    pin:
      number: 4     #定义检测IO4
      mode: INPUT_PULLUP   #定义IO为上拉模式
      inverted: True       #定义反向触发,即IO和负极短接(变为低电平)触发
    id: button1
    filters:    #过滤
      - delayed_on: 100ms   #持续多久才触发,不要小于下面模拟按键按下的时间.一般不用改
    on_multi_click:  ##判断多次按下及长按,这里使用是为了避免模拟长按电源键被检测到,只响应单击操作。
      - timing:  #单击
          - ON for at most 0.4s
          - OFF for at least 0.1s
        then:
        - delay: 500ms  #等待500毫秒,使单片机输出的占空比稳定后再检测
        - number.to_min:  #归零上次按下的时间
            id: number2
        - if: #检测按下的是定时键
            condition:
              - fan.is_on: dc_fan    
            then:      
              - lambda: |-
                  float duty_current = id(duty).state;
                  if (abs(duty_current - id(duty_previous)) <= 1) {
                    // 对比按下前后的占空比值,用来判断按下的是定时键,因为按它占空比不会变。。。
                    // 当是定时键就使数定时时间加1
                      auto call = id(number1).make_call();
                      call.number_increment(true);
                      call.perform();
                  }
                  // 更新duty_previous值为当前duty值
                  id(duty_previous) = duty_current;     
        - if:           #如果
            condition:  #判断条件,下面是占空比小于9
              lambda: |-
                return id(duty).state < 9;
            then:       #执行动作,关掉风扇
              - fan.turn_off:
                  id: dc_fan 
            else:      #反之则打开风扇,并将检测到的占空比值设为风速
              - fan.turn_on:
                  id: dc_fan 
                  speed: !lambda |-
                    return  id(duty).state/1.0;                       
      - timing:  #双击
            - ON for at most 1s
            - OFF for at most 1s
            - ON for at most 1s
            - OFF for at least 0.1s
        then:

      - timing: #长按
          - ON for 1s to 5s
          - OFF for at least 0.1s
        then:

output:  #定义输出组件
  - platform: esp8266_pwm  ##PWM信号,风扇调速
    pin: 15  #使用的IO
    frequency: 1000 Hz
    id: pwm1    
  - platform: esp8266_pwm  ##PWM信号,摇头电机
    pin: 16
    frequency: 1000 Hz
    id: pwm2  

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

        # - if: 
        #     condition: 
        #       - sensor.in_range: #传感器值小于1
        #           id: duty
        #           below: 1
        #     then:
        #       - button.press: power

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

        # - if: 
        #     condition: 
        #       - sensor.in_range: #传感器值大于1
        #           id: duty
        #           above: 1
        #           below: 100
        #     then:
        #       - button.press: power
               
sensor:
  - platform: duty_cycle  #检测单片机输出的占空比,用于判断单片机控制风扇是否关机,以及设置风速。
    pin: 14    #这里使用IO14进行检测,可自行根据实际连接引脚进行更改
    update_interval: 200ms  #检测间隔
    id: duty   #定义ID,用于自动化及其它组建的调用 


button:  #定义模拟按下的按键
  - platform: output
    name: "1 息屏"
    internal: false    #定义是否仅内部使用,修改为true将不在ha界面中显示。
    output: key_power  #使用的输出id
    duration: 1500ms   #模拟长按电源键,实现关闭数码管
    id: dispaly       
  - platform: output
    name: "2 定时"
    internal: false
    output: key_timer
    duration: 70ms   #模拟按下多久,实测70毫秒OJBK,小于50不触发似乎。 
    on_press: #每次按下使数值定时时间+1
      then: 
        if:
          condition:
            - fan.is_on: dc_fan
          then:  
            - number.increment:
                id: number1
                cycle: true  
  - platform: output
    name: "3 电源键"
    internal: True  
    output: key_power  
    id: power
    duration: 70ms                   
  - platform: output
    name: "4增加挡位"
    internal: true
    output: key_up
    duration: 70ms 
    id: up 
  - platform: output
    name: "5 减小挡位"
    internal: true
    output: key_down
    duration: 70ms   
    id: down                 
number:  #定义数值组件
  - platform: template  #number1用于显示定时时间
    name: "0 定时时间"
    id: number1
    optimistic: true
    min_value: 0
    max_value: 12
    step: 1  
    mode: BOX 
  - platform: template #number2用于记录上次按下时间,秒
    id: number2
    optimistic: true
    min_value: 0
    max_value: 100
    step: 1  
    mode: BOX       
switch:
  - platform: gpio
    name: "0 嗡鸣器开关"
    pin: 5
    restore_mode: RESTORE_DEFAULT_OFF           
#反馈状态到单片机
interval:  #定义间隔时间组件
  - interval: 1s  #每秒一次
    then:
      - number.increment: 
          id: number2
      - if:
          condition:  ##按键操作超过12秒才进行动作
            - number.in_range:
                id: number2
                above: 12 
          then:  
            - if:
                condition:
                  - fan.is_on: dc_fan
                then:
                  - lambda: |-
                      if (id(dc_fan).speed > id(duty).state + 5) {
                        // 如果风扇速度大于占空比值+5,则触发增加挡位
                        id(up).press(); 
                      } else if (id(dc_fan).speed < id(duty).state - 5) {
                        // 如果风扇速度小于占空比值-5,则触发减小挡位
                        id(down).press(); 
                      }           
  - interval: 60min  #每1小说使数值定时时间-1
    then:
      - number.decrement:
          id: number1
          cycle: false



大佬们和聪明的朋友应该已经从配置里看出来了。我使用原单片机检测按下的时间和esphome设定的检测时间差,来实现通过io模拟按键按下与按下实体按键时esp的检测不冲突,
实现ha调整风速后,对应到数码管的显示,以及在ha中按定时和按键按定时均能正确累加定时时间。

然后通过按下后判断占空比有没有变化来识别按的是不是定时键也是有些取巧了。

如果不需要把ha调整后的风速挡位反馈回单片机的话,本次改装只需使用3个IO。



ys-fan.bin

465.2 KB, 下载次数: 4

售价: 5 金钱  [记录]

6.4日编译固件,配网热点密码hlhkhlhk

评分

参与人数 3金钱 +23 收起 理由
kisccc + 5 高手,这是高手!
book123 + 10 感谢楼主分享!
inevitab + 8 感谢楼主分享!

查看全部评分

回复

使用道具 举报

41

主题

193

帖子

869

积分

高级会员

Rank: 4

积分
869
金钱
676
HASS币
0
发表于 2024-6-2 00:01:56 | 显示全部楼层
改装后最慢可以调到多少? 原来的1档风量还是大了些。或者不改装,原电路怎样可以降低1档风量呢?
回复

使用道具 举报

19

主题

476

帖子

2112

积分

金牌会员

Rank: 6Rank: 6

积分
2112
金钱
1636
HASS币
0
发表于 2024-6-2 01:57:14 | 显示全部楼层
请教大佬  
gpio15不是要和gnd连接在一起才能启动吗?
我是直接把gpio15和gnd焊接在一起了  
但是这样的话gpio15一直接地 不是没办法使用的吗?
在你的图片里那个是什么?
回复

使用道具 举报

14

主题

240

帖子

2420

积分

论坛DIY达人

积分
2420
金钱
2170
HASS币
40
 楼主| 发表于 2024-6-2 07:47:10 | 显示全部楼层
kjjuhfv 发表于 2024-6-2 01:57
请教大佬  
gpio15不是要和gnd连接在一起才能启动吗?
我是直接把gpio15和gnd焊接在一起了  

用10k电阻下拉啊。我自己直模块了,用开发版一样的。
回复

使用道具 举报

14

主题

240

帖子

2420

积分

论坛DIY达人

积分
2420
金钱
2170
HASS币
40
 楼主| 发表于 2024-6-2 11:24:52 | 显示全部楼层
inevitab 发表于 2024-6-2 00:01
改装后最慢可以调到多少? 原来的1档风量还是大了些。或者不改装,原电路怎样可以降低1档风量呢? ...

就是一档的风速。。实测占空比低于8%就不转了。一档是10%。
回复

使用道具 举报

14

主题

240

帖子

2420

积分

论坛DIY达人

积分
2420
金钱
2170
HASS币
40
 楼主| 发表于 2024-6-2 13:39:15 | 显示全部楼层
固件使用,比较方便的是直接插上开发板,或者烧录器,然后浏览器https://web.esphome.io/ ,让后点connect。
选择对应的串口,确认后的节面点install,选择固件后,再点一下弹出框的INSTALL。
只要你的开发板或者烧录器和8266连接没问题就可以成功烧录了。
然后查看手机或者电脑的wifi列表,等待出现Ys-Fan AP的热点,密码hlhkhlhk
连接后应会跳转到配网界面。选择自己的wifi连接即可。
然后只要和ha在一个局域网内。就能自动发现。
回复

使用道具 举报

41

主题

193

帖子

869

积分

高级会员

Rank: 4

积分
869
金钱
676
HASS币
0
发表于 2024-6-2 14:17:54 | 显示全部楼层
花落花空 发表于 2024-6-2 11:24
就是一档的风速。。实测占空比低于8%就不转了。一档是10%。

谢谢,这样说的话降不了多少。
回复

使用道具 举报

2

主题

39

帖子

396

积分

论坛分享达人

积分
396
金钱
357
HASS币
0
发表于 2024-6-3 08:46:31 | 显示全部楼层
本帖最后由 天加山的白菜 于 2024-6-3 08:50 编辑

诶呀,我已经垂涎这种点动开关很久了,一直没找到方案。

网上大都是建议直接上一个继电器。

想请问一下:只想控制这个点动开关的接通和断开,esphome的代码应该怎么写?
看你的代码和接线,关键点应该在IO4上

请大神明示

9874757b22f7b2aaa3bc770e6295977.png

回复

使用道具 举报

14

主题

240

帖子

2420

积分

论坛DIY达人

积分
2420
金钱
2170
HASS币
40
 楼主| 发表于 2024-6-3 11:08:02 | 显示全部楼层
天加山的白菜 发表于 2024-6-3 08:46
诶呀,我已经垂涎这种点动开关很久了,一直没找到方案。

网上大都是建议直接上一个继电器。

这种按键除了用扫描和adc识别的情况,一般都是低电平触发,即单片机出来的线和负极短接,就认为你按下按键了。从你的照片看电路走向是低电平触发。这样的话你直接复制下面的
output:  #定义输出组件
##下面定义模拟按下按键的输出IO    
  - platform: gpio
    pin: 0   #使用的IO
    id: key1 #定义下面button调用的id
    inverted: True
  - platform: gpio
    pin: 12  
    id: key2    
    inverted: True
button:  #定义模拟按下的按键
  - platform: output
    name: "1 按键1"
    internal: false    #定义是否仅内部使用,修改为true将不在ha界面中显示。
    output: key1  #使用的输出id
    duration: 100ms   #模拟按多久。         
  - platform: output
    name: "2 按键2"
    internal: false    #定义是否仅内部使用,修改为true将不在ha界面中显示。
    output: key2  #使用的输出id
    duration: 100ms   #模拟按多久。


自己修改对应IO和名字
然后我这里的IO4用来检测按键被按下的

如果是另外两种情况,确实需要用继电器实现,但上面的配置同样适用,就是io改为驱动继电器。
回复

使用道具 举报

2

主题

39

帖子

396

积分

论坛分享达人

积分
396
金钱
357
HASS币
0
发表于 2024-6-3 11:24:36 | 显示全部楼层
花落花空 发表于 2024-6-3 11:08
这种按键除了用扫描和adc识别的情况,一般都是低电平触发,即单片机出来的线和负极短接,就认为你按下按 ...

十分感谢~~~我先试试,晚上来回馈~~~
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-6-29 14:03 , Processed in 0.120890 second(s), 37 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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