呼吸灯
一、什么是呼吸灯
摘自http://www.360doc.com/content/20/1202/17/69661187_949127207.shtml
呼吸灯,上电后LED灯渐渐变亮,当达到最亮时保持几秒钟,然后渐渐变暗直到熄灭。熄灭几秒钟后又渐渐由暗变亮,这样一直循环下去。如果循环亮灭的速度刚好和人的呼吸同步,那就是传说中的呼吸灯效果了。
二、实现原理
模拟人体呼吸,吸气和呼气各占1.5S,人眼的图像滞留时间0.04s(1/24帧画面)
按最快0.04s算,就是40ms。亮0.02S,灭0.02s,人眼看到的应该是一直亮(可以实验)
呼吸灯,就是改变这40ms中,亮和灭所占的百分比。
1500/40=38周期,40ms/37=1052us。38个周期变比中,每个周期增长1个单位1052us,38个周期刚好是40ms.这样达到全亮
亮的百分比多,人眼看到的就亮,反之就是暗。
经过测试:40ms周期,会有明显的闪烁。20ms闪烁现象不明显。
这种效果可以通过PWM来实现,通过调节PWM的占空比可以实现亮暗不同程度的变化。 也可以通过延时方法进行控制。
三、实现方法
实现方法1:电容充放电
电容是常用的储能元器件,通过电容的充放电可以实现呼吸灯。如下图所示:
上图中电阻R3和电容C2构成充电电路,电阻R4和电容C2构成放电电路。在开关K1闭合后,电池给电容C2充电,由于电阻R3起到了充电限流作用,使得C2充电缓慢,所以LED从灭到亮,C2从满电后LED达到最亮。当K1断开后,电容上的电通过R4和三极管构成放电回路,LED慢慢熄灭。从而实现呼吸灯。
实现方法2:555芯片
555芯片可是一个神器,这款芯片是迄今为止出货量做多的芯片,他的作用只有你想不到,而没有他做不到。看下面555产生方波的电路:
电池通过电阻R1,R2给电容C1充电,当电容上的电压达到2/3电源电压时,引脚3和7输出低电平,这时候电容C2放电,当电容上的电压减小到1/3电源电压时,引脚3输出高电平,引脚7输出高电平,电容再次充电。将引脚3输出的PWM接到LED灯上就可以实现呼吸灯,如下图所示:
实现方法3:单片机实现
void my_breathe_led_init() { gpio_set_func(GPIO_PC2,AS_GPIO); //设置为一般gpio gpio_set_input_en(GPIO_PC2,0); //disable输入 gpio_set_output_en(GPIO_PC2,1); //enable输出 gpio_write(GPIO_PC2,1); //输出高电平,点亮led }
//cycleTime_us-每个周期的时间长度, onTime_us-每个周期点亮的时间长度
void my_breathe_led_onoff( unsigned int cycleTime_us, unsigned int onTime_us )
{
gpio_write(GPIO_PC2,1);
sleep_us(onTime_us);
gpio_write(GPIO_PC2,0);
sleep_us(cycleTime_us-onTime_us);
}
int i = 0;
int breathe_in_time = 1500; //吸
int breathe_out_time = 1000; //呼
int cycle_time = 20; //ms, 每个周期的时间总长度 //40ms
int cycle = 0; int main (void) { my_breathe_led_init();
while(1)
{
cycle = breathe_in_time / cycle_time;
for( i=0;i<cycle; i++ )
my_breathe_led_onoff( cycle_time*1000, i*cycle_time*1000/cycle );
cycle = breathe_out_time / cycle_time;
for( i=cycle; i>1; i-- )
my_breathe_led_onoff( cycle_time*1000, i*cycle_time*1000/cycle );
}