本帖最后由 dreameryy 于 2025-11-9 22:01 编辑
之前做过一个洞洞板的灯控板,经过网购平台购买灯板发现大部分都需要恒流驱动。因此修改了方案 采用MT9714D 制作一款方便家用的220V输入的双色灯灯控板,双路输出的好处是一路正常灯光,一路为夜灯模式 因为家里有宝宝,晚上经常起夜换尿裤,用第二路做夜灯控制。黄色的灯光 不刺眼。
这是线路板,可以直接插C3mini-PRO那个模块,
实现的功能:两路调光输出带供电继电器 之前版本的实测中关闭输出后有漏电流导致灯泡微亮所以加入继电器,任何灯打开继电器输出没有灯开启的时候继电器断开,此外还增加了一路I2C输入用来接温度湿度或者人体等传感器。
预留了433输入接口 目前匹配的是jj43A这个模块,可以实现随意贴那种射频开关来开关灯和调亮度。
贴上适配的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
|