Examples

呼吸灯

一、什么是呼吸灯

摘自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 );
    
    
}

 

 

 

 

 

 

 

posted on 2023-04-10 17:13  足各火丁  阅读(614)  评论(0编辑  收藏  举报

导航

Examples