一闪一闪亮晶晶的LED树
标签:LED digispark
nanhuo 发布于 2015-06-17 14:27
原文:http://www.instructables.com/id/LED-Tree-with-DigiSpark/?ALLSTEPS
作者:Amit_Jain
Step 1: 材料清单
元器件:
- 3mm黄色LED小灯 / 60个
- 5mm红色LED小灯 / 2个
- Digispark / 1个
- 4节的5号电池座 / 1个
- 镍氢充电电池 / 4节
- 5芯线 / 5米
- 塑料盘 / 1个
- 旧手机充电器 / 1个
- 开关 / 1个
- 按钮 / 1个
- PCB板 / 50mm*25mm
- 2N222 NPM晶体管 / 3个
- 1K欧电阻 / 3个
- 56欧电阻 / 30个
- 10K欧电阻 / 1个
- 金属线若干
工具:尖嘴钳、切线钳
其他:纸胶带、油漆、油漆刷
Step 2: 计算LED电阻
如上图。
基本参数:
- 源电压5V
- 二极管正向电压2V
- 二极管正向电流20mA
- 电路阵列中总共60个LED
计算的结果如下:
- 每个56欧姆电阻消耗功率为22.4mW
- 所有电阻加在一起消耗功率为672mW
- 二极管消耗功率为2400mW
- 总共消耗的功率为3072mW
- 流经电源的电流为600mA
所以这棵LED树需要5V电压/600mA电流。我准备把LED分成两组,每组30个。
Step 3: 电路
电路原理图如上。用到的元器件有:
- 2个2N222 NPN三极管
- 4节5号电池
- 把Attiny85的P0、P1、P4(分别对应电路图中pin5、pin6、pin3)三个管脚接到LED
- Attiny85 的P2 / Int0(对应电路图中pin7)管脚连到按钮
另外,原理图中1K欧姆的电阻用于晶体管反向电流保护。
PS:Attiiny85的管脚编号并不是和数字对应的,参见http://www.atmel.com/devices/attiny85.aspx?tab=documents
另外记得动手之前先在面包版上测试一下你的电路。
Step 4: 代码
我想要实现四种动画效果,动画每30S重复一次:
- 所有LED亮起,两个红色LED随PWM变暗;
- 所有LED随PWM变暗;
- 交替闪烁;
- 随PWM交替变暗
代码是用Digispark Arduino Studio 完成的。动画效果是用硬件中断实现的,但是没有施密特触发器,所以用debounce 和 attachinterrupt这种组合。代码如下:
// LED Tree fading using ATTINY85
// Effect 1 : All ON
// Effect 2 : All Fade (delay 30 ms for each step)
// Effect 3 : Two line Flikering gap 300 ms
// Effect 4 : Alternate Fading
// Effect 5 : Random
// Select by button
int led0 = 0; // the pin that the LED is attached to
int led1 = 1; // the pin that the LED is attached to
int led4 = 4; // Pin 4 is PWM as well For apples
int button = 2; // Pin for input : digital
int brightness = 0; // how bright the LED is
int fadeAmount = 5; // how many points to fade the LED by
int Flag = 1; // Flag to control which effect is called
// For debounce button
boolean lastButton = LOW;
boolean currentButton = LOW;
//----------------------------------------------------------------
// the setup routine runs once when you press reset:
// 100% Done
//----------------------------------------------------------------
void setup() {
// declare pin 0 and 1 to be an output:
pinMode(led0, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(button, INPUT);
// Hardware Interrupt on Physical pin 7, logical pin 2)
attachInterrupt(0, flag_interrupt, CHANGE);
}
boolean debounce(boolean last)
{
boolean current = digitalRead(button);
if (last != current)
{
delay(5);
current = digitalRead(button);
}
return current;
}
//----------------------------------------------------------------
// 100% Done
//----------------------------------------------------------------
void fade_led(int LED){
// change the brightness for next time through the loop:
for (brightness = 0; brightness <255; brightness++) {
analogWrite(LED, brightness);
brightness = brightness + fadeAmount -1 ;
delay(50);
}
for (brightness = 255; brightness >=0; brightness--) {
analogWrite(LED, brightness);
brightness = brightness - fadeAmount + 1 ;
delay(50);
}
}
//----------------------------------------------------------------
// Yellow led = On , Red = Fading
//----------------------------------------------------------------
void All_ON(){
digitalWrite(led0 , HIGH);
digitalWrite(led1, HIGH);
fade_led(led4);
}
//----------------------------------------------------------------
// Fade all LED : 100% Done
//----------------------------------------------------------------
void FADE_ALL() {
analogWrite(led4, 225);
for (brightness = 255; brightness >0; brightness--) {
analogWrite(led0, brightness);
analogWrite(led1, brightness);
brightness = brightness - fadeAmount +1 ;
delay(100);
}
for (brightness = 0; brightness <=255; brightness++) {
analogWrite(led0, brightness);
analogWrite(led1, brightness);
brightness = brightness + fadeAmount -1 ;
delay(100);
}
}
//----------------------------------------------------------------
// Alternative flickering for LEDS. Not Apples 100% Done
//----------------------------------------------------------------
void alternate_flickering(){
digitalWrite(led4, HIGH);
digitalWrite(led0 , HIGH);
digitalWrite(led1, LOW);
delay(200);
digitalWrite(led0 , LOW);
digitalWrite(led1, HIGH);
delay(200);
}
//----------------------------------------------------------------
// Alternate fading for yellow Leds and not for Apples : 100% Done
//----------------------------------------------------------------
void alternate_fading(){
analogWrite(led4, 225);
// analogWrite(led0, 0);
analogWrite(led1, 0);
fade_led(led0);
fade_led(led1);
}
//----------------------------------------------------------------
void ALL_LOOP() {
int i;// below is set for 30 secs
for (i = 0; i < 6; i++) { All_ON(); }
for (i = 0; i < 3; i++) { FADE_ALL(); }
for (i = 0; i < 75; i++) { alternate_flickering(); }
for (i = 0; i < 3; i++) { alternate_fading(); }
}
void flag_interrupt()
{
// read button, pressed set Flag++
currentButton = debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
{
Flag = Flag + 1;
}
lastButton = currentButton;
}
//----------------------------------------------------------------
// the loop routine runs over and over again forever:
void loop() {
if (Flag ==1) {
All_ON();
}
if (Flag==2) {
FADE_ALL();
}
if (Flag==3) {
alternate_flickering();
}
if (Flag==4) {
alternate_fading();
}
if (Flag==5) {
ALL_LOOP();
}
if (Flag > 4) {
Flag = 1;
}
}Step 5: 准备LED灯
这一步就是把LED和电阻焊接起来。把5芯线剥开,选择彩色的线连到LED阳极,白色的连阴极或者电阻,具体如下:
D1阳极接一根彩色导线;
D2阳极接到D1阴极;
D2阴极接白色导线;
做好隔离,有些容易短路的地方用热缩管包好。
一共30对这种LED-电阻对,慢慢焊吧。
Step 6: 做一棵铁丝树
树怎么做大家就自己发挥想象吧,反正就是用硬质线材做成树状的支撑体。
我这棵树做了5个大树枝,大树枝上再随机长些小树枝。做好后用油漆刷一下,比较不容易生锈。
底座用一个小塑料花盆和一个硬纸板搞定。
Step 7: LED树
把前面做好的LED绕在树枝上,可以用纸胶带在外面缠一圈,帮助固定,还容易上色。
所有阳极连接到电源(电池)正极。阴极的导线需要分成两束,分别是黄色LED和红色LED。
整理好导线,用硬纸板底座封好。封上之前先试一下LED灯都亮不亮,看看有没有哪儿没接好或者短路什么的。
然后就可以给树枝上色了,我选的是绿色和棕色。
Step 8: 准备电路板和塑料外壳
把需要的元件焊到PCB上。导线多选几种不同的颜色,方便后面出问题时定位。
用PVC热熔胶把开关、电源还有按钮固定在塑料小花盆上。
电池我用的是600mAh的普通电池,但是电耗的很快。你可以在电源电路中加个旁路,把充电器直接接到电路中。
Step 9: 充电器
正好手上有个不用的手机充电器,可以派上用场。
把usb接头剪掉,再焊个普通的电源接头上去,用来给我的LED树充电或者直接供电。
Step 10: 关掉屋子里的灯吧
关灯,开LED树。
一闪一闪,美美哒~
登录以发表评论
装饰家里既温馨又有意义!有空也要照着做一个!
晕,这么大一棵树,用600mAh的电池,一会儿就没电了吧?
好歹弄几颗18650,而且没有看到充电电路,如果直接用手机充电器5V的话,可能会把电池充爆……
哇噻,我想要
漂亮啊,泡妞利器!
阅读数: 8260