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

 找回密码
 立即注册
查看: 2929|回复: 20

[硬件DIY] PWM温控风扇,拆机CPU风扇给弱电箱散热!!

[复制链接]

5

主题

190

帖子

926

积分

高级会员

Rank: 4

积分
926
金钱
731
HASS币
20
发表于 2024-5-14 00:02:55 | 显示全部楼层 |阅读模式
本帖最后由 BG8HQE 于 2024-6-21 23:41 编辑

弱电箱用了倍控N100无风扇被动散热软路由,正常运行显示温度接近80°,摸起来非常烫手,咨询过倍控厂家,说没事,温度高正常,系统能承受,但总觉得不放心,于是弄一个PWM温控风扇,温度采集用的不锈钢封装的DSB1820,CPU用的ESP32C3,合宙9.9包邮的ESP32C3模块性价比无敌,比D1 mini还便宜,速度快了很多倍,可惜合宙现在厂家涨价了,于是买了另外一家的超小模块,某宝领卷买一个还是9.9包邮,经过摸索测试,一切完美,温度一下降了不止一倍,摸起来基本感觉不到热量,手机拍的图片,没有处理,大家将就看,图纸就很简单了,12V转5V测试了好多,建议大家买mini560,经过测试好用。

IMG_20240509_091251.jpg
IMG_20240509_091318.jpg
IMG_20240509_091146.jpg
温控设备信息.jpg 温控界面.jpg
代码如下,供有需要的同学参考:

substitutions:
  device_name: "rtfan"
  friendly_name: "rtfan"
  comment: "tfan01"
  version: "1.0.0"
  speed_low: "20"
  speed_med: "50"
  speed_full: "100"

esphome:
  name: "${friendly_name}"
  friendly_name: "${friendly_name}"
  on_boot:
    then:
      - delay: 3s
      - fan.turn_off:
          id: ${friendly_name}_fan
      - delay: 3s
      - fan.turn_on:
          id: ${friendly_name}_fan
          speed: "${speed_low}"
      - delay: 3s
      - fan.turn_off:
          id: ${friendly_name}_fan
  platformio_options:
    board_build.flash_mode: dio
    board_build.mcu: esp32c3

esp32:
  board: esp32-c3-devkitm-1
  variant: ESP32C3
  framework:
    type: arduino


#    type: esp-idf
#    version: latest
#     platform_version: https://github.com/tasmota/platform-espressif32

logger:
  #不同的log等级看到的信息详细程度不一样,信息量从少到多依次为
  # NONE、ERROR、WARN、INFO、DEBUG、VERBOSE、VERY_VERBOSE
  level: DEBUG
  #设置为0关闭通过UART的log输出
  baud_rate: 0
# Enable Home Assistant API
api:
  encryption:
    key: "YFIU3lp99/jRJt/HBZFl9Jxl83nVtjYuNpBaqYiMzgU="

ota:
  password: "1ca4371e74c34b0029daa0ee781f6317"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp32C3 Fallback Hotspot"
    password: "8xS7JiIRB0my"
#------- WEB后台,不建议使用 -------
web_server:
  port: 80
#  css_url: https://esphome.io/_static/webserver-v1.min.css
#  js_url: https://esphome.io/_static/webserver-v1.min.js
#----------------------------------------------------

captive_portal:   


fan:
  - platform: speed
    id: "${friendly_name}_fan"
    output: pwm_output
    speed_count: 100
    name: "${device_name} 开关"

output:
  - platform: ledc
    pin: GPIO00
    frequency: 25000 Hz
    id: pwm_output

number:
  - platform: template
    icon: "mdi:fan"
    id: ${friendly_name}_speed_input
    name: "${device_name} 风速"
    lambda: |-
      return id(${friendly_name}_fan).speed;
    step: 1
    min_value: 20
    max_value: 100
    unit_of_measurement: "%"
    update_interval: 1s
    set_action:
      then:
        - fan.turn_on:
            id: ${friendly_name}_fan
            speed: !lambda "return x;"
        - component.update: ${friendly_name}_fanmode
        - component.update: ${friendly_name}_sensor_fanspeed

select:
  - platform: template
    icon: "mdi:fan"
    name: "${device_name} 模式"
    id: ${friendly_name}_fanmode
    update_interval: 1s
    lambda: |-
      if(id(${friendly_name}_fan).speed <= ${speed_low})
        return std::string("Low");
      else if(id(${friendly_name}_fan).speed == ${speed_med})
        return std::string("Medium");
      else if(id(${friendly_name}_fan).speed >= ${speed_full})
        return std::string("Full");
      else
        return std::string("Custom");
    set_action:
      then:
        - lambda: |-
            auto call = id(${friendly_name}_fan).turn_on();

            if(x == "Low")
              call.set_speed(${speed_low});
            else if(x == "Medium")
              call.set_speed(${speed_med});
            else if(x == "Full")
              call.set_speed(${speed_full});
            else
              call.set_speed(id(${friendly_name}_speed_input).state);

            call.perform();
        - component.update: ${friendly_name}_speed_input
        - component.update: ${friendly_name}_sensor_fanspeed
    options:
      - Low
      - Medium
      - Full
      - Custom

button:
  - platform: template
    icon: "mdi:fan-speed-1"
    name: "${device_name} Low"
    on_press:
      - fan.turn_on:
          id: ${friendly_name}_fan
          speed: "${speed_low}"
  - platform: template
    icon: "mdi:fan-speed-2"
    name: "${device_name} Med"
    on_press:
      - fan.turn_on:
          id: ${friendly_name}_fan
          speed: "${speed_med}"
  - platform: template
    icon: "mdi:fan-speed-3"
    name: "${device_name} Full"
    on_press:
      - fan.turn_on:
          id: ${friendly_name}_fan
          speed: "${speed_full}"
  - platform: restart
    name: "${device_name} 重启"
dallas:
    pin:
      number: GPIO02
#      inverted: true
      mode:
        input: true
        pullup: true
    update_interval: 2s

sensor:
  - platform: template
    id: ${friendly_name}_sensor_fanspeed
    icon: "mdi:fan"
    name: "风扇速度"
    lambda: |-
      return id(${friendly_name}_fan).speed;
    accuracy_decimals: 0
    unit_of_measurement: "%"
    update_interval: 1s
  - platform: pulse_counter
    pin:
      number: GPIO01
      inverted: true
      mode:
        input: true
        pullup: true
    name: ${friendly_name} 风扇转速
    unit_of_measurement: 'RPM'
    filters:
      - multiply: 0.5
      - lambda: |-
          if (x <= 5000) return x;
          else return {};
    count_mode:
      rising_edge: INCREMENT
      falling_edge: DISABLE
    update_interval: 2s
  - platform: dallas
    address: 0xcd00000069e43b28
    name: "18b20"
    on_value:
        then:
          - fan.turn_on:
              id: ${friendly_name}_fan
              speed: !lambda "return x/1;"
  - platform: internal_temperature
    name: "Internal Temperature"
light:
  - platform: esp32_rmt_led_strip
    rgb_order: GRB
    pin: GPIO8
    num_leds: 1
    rmt_channel: 0
    chipset: ws2812
    name: "My Light"  




2024.6.0之后有OTA改成了平台,DS18B20也改成一线总线,更新如下
substitutions:
  device_name: "rtfan"
  friendly_name: "rtfan"
  comment: "tfan01"
  version: "1.0.0"
  speed_low: "20"
  speed_med: "50"
  speed_full: "100"

esphome:
  name: "${friendly_name}"
  friendly_name: "${friendly_name}"
  on_boot:
    then:
      - delay: 3s
      - fan.turn_off:
          id: ${friendly_name}_fan
      - delay: 3s
      - fan.turn_on:
          id: ${friendly_name}_fan
          speed: "${speed_low}"
      - delay: 3s
      - fan.turn_off:
          id: ${friendly_name}_fan
  platformio_options:
    board_build.flash_mode: dio
    board_build.mcu: esp32c3

esp32:
  board: esp32-c3-devkitm-1
  variant: ESP32C3
  framework:
    type: arduino


#    type: esp-idf
#    version: latest
#     platform_version: https://github.com/tasmota/platform-espressif32

logger:
  #不同的log等级看到的信息详细程度不一样,信息量从少到多依次为
  # NONE、ERROR、WARN、INFO、DEBUG、VERBOSE、VERY_VERBOSE
  level: DEBUG
  #设置为0关闭通过UART的log输出
  baud_rate: 0
# Enable Home Assistant API
api:
  encryption:
    key: "YFIU3lp99/jRJt/HBZFl9Jxl83nVtjYuNpBaqYiMzgU="

ota:
  - platform: esphome
    password: !secret ota_password

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp32C3 Fallback Hotspot"
    password: "8xS7JiIRB0my"
#------- WEB后台,不建议使用 -------
web_server:
  port: 80
#  css_url: https://esphome.io/_static/webserver-v1.min.css
#  js_url: https://esphome.io/_static/webserver-v1.min.js
#----------------------------------------------------

captive_portal:   


fan:
  - platform: speed
    id: "${friendly_name}_fan"
    output: pwm_output
    speed_count: 100
    name: "${device_name} 开关"

output:
  - platform: ledc
    pin: GPIO00
    frequency: 25000 Hz
    id: pwm_output

number:
  - platform: template
    icon: "mdi:fan"
    id: ${friendly_name}_speed_input
    name: "${device_name} 风速"
    lambda: |-
      return id(${friendly_name}_fan).speed;
    step: 1
    min_value: 20
    max_value: 100
    unit_of_measurement: "%"
    update_interval: 1s
    set_action:
      then:
        - fan.turn_on:
            id: ${friendly_name}_fan
            speed: !lambda "return x;"
        - component.update: ${friendly_name}_fanmode
        - component.update: ${friendly_name}_sensor_fanspeed

select:
  - platform: template
    icon: "mdi:fan"
    name: "${device_name} 模式"
    id: ${friendly_name}_fanmode
    update_interval: 1s
    lambda: |-
      if(id(${friendly_name}_fan).speed <= ${speed_low})
        return std::string("Low");
      else if(id(${friendly_name}_fan).speed == ${speed_med})
        return std::string("Medium");
      else if(id(${friendly_name}_fan).speed >= ${speed_full})
        return std::string("Full");
      else
        return std::string("Custom");
    set_action:
      then:
        - lambda: |-
            auto call = id(${friendly_name}_fan).turn_on();

            if(x == "Low")
              call.set_speed(${speed_low});
            else if(x == "Medium")
              call.set_speed(${speed_med});
            else if(x == "Full")
              call.set_speed(${speed_full});
            else
              call.set_speed(id(${friendly_name}_speed_input).state);

            call.perform();
        - component.update: ${friendly_name}_speed_input
        - component.update: ${friendly_name}_sensor_fanspeed
    options:
      - Low
      - Medium
      - Full
      - Custom

button:
  - platform: template
    icon: "mdi:fan-speed-1"
    name: "${device_name} Low"
    on_press:
      - fan.turn_on:
          id: ${friendly_name}_fan
          speed: "${speed_low}"
  - platform: template
    icon: "mdi:fan-speed-2"
    name: "${device_name} Med"
    on_press:
      - fan.turn_on:
          id: ${friendly_name}_fan
          speed: "${speed_med}"
  - platform: template
    icon: "mdi:fan-speed-3"
    name: "${device_name} Full"
    on_press:
      - fan.turn_on:
          id: ${friendly_name}_fan
          speed: "${speed_full}"
  - platform: restart
    name: "${device_name} 重启"
one_wire:
  - platform: gpio
    pin:
      number: GPIO02
#      inverted: true
      mode:
        input: true
        pullup: true


sensor:
  - platform: template
    id: ${friendly_name}_sensor_fanspeed
    icon: "mdi:fan"
    name: "风扇速度"
    lambda: |-
      return id(${friendly_name}_fan).speed;
    accuracy_decimals: 0
    unit_of_measurement: "%"
    update_interval: 1s
  - platform: pulse_counter
    pin:
      number: GPIO01
      inverted: true
      mode:
        input: true
        pullup: true
    name: ${friendly_name} 风扇转速
    unit_of_measurement: 'RPM'
    filters:
      - multiply: 0.5
      - lambda: |-
          if (x <= 5000) return x;
          else return {};
    count_mode:
      rising_edge: INCREMENT
      falling_edge: DISABLE
    update_interval: 2s
  - platform: dallas_temp
    address: 0xcd00000069e43b28
    name: "18b20"
    on_value:
        then:
          - fan.turn_on:
              id: ${friendly_name}_fan
              speed: !lambda "return x/1;"
    update_interval: 2s
  - platform: internal_temperature
    name: "Internal Temperature"
light:
  - platform: esp32_rmt_led_strip
    rgb_order: GRB
    pin: GPIO8
    num_leds: 1
    rmt_channel: 0
    chipset: ws2812
    name: "My Light"  










回复

使用道具 举报

16

主题

178

帖子

930

积分

高级会员

Rank: 4

积分
930
金钱
752
HASS币
0
发表于 2024-5-14 00:20:46 | 显示全部楼层
其实可以直接接主机里面PWM风扇接口上
回复

使用道具 举报

5

主题

190

帖子

926

积分

高级会员

Rank: 4

积分
926
金钱
731
HASS币
20
 楼主| 发表于 2024-5-14 00:35:36 | 显示全部楼层
leung 发表于 2024-5-14 00:20
其实可以直接接主机里面PWM风扇接口上

开始也是想接主板PWM接口,打开看了,倍控的这款N00 DDR5内存的机型,没有PWM接口!
回复

使用道具 举报

43

主题

202

帖子

925

积分

高级会员

Rank: 4

积分
925
金钱
723
HASS币
0
发表于 2024-5-14 00:49:17 | 显示全部楼层
leung 发表于 2024-5-14 00:20
其实可以直接接主机里面PWM风扇接口上

我买过三台类似的小主机,风扇接口要么没有温控,要么只有低速和高速两档。
回复

使用道具 举报

43

主题

202

帖子

925

积分

高级会员

Rank: 4

积分
925
金钱
723
HASS币
0
发表于 2024-5-14 00:51:49 | 显示全部楼层
淘宝上成品温控模块也挺好用的,可以设置控制温度和调速曲线。
屏幕截图 2024-05-14 005038.png
回复

使用道具 举报

16

主题

178

帖子

930

积分

高级会员

Rank: 4

积分
930
金钱
752
HASS币
0
发表于 2024-5-14 01:16:55 | 显示全部楼层
BG8HQE 发表于 2024-5-14 00:35
开始也是想接主板PWM接口,打开看了,倍控的这款N00 DDR5内存的机型,没有PWM接口! ...

可能不是标准接口,我买的畅网N100是4针转PWM接口。。。PVE下也没办法控制风速,只能选好风扇了,12V0.15A的扇,不然太吵
回复

使用道具 举报

11

主题

184

帖子

1583

积分

金牌会员

Rank: 6Rank: 6

积分
1583
金钱
1399
HASS币
0
发表于 2024-5-14 08:13:56 | 显示全部楼层
没事儿仿一个
01s也应该可以的
回复

使用道具 举报

20

主题

265

帖子

1852

积分

金牌会员

Rank: 6Rank: 6

积分
1852
金钱
1587
HASS币
0
发表于 2024-5-14 08:36:47 | 显示全部楼层
四针风扇,蓝色线接gpio0吗
回复

使用道具 举报

20

主题

133

帖子

850

积分

高级会员

Rank: 4

积分
850
金钱
717
HASS币
0
发表于 2024-5-14 10:55:10 | 显示全部楼层
ESP32C3 的wifi 信号 接收好吗

另外楼主是否可以截图一下 HA控制界面 看看
回复

使用道具 举报

5

主题

44

帖子

726

积分

高级会员

Rank: 4

积分
726
金钱
682
HASS币
0
发表于 2024-5-14 11:00:09 | 显示全部楼层
大神能展示下这个风扇在homeassistant的操作界面吗?   还有就是获取风扇转速那乘以0.5  是风扇两个脉冲转一圈吗
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-25 01:32 , Processed in 0.112094 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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