找回密码
 立即注册

微信扫码登录

搜索
查看: 1608|回复: 22

[照明] 基于ESP32-C3的家用双色调光灯。

[复制链接]

2

主题

12

回帖

79

积分

论坛DIY达人

积分
79
金钱
65
HASS币
0
发表于 2025-11-9 19:35:51 | 显示全部楼层 |阅读模式
本帖最后由 dreameryy 于 2025-11-9 22:01 编辑

之前做过一个洞洞板的灯控板,经过网购平台购买灯板发现大部分都需要恒流驱动。因此修改了方案 采用MT9714D 制作一款方便家用的220V输入的双色灯灯控板,双路输出的好处是一路正常灯光,一路为夜灯模式 因为家里有宝宝,晚上经常起夜换尿裤,用第二路做夜灯控制。黄色的灯光 不刺眼。
image.png
这是线路板,可以直接插C3mini-PRO那个模块,

实现的功能:两路调光输出带供电继电器 之前版本的实测中关闭输出后有漏电流导致灯泡微亮所以加入继电器,任何灯打开继电器输出没有灯开启的时候继电器断开,此外还增加了一路I2C输入用来接温度湿度或者人体等传感器。
预留了433输入接口 目前匹配的是jj43A这个模块,可以实现随意贴那种射频开关来开关灯和调亮度。


image.png image.png
贴上适配的yaml:(GPT生成的,我是纯小白还在折腾学习中)
captive_portal:

i2c:
  sda: GPIO8
  scl: GPIO9
  scan: true
  id: bus_a
  frequency: 100kHz

light:
  - platform: monochromatic
    name: "灯"
    output: pwm_output0
    id: pwm_light0
    gamma_correct: 1.0
    restore_mode: ALWAYS_ON

  - platform: monochromatic
    name: "夜灯"
    output: pwm_output1
    id: pwm_light1
    gamma_correct: 1.0

power_supply:
  - id: power_supply_id
    pin:
      number: GPIO5
      inverted: true   # 低电平 = 开供电
    enable_time: 0.3s
    keep_on_time: 1s # 灯关后保持一会再断电
output:
  - platform: ledc
    pin: GPIO6  # 灯光输出引脚
    id: pwm_output0
    frequency: 1000Hz
    inverted: false
    min_power: 0.00
    max_power: 1.00
    power_supply: power_supply_id 

  - platform: ledc
    pin: GPIO7  # 灯光输出引脚
    id: pwm_output1
    frequency: 1000Hz
    inverted: false
    min_power: 0.00
    max_power: 1.00
    power_supply: power_supply_id

binary_sensor:
  - platform: gpio
    pin: 
      number: GPIO3
      mode: INPUT_PULLDOWN
      inverted: false
    name: "4333"
    id: external_button3
    on_multi_click:
      - timing:
          - ON for at most 700ms
          - OFF for at least 10ms
        then:
          - lambda: |-
              ESP_LOGD("light_control", "Single click detected.");
              if (!id(pwm_light0).current_values.get_state()) {
                // 如果灯是关闭状态,打开灯
                auto call = id(pwm_light0).make_call();
                call.set_state(true);  // 打开灯
                //call.set_brightness(id(current_brightness));  // 使用当前保存的亮度
                call.perform();
                ESP_LOGD("light_control", "Light turned ON with brightness %.2f", id(current_brightness));
              } else {
                // 如果灯是打开状态,关闭灯
                auto call = id(pwm_light0).make_call();
                call.set_state(false);  // 关闭灯
                call.perform();
                ESP_LOGD("light_control", "Light turned OFF");
              }

      # 长按:调整亮度
      - timing:
          - ON for at least 750ms
          - OFF for at least 10ms
        then:
          - lambda: |-
              ESP_LOGD("light_control", "Double click detected.");
              if (id(pwm_light0).current_values.get_state()) {
                // 仅当灯是开启状态时调整亮度
                static int brightness_level = 0;  // 当前亮度级别
                brightness_level = (brightness_level + 1) % 3;  // 循环亮度级别 (0, 1, 2)
                float brightness = 0.0;

                if (brightness_level == 0) brightness = 0.10;  // 10%
                if (brightness_level == 1) brightness = 0.50;  // 50%
                if (brightness_level == 2) brightness = 1.00;  // 100%

                id(current_brightness) = brightness;  // 保存当前亮度
                ESP_LOGD("light_control", "Setting brightness to %.2f", brightness);
                auto call = id(pwm_light0).make_call();
                call.set_brightness(brightness);
                call.set_state(true);  // 确保灯是打开的
                call.perform();
                ESP_LOGD("light_control", "Brightness level adjusted to %.2f", brightness);
              } else {
                ESP_LOGD("light_control", "Light is OFF, double click has no effect.");
              }
  - platform: gpio
    pin: 
      number: GPIO2
      mode: INPUT_PULLDOWN
      inverted: false
    name: "4332"
    id: external_button2
    on_multi_click:
      - timing:
          - ON for at most 700ms
          - OFF for at least 10ms
        then:
          - lambda: |-
              ESP_LOGD("light_control", "Single click detected.");
              if (!id(pwm_light1).current_values.get_state()) {
                // 如果灯是关闭状态,打开灯
                auto call = id(pwm_light1).make_call();
                call.set_state(true);  // 打开灯
                //call.set_brightness(id(current_brightness));  // 使用当前保存的亮度
                call.perform();
                ESP_LOGD("light_control", "Light turned ON with brightness %.2f", id(current_brightness));
              } else {
                // 如果灯是打开状态,关闭灯
                auto call = id(pwm_light1).make_call();
                call.set_state(false);  // 关闭灯
                call.perform();
                ESP_LOGD("light_control", "Light turned OFF");
              }

      # 长按:调整亮度
      - timing:
          - ON for at least 750ms
          - OFF for at least 10ms
        then:
          - lambda: |-
              ESP_LOGD("light_control", "Double click detected.");
              if (id(pwm_light1).current_values.get_state()) {
                // 仅当灯是开启状态时调整亮度
                static int brightness_level = 0;  // 当前亮度级别
                brightness_level = (brightness_level + 1) % 3;  // 循环亮度级别 (0, 1, 2)
                float brightness = 0.0;

                if (brightness_level == 0) brightness = 0.10;  // 10%
                if (brightness_level == 1) brightness = 0.50;  // 50%
                if (brightness_level == 2) brightness = 1.00;  // 100%

                id(current_brightness1) = brightness;  // 保存当前亮度
                ESP_LOGD("light_control", "Setting brightness to %.2f", brightness);
                auto call = id(pwm_light1).make_call();
                call.set_brightness(brightness);
                call.set_state(true);  // 确保灯是打开的
                call.perform();
                ESP_LOGD("light_control", "Brightness level adjusted to %.2f", brightness);
              } else {
                ESP_LOGD("light_control", "Light is OFF, double click has no effect.");
              }

globals:
  - id: current_brightness
    type: float
    restore_value: no
    initial_value: '0.5'  # 默认亮度为 100%
  - id: current_brightness1
    type: float
    restore_value: no
    initial_value: '0.5'  # 默认亮度为 100%

sensor:
  - platform: bme280_i2c
    temperature:
      name: "BME280 Temperature"
    pressure:
      name: "BME280 Pressure"
    humidity:
      name: "BME280 Humidity"
    address: 0x76  # 或 0x77,根据实际扫描结果
    update_interval: 8s
    i2c_id: bus_a


评分

参与人数 1金钱 +16 收起 理由
hhh. + 16 论坛有你更精彩!

查看全部评分

回复

使用道具 举报

hhh. 手机认证

11

主题

396

回帖

3450

积分

论坛UI达人

积分
3450
金钱
3043
HASS币
0
发表于 2025-11-9 20:58:11 | 显示全部楼层
没看懂,你分享了什么? 照片吗?
回复

使用道具 举报

2

主题

12

回帖

79

积分

论坛DIY达人

积分
79
金钱
65
HASS币
0
 楼主| 发表于 2025-11-9 21:39:56 | 显示全部楼层
hhh. 发表于 2025-11-9 20:58
没看懂,你分享了什么? 照片吗?

编辑了一半。视频没法传。原理图照片过大传不上来。还在摸索中。
回复

使用道具 举报

1

主题

16

回帖

215

积分

中级会员

积分
215
金钱
198
HASS币
0
发表于 2025-11-10 10:00:01 | 显示全部楼层
想法不错,学习一下
回复

使用道具 举报

shay 手机认证

20

主题

360

回帖

2078

积分

金牌会员

积分
2078
金钱
1693
HASS币
20
发表于 2025-11-10 10:35:44 | 显示全部楼层
目前我也是这样的diy,模块+功能自己画板的方式,电源模块、mcu模组的使用,大大简化了板子的设计。
回复

使用道具 举报

74

主题

520

回帖

2469

积分

金牌会员

积分
2469
金钱
1875
HASS币
50
发表于 2025-11-10 15:53:50 | 显示全部楼层
兄弟 当买成品的价格低于diy时,海鲜市场 tuya的 带2m灯带 12V 好像带拾音功能(到货研究确定了来),包邮才18.5.我选择买成品
回复

使用道具 举报

5

主题

93

回帖

1164

积分

论坛DIY达人

积分
1164
金钱
1061
HASS币
20
发表于 2025-11-10 16:19:28 | 显示全部楼层
能实现开灯缓亮么,有几个筒灯想要这个功能。晚上开灯不刺眼,另外缓亮也比较有氛围感。分享下电路图么?
回复

使用道具 举报

hxck 手机认证

4

主题

128

回帖

948

积分

高级会员

积分
948
金钱
816
HASS币
0
发表于 2025-11-10 16:21:47 | 显示全部楼层
这个好,必须点赞。能带动多大W数的
回复

使用道具 举报

5

主题

93

回帖

1164

积分

论坛DIY达人

积分
1164
金钱
1061
HASS币
20
发表于 2025-11-10 16:24:29 | 显示全部楼层
tanbobo 发表于 2025-11-10 15:53
兄弟 当买成品的价格低于diy时,海鲜市场 tuya的 带2m灯带 12V 好像带拾音功能(到货研究确定了来),包邮 ...

菜市场买条鱼也不贵,还不是有大把钓鱼佬花大价钱买杆子打窝。个人需求不同啊,不光追求功能还享受DIY的乐趣,学习新的知识另外设备也完全自主可控。这时候性价比就要退让了。(当我花了大价钱DIY一看成品还便宜时我是这么安慰自己的)


回复

使用道具 举报

28

主题

141

回帖

1141

积分

金牌会员

积分
1141
金钱
972
HASS币
0
发表于 2025-11-10 17:13:09 | 显示全部楼层
本帖最后由 taida 于 2025-11-10 17:14 编辑

17d1af6c5d17aaed619ecb1d4ac7919.jpg faa547bb24705a81f6eb1b5c42dcd3f.jpg 3f1fe1e3e52b5828535b350d5374ed5.jpg 楼主说的好,这个花了我差不多一张毛爷爷,但是过程很好,反复折腾才是diy的乐趣
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian ( 晋ICP备17001384号-1 )

GMT+8, 2026-1-16 12:09 , Processed in 1.225124 second(s), 13 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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