Difference between revisions of "ChristmasTree2012"
From Francois Louw
(Created page with "So for 2012 I dont want just any boring tree, I want to make one myself with a bunch of LEDs and a PIC that I have lying around! Here are the build steps with pictures, schem...") |
|||
Line 1: | Line 1: | ||
− | + | [[Projects|Back To All Projects Page]] | |
− | + | [[Main Page|Back To Main Page]] | |
− | + | __TOC__ | |
+ | ---- | ||
+ | So for 2012 I didn't want just any boring tree, I wanted to make one myself with a bunch of LEDs and a PIC that I had lying around! | ||
+ | |||
+ | Here are the results with video, pictures, schematics and code! | ||
+ | |||
+ | {{#ev:youtube|ShFkCYE7gvw}} | ||
+ | |||
+ | =Schematic= | ||
+ | |||
+ | [[File:tree-2012-schematic.jpg|500px]] | ||
+ | |||
+ | ''FIX: The MCLR resistor should pull up the MCLR pin, and the MCLR pin should be connected straight to the ICSP header'' | ||
+ | |||
+ | The MCLR resistor is 4.7K and the LED resistors will depend on your LEDs. Remember that there is a limit on the amount of current that the PIC can supply. I limited my 2V LEDs to 0.8mA by using 3.8K Resistors. The total current usage is 20mA when all the LEDs are on. Assuming the 9V battery has a 400mAh life then this will give me at least 20 hours. Realistically I should get 30+ hours. For timing I used a 10MHz crystal. | ||
+ | |||
+ | =Source Code= | ||
+ | |||
+ | The code was written in C using MPLAB 8.60 and the HiTech C Compiler. | ||
+ | |||
+ | Here's the source code | ||
+ | |||
+ | <source lang="c"> | ||
+ | #include <htc.h> | ||
+ | __CONFIG(HS & WDTDIS & PWRTDIS & BORDIS & LVPDIS & DEBUGEN); | ||
+ | |||
+ | #define LW RB0 | ||
+ | #define HR RB1 | ||
+ | #define LR RB2 | ||
+ | #define TR RB3 | ||
+ | #define MR RB4 | ||
+ | #define TW RB5 | ||
+ | #define MG RC0 | ||
+ | #define LG RC1 | ||
+ | #define HG RC2 | ||
+ | #define TG RC3 | ||
+ | #define HW RC6 | ||
+ | #define MW RC7 | ||
+ | #define HB RA0 | ||
+ | #define TB RA1 | ||
+ | #define MB RA2 | ||
+ | #define LB RA3 | ||
+ | |||
+ | #ifndef _XTAL_FREQ | ||
+ | #define _XTAL_FREQ 10000000 | ||
+ | #endif | ||
+ | |||
+ | void delay() | ||
+ | { | ||
+ | __delay_ms(500); | ||
+ | } | ||
+ | |||
+ | void all(int i) | ||
+ | { | ||
+ | LW = i; | ||
+ | MW = i; | ||
+ | HW = i; | ||
+ | TW = i; | ||
+ | |||
+ | LR = i; | ||
+ | MR = i; | ||
+ | HR = i; | ||
+ | TR = i; | ||
+ | |||
+ | LG = i; | ||
+ | MG = i; | ||
+ | HG = i; | ||
+ | TG = i; | ||
+ | |||
+ | LB = i; | ||
+ | MB = i; | ||
+ | HB = i; | ||
+ | TB = i; | ||
+ | |||
+ | } | ||
+ | |||
+ | void white(int i) | ||
+ | { | ||
+ | LW = i; | ||
+ | MW = i; | ||
+ | HW = i; | ||
+ | TW = i; | ||
+ | } | ||
+ | void red(int i) | ||
+ | { | ||
+ | LR = i; | ||
+ | MR = i; | ||
+ | HR = i; | ||
+ | TR = i; | ||
+ | } | ||
+ | void green(int i) | ||
+ | { | ||
+ | LG = i; | ||
+ | MG = i; | ||
+ | HG = i; | ||
+ | TG = i; | ||
+ | } | ||
+ | void blue(int i) | ||
+ | { | ||
+ | LB = i; | ||
+ | MB = i; | ||
+ | HB = i; | ||
+ | TB = i; | ||
+ | } | ||
+ | void low(int i) | ||
+ | { | ||
+ | LW = i; | ||
+ | LR = i; | ||
+ | LG = i; | ||
+ | LB = i; | ||
+ | } | ||
+ | void middle(int i) | ||
+ | { | ||
+ | MW = i; | ||
+ | MR = i; | ||
+ | MG = i; | ||
+ | MB = i; | ||
+ | } | ||
+ | void high(int i) | ||
+ | { | ||
+ | HW = i; | ||
+ | HR = i; | ||
+ | HG = i; | ||
+ | HB = i; | ||
+ | } | ||
+ | void top(int i) | ||
+ | { | ||
+ | TW = i; | ||
+ | TR = i; | ||
+ | TG = i; | ||
+ | TB = i; | ||
+ | } | ||
+ | void north(int i) | ||
+ | { | ||
+ | LB = i; | ||
+ | MG = i; | ||
+ | HW = i; | ||
+ | TR = i; | ||
+ | } | ||
+ | void east(int i) | ||
+ | { | ||
+ | LG = i; | ||
+ | MW = i; | ||
+ | HR = i; | ||
+ | TB = i; | ||
+ | } | ||
+ | void south(int i) | ||
+ | { | ||
+ | LW = i; | ||
+ | MR = i; | ||
+ | HB = i; | ||
+ | TG = i; | ||
+ | } | ||
+ | void west(int i) | ||
+ | { | ||
+ | LR = i; | ||
+ | MB = i; | ||
+ | HG = i; | ||
+ | TW = i; | ||
+ | } | ||
+ | |||
+ | void spiralbottom(int i) | ||
+ | { | ||
+ | LW = i; | ||
+ | delay(); | ||
+ | MW = i; | ||
+ | delay(); | ||
+ | HW = i; | ||
+ | delay(); | ||
+ | TW = i; | ||
+ | delay(); | ||
+ | |||
+ | LR = i; | ||
+ | delay(); | ||
+ | MR = i; | ||
+ | delay(); | ||
+ | HR = i; | ||
+ | delay(); | ||
+ | TR = i; | ||
+ | delay(); | ||
+ | |||
+ | LG = i; | ||
+ | delay(); | ||
+ | MG = i; | ||
+ | delay(); | ||
+ | HG = i; | ||
+ | delay(); | ||
+ | TG = i; | ||
+ | delay(); | ||
+ | |||
+ | LB = i; | ||
+ | delay(); | ||
+ | MB = i; | ||
+ | delay(); | ||
+ | HB = i; | ||
+ | delay(); | ||
+ | TB = i; | ||
+ | delay(); | ||
+ | } | ||
+ | |||
+ | void main(void) | ||
+ | { | ||
+ | OPTION = 0; | ||
+ | GIE = 0; | ||
+ | |||
+ | TMR1ON = 0; | ||
+ | TMR2ON = 0; | ||
+ | |||
+ | SSPEN = 0; | ||
+ | SPEN = 0; | ||
+ | SREN = 0; | ||
+ | CREN = 0; | ||
+ | ADDEN = 0; | ||
+ | |||
+ | |||
+ | //set ports and timers | ||
+ | TRISA0 = 0; | ||
+ | TRISA1 = 0; | ||
+ | TRISA2 = 0; | ||
+ | TRISA3 = 0; | ||
+ | TRISA4 = 1; | ||
+ | TRISA5 = 0; | ||
+ | |||
+ | TRISB0 = 0; | ||
+ | TRISB1 = 0; | ||
+ | TRISB2 = 0; | ||
+ | TRISB3 = 0; | ||
+ | TRISB4 = 0; | ||
+ | TRISB5 = 0; | ||
+ | |||
+ | TRISC0 = 0; | ||
+ | TRISC1 = 0; | ||
+ | TRISC2 = 0; | ||
+ | TRISC3 = 0; | ||
+ | TRISC4 = 0; | ||
+ | TRISC5 = 0; | ||
+ | TRISC6 = 0; | ||
+ | TRISC7 = 0; | ||
+ | |||
+ | //disable A/D | ||
+ | ADON = 0; | ||
+ | //all digital | ||
+ | PCFG3 = 0;//no ref | ||
+ | PCFG2 = 1; | ||
+ | PCFG1 = 1; | ||
+ | PCFG0 = 0;//no care | ||
+ | |||
+ | //diable capture compare | ||
+ | CCP1CON = 0; | ||
+ | CCP2CON = 0; | ||
+ | |||
+ | all(0); | ||
+ | |||
+ | while(1) | ||
+ | { | ||
+ | //flash all | ||
+ | all(1); | ||
+ | delay(); | ||
+ | all(0); | ||
+ | delay(); | ||
+ | all(1); | ||
+ | delay(); | ||
+ | all(0); | ||
+ | delay(); | ||
+ | all(1); | ||
+ | delay(); | ||
+ | all(0); | ||
+ | delay(); | ||
+ | all(1); | ||
+ | delay(); | ||
+ | all(0); | ||
+ | delay(); | ||
+ | all(1); | ||
+ | delay(); | ||
+ | all(0); | ||
+ | delay(); | ||
+ | |||
+ | //colours | ||
+ | white(1); | ||
+ | delay(); | ||
+ | white(0); | ||
+ | red(1); | ||
+ | delay(); | ||
+ | red(0); | ||
+ | green(1); | ||
+ | delay(); | ||
+ | green(0); | ||
+ | blue(1); | ||
+ | delay(); | ||
+ | blue(0); | ||
+ | delay(); | ||
+ | |||
+ | //reset | ||
+ | all(0); | ||
+ | |||
+ | //bottom to top | ||
+ | low(1); | ||
+ | delay(); | ||
+ | middle(1); | ||
+ | delay(); | ||
+ | high(1); | ||
+ | delay(); | ||
+ | top(1); | ||
+ | delay(); | ||
+ | |||
+ | //top to bottom | ||
+ | top(0); | ||
+ | delay(); | ||
+ | high(0); | ||
+ | delay(); | ||
+ | middle(0); | ||
+ | delay(); | ||
+ | low(0); | ||
+ | delay(); | ||
+ | |||
+ | //side to side circle on | ||
+ | north(1); | ||
+ | delay(); | ||
+ | east(1); | ||
+ | delay(); | ||
+ | south(1); | ||
+ | delay(); | ||
+ | west(1); | ||
+ | delay(); | ||
+ | //side to side circle off | ||
+ | north(0); | ||
+ | delay(); | ||
+ | east(0); | ||
+ | delay(); | ||
+ | south(0); | ||
+ | delay(); | ||
+ | west(0); | ||
+ | delay(); | ||
+ | |||
+ | //spiral colours up | ||
+ | spiralbottom(1); | ||
+ | spiralbottom(0); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </source> | ||
+ | |||
+ | =Result= | ||
+ | |||
+ | Here are pictures of the final result (ignore the quality of the makeshift wire tree) | ||
+ | |||
+ | [[File:tree-2012-1.jpg|500px]] | ||
+ | |||
+ | [[File:tree-2012-2.jpg|500px]] | ||
+ | |||
+ | =Copyright= | ||
+ | |||
+ | Everything here is under [[Gplv3|GPL 3.0]]. | ||
+ | |||
+ | If you use this to make your own project email me and link to my site. | ||
+ | my email is francois.louw@(this-domain) |