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

 找回密码
 立即注册
查看: 1310|回复: 5

[求助] 关于先锋s6风扇改esp32控制的求助

[复制链接]

16

主题

269

帖子

2817

积分

论坛DIY达人

积分
2817
金钱
2533
HASS币
60
发表于 2023-5-18 10:23:32 | 显示全部楼层 |阅读模式
去年在水群的时候知道了先锋的s6风扇,看有大佬做了esp32控制的pcb并可以接入homeassistant,遂购入一台准备进行改造,没有用大佬的板子,而是自己画了一板。奈何这个风扇的摇头控制使用了步进电机,可以控制角度,虽通过esphome也成功驱动了步进电机的往复运转,但在关于角度的控制上,esphome似乎不太好实现。
后因天气热起来要使用,就暂停了折腾,一直搁置到现在,如今气温又升起来了,又该把它搞起来了。遂来论坛提问求助一下。
如制作改装主板的大佬看到,望不吝赐教。
2a9a5aedd83a7fb0.jpg
风扇信息
esphome的配置,目前是简单粗暴的正走多少步,反走多少步来实现摆动。。。
api:
  encryption:
    key: "xxxxx“
  services:
    - service: control_stepper
      variables:
        target: int
      then:
        - stepper.report_position:
            id : stepper_vmc
            position: 0
        - stepper.set_target:
            id: stepper_vmc
            target: !lambda 'return target;'
        - logger.log:
            format: "The target value is %d"
            args : ['target']
ota:
  password: "xxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Dxh-S6-Pro Fallback Hotspot"
    password: "xdynCDsJMk2x"
substitutions:
  device_name: Dxh-S6-Pro
web_server:
  port: 80
captive_portal:
output:
  - platform: ledc
    pin: 23
    frequency: 1000Hz
    id: lt1    
fan:
  - platform: speed
    output: lt1
    name: "${device_name}"
    id: dc_fan   
    restore_mode: RESTORE_DEFAULT_ON
binary_sensor:
  - platform: gpio #四档固定风速切换
    pin:
      number: 34
      mode: INPUT
      inverted: True
    name: "speed"
    internal: True
    on_press:
      then:
        - fan.turn_on: dc_fan    
        - lambda: |-
            if (id(dc_fan).state) {
              if (id(dc_fan).speed == 35) {
                id(fan_med).turn_on();
              } else if (id(dc_fan).speed == 50){
                  id(fan_medhigh).turn_on();
                } else if (id(dc_fan).speed == 75){
                  id(fan_high).turn_on();
                } else {
                id(fan_low).turn_on();
              }
              }   
    on_click:
      min_length: 300ms
      max_length: 1000ms
      then:
        - fan.turn_off: dc_fan    
        - switch.turn_off: sp1
        - switch.turn_off: sp2
        - switch.turn_off: sp3
        - switch.turn_off: sp4
        - switch.turn_off: angleled1
        - switch.turn_off: angleled2
        - switch.turn_off: angleled3
        - switch.turn_off: angleled4
                                        
  - platform: gpio #摇头控制
    pin:
      number: 35
      mode: INPUT
      inverted: True
    name: "speed"
    internal: True
    on_press:
      if:
        condition:
           switch.is_off: angleled1
        then:
          - switch.turn_on: angleled1
        else: 
          - if:
              condition:
                switch.is_off: angleled2   
              then:     
                - switch.turn_on: angleled2
              else: 
                - if:
                    condition:
                      switch.is_off: angleled3   
                    then:     
                      - switch.turn_on: angleled3
                    else: 
                      - if:
                          condition:
                            switch.is_off: angleled4
                          then:     
                            - switch.turn_on: angleled4
sensor:
  - platform: duty_cycle #通过占空比的变动来切换风速指示灯
    pin: 23
    name: fan speed Sensor
    id: fan_speed
    update_interval: 1s
    internal: True    
    on_value:
      then:      
        - lambda: |-
            if (id(dc_fan).state) {
              if (id(dc_fan).speed < 36) {
                id(sp1).turn_on();
              } else if (id(dc_fan).speed < 51){
                  id(sp2).turn_on();
                } else if (id(dc_fan).speed < 76){
                  id(sp3).turn_on();
                } else {
                id(sp4).turn_on();
              }
              }    
switch: 
  - platform: template
    id: left
    name: "${device_name} Stepper position -250"
    turn_on_action:
      - stepper.set_target:
            id: stepper_vmc
            target: -250
  - platform: template
    id: right
    name: "${device_name} Stepper position 250"
    turn_on_action:
      - stepper.set_target:
            id: stepper_vmc
            target: 250

  - platform: template #模板开关,风速低
    id: fan_low
    turn_on_action:
      - fan.turn_on:
          id: dc_fan
          speed: 35
          
  - platform: template #模板开关,风速中
    id: fan_med
    turn_on_action:
      - fan.turn_on:
          id: dc_fan
          speed: 50
          
  - platform: template #模板开关,风速中高
    id: fan_medhigh
    turn_on_action:
      - fan.turn_on:
          id: dc_fan
          speed: 75
  - platform: template #模板开关,风速高
    id: fan_high
    turn_on_action:
      - fan.turn_on:
          id: dc_fan
          speed: 100              
## 以下为风速指示
  - platform: gpio  #Speed1
    pin: 12
    name: "sp1"
    id: sp1
    restore_mode: ALWAYS_OFF 
    internal: True    
    interlock: &interlock_group [sp1, sp2,sp3,sp4]
    interlock_wait_time: 100ms
  - platform: gpio  #Speed2
    pin: 13
    name: "sp2"   
    id: sp2
    restore_mode: ALWAYS_OFF 
    internal: True
    interlock: *interlock_group
    interlock_wait_time: 100ms
  - platform: gpio  #Speed3
    pin: 15
    restore_mode: ALWAYS_OFF 
    name: "sp3"
    id: sp3
    internal: True
    interlock: *interlock_group
    interlock_wait_time: 100ms   
  - platform: gpio  #Speed4
    pin: 2
    restore_mode: ALWAYS_OFF 
    name: "sp4"
    id: sp4
    internal: True
    interlock: *interlock_group
    interlock_wait_time: 100ms   
## 以下为角度指示    
  - platform: gpio #30度
    pin: 25
    id: angleled1
    name: "angleled1"  
    on_turn_on:
      - repeat:
          count: 999999  
          then:          
            - stepper.set_target:
                id: stepper_vmc
                target: -250
            - delay: 4s                
            - stepper.set_target:
                id: stepper_vmc
                target: 250
            - delay: 4s    
    restore_mode: ALWAYS_OFF
    interlock: &interlock_group2 [angleled1, angleled2,angleled3,angleled4]
    interlock_wait_time: 100ms    
#    internal: True     
  - platform: gpio  #60度
    pin: 26
    name: "angleled2"
    id: angleled2
    on_turn_on:    
      - repeat:
          count: 999999  
          then:          
            - stepper.set_target:
                id: stepper_vmc
                target: -500
            - delay: 7s                
            - stepper.set_target:
                id: stepper_vmc
                target: 500
            - delay: 7s     
    restore_mode: ALWAYS_OFF 
#    internal: True
    interlock: *interlock_group2    
  - platform: gpio #90度
    pin: 27
    id: angleled3
    on_turn_on:    
      - repeat:
          count: 999999  
          then:          
            - stepper.set_target:
                id: stepper_vmc
                target: -1000
            - delay: 10s                
            - stepper.set_target:
                id: stepper_vmc
                target: 1000
            - delay: 10s       
    restore_mode: ALWAYS_OFF
    name: "angleled3"
#    internal: True 
    interlock: *interlock_group2
  - platform: gpio  #180度
    pin: 14
    name: "angleled4"
    id: angleled4
    on_turn_on:    
      - repeat:
          count: 999999  
          then:          
            - stepper.set_target:
                id: stepper_vmc
                target: -1500
            - delay: 20s                
            - stepper.set_target:
                id: stepper_vmc
                target: 1500
            - delay: 20s     
    restore_mode: ALWAYS_OFF 
    interlock: *interlock_group2    
#    internal: True    
## 以下为定时指示 
  - platform: gpio  #定时显示4#led
    pin: 33
    restore_mode: ALWAYS_OFF 
    name: "led_4h"
    id: led_4h
    internal: True
  - platform: gpio  #定时显示3#led
    pin: 32
    name: "led_3h"
    id: led_3h
    restore_mode: ALWAYS_OFF 
    internal: True
  - platform: gpio  #定时显示2#led
    pin: 4
    name: "led_2h"
    id: led_2h
    restore_mode: ALWAYS_OFF 
    internal: True
  - platform: gpio   #定时显示1#led
    pin: 16
    name: "led_1h"
    id: led_1h
    restore_mode: ALWAYS_OFF 
    internal: True
    
stepper:
  - platform: uln2003
    id: stepper_vmc
    pin_a: 19
    pin_b: 18
    pin_c: 5
    pin_d: 17
    max_speed: 175 steps/s

    # Optional:
    acceleration: inf
    deceleration: inf    



回复

使用道具 举报

16

主题

269

帖子

2817

积分

论坛DIY达人

积分
2817
金钱
2533
HASS币
60
 楼主| 发表于 2023-5-19 09:30:31 | 显示全部楼层
自捞一下
回复

使用道具 举报

18

主题

266

帖子

2160

积分

论坛DIY达人

积分
2160
金钱
1889
HASS币
20
发表于 2023-5-19 15:38:09 | 显示全部楼层
既然知道步数,换算成角度应该是简单的。所以我猜想您的问题是如何判断当前位置吧?
给2个思路以便抛砖引玉
1.软件方式:实时将角度(也可以理解为步数)作为全局变量写入Flash,下次运行时调用该值即可判断位置。
2.硬件方式:加入干簧管磁控开关之类的东东,风扇头每过一次即可校正位置。
回复

使用道具 举报

16

主题

269

帖子

2817

积分

论坛DIY达人

积分
2817
金钱
2533
HASS币
60
 楼主| 发表于 2023-5-19 22:27:09 | 显示全部楼层
polisher 发表于 2023-5-19 15:38
既然知道步数,换算成角度应该是简单的。所以我猜想您的问题是如何判断当前位置吧?
给2个思路以便抛砖引玉 ...

问题在于用esphome做步进电机的逻辑,,已经找到之前做改装主板的大佬要了pcb和固件了,
回复

使用道具 举报

0

主题

201

帖子

2713

积分

金牌会员

Rank: 6Rank: 6

积分
2713
金钱
2512
HASS币
0
发表于 2023-6-26 09:39:58 | 显示全部楼层
花落花空 发表于 2023-5-19 22:27
问题在于用esphome做步进电机的逻辑,,已经找到之前做改装主板的大佬要了pcb和固件了, ...

大佬能分享下吗。
回复

使用道具 举报

16

主题

269

帖子

2817

积分

论坛DIY达人

积分
2817
金钱
2533
HASS币
60
 楼主| 发表于 2023-6-28 15:56:12 | 显示全部楼层

不方便分享,大佬未开源,固件需要校验码激活。蚊子大佬的。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 16:42 , Processed in 0.126540 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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