前言
要实现非线性变化的呼吸灯效果,可以通过调整亮度变化的曲线,使其不再是线性变化,而是采用一种更自然、更加平滑的渐变。
常见的非线性曲线包括指数增长或对数衰减,它们可以模拟人眼对亮度的感知方式,使得变化看起来更加柔和。
非线性变化的原理
非线性变化通常会让亮度的变化不那么均匀,表现为前期变化较慢,后期变化较快或相反。
例如,指数增长或者对数衰减可以让亮度的变化在开始和结束时都显得更加平滑。
改进代码:使用指数函数模拟非线性变化
以下是代码示例,使用指数函数来控制亮度变化,从而实现非线性呼吸灯效果:
const int ledPin = 2; // 设置为内置LED的GPIO
int pwmChannel = 0; // PWM 通道
int freq = 5000; // PWM 频率
int resolution = 8; // PWM 分辨率,取值范围 0-255
void setup() {
// 初始化 LED 引脚为输出
pinMode(ledPin, OUTPUT);
// 设置 PWM 通道,频率,和分辨率
ledcSetup(pwmChannel, freq, resolution);
// 将 LED 引脚与 PWM 通道关联
ledcAttachPin(ledPin, pwmChannel);
}
void loop() {
// 呼吸灯效果:使用指数曲线控制亮度
for (int i = 0; i <= 255; i++) {
// 使用指数函数计算亮度,使亮度增加更加平滑
int brightness = (int)(255 * (1 - exp(-i / 50.0))); // 控制指数增长的速度
ledcWrite(pwmChannel, brightness); // 设置 LED 的亮度
delay(10); // 延迟一段时间,调整亮度变化的速度
}
for (int i = 255; i >= 0; i--) {
// 使用指数函数控制亮度的衰减,使亮度减小更加平滑
int brightness = (int)(255 * (1 - exp(-i / 50.0)));
ledcWrite(pwmChannel, brightness); // 设置 LED 的亮度
delay(10); // 延迟一段时间,调整亮度变化的速度
}
}
代码解析:
-
指数函数:
int brightness = (int)(255 * (1 - exp(-i / 50.0)));
:这行代码使用了一个简单的指数衰减函数来模拟非线性的亮度变化。exp(-i / 50.0)
是指数衰减函数。i
是循环的变量,控制亮度的变化,随着i
增大,exp(-i / 50.0)
的值会从接近 1 变为接近 0。(1 - exp(-i / 50.0))
控制了指数增长或衰减的过程。255 * (1 - exp(-i / 50.0))
将其结果映射到亮度范围 [0, 255],使得亮度变化更为平滑。
-
变化速度控制:
delay(10)
控制每次亮度更新的时间间隔。你可以通过调整这个值来加快或减慢亮度变化的速度。
控制非线性变化的参数:
50.0
:这是控制指数变化速率的参数。可以通过调整它来改变呼吸灯效果的平滑度和速度。- 较大的值(如
100.0
或150.0
)会使亮度变化更加平滑,渐变速度变慢。 - 较小的值(如
20.0
或10.0
)会让亮度变化更加剧烈,渐变速度变快。
- 较大的值(如
如何调整:
- 控制亮度变化的平滑度:调整
50.0
参数来改变指数曲线的变化速率。更高的值让变化更加平滑,逐渐地变亮或变暗。 - 控制亮度变化的速度:可以通过调整
delay()
的时间来控制整个呼吸灯效果的周期。delay()
时间较长会让亮度变化更慢,较短会让变化更快。
更复杂的非线性函数:
如果你想要更精细的控制效果,可以尝试使用不同类型的非线性函数,例如对数函数或自定义的平滑曲线。
使用数学库中的其他函数,或者手动调节参数,可以让你的呼吸灯效果更加丰富多样。
1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【蓝牙点击器】CORE-ESP32-C3核心板实现非线性渐变的呼吸灯效果
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【蓝牙点击器】CORE-ESP32-C3核心板实现非线性渐变的呼吸灯效果