XmasTree 2nd Edition erweitert den XmasTree mit einem MAXIM7219. Damit ist es möglich die Helligkeit der LEDs zu steuern.
Schaltplan
Platine
Bilder
Sourcecode
Das LED-Muster ist wie folgt aufgebaut
B11111111, B11111111, B11111111, B11111111, B1, 10, 0, 15,
- B11111111: LEDs auf Ebene 1
- B11111111: LEDs auf Ebene 2
- B11111111: LEDs auf Ebene 3
- B11111111: LEDs auf Ebene 4
- B1 : oberste LED
- 10 : Dauer der Anzeige in ms
- 0 : Helligkeit der LED am Anfang
- 15 : Helligkeit der LED am Ende
include <avr/pgmspace.h> // allows use of PROGMEM to store patterns in flash
include "LedControl.h"
define COLUMN 8
define PLANE 5
define TIMECONST 80 // multiplies DisplayTime to get ms
LedControl lc=LedControl(12, 11, 10, 1);
// LED Pattern Table in PROGMEM - last column is display time in 100ms units prog_uchar PROGMEM PatternTable[] = { // blink on and off B11111111, B11111111, B11111111, B11111111, B1, 10, 0, 15, B11111111, B11111111, B11111111, B11111111, B1, 2, 15, 15, B11111111, B11111111, B11111111, B11111111, B1, 15, 15, 0, B00000000, B00000000, B00000000, B00000000, B0, 5, 0, 0, B11111111, B11111111, B11111111, B11111111, B1, 10, 0, 15, B11111111, B11111111, B11111111, B11111111, B1, 2, 15, 15, B11111111, B11111111, B11111111, B11111111, B1, 15, 15, 0, B00000000, B00000000, B00000000, B00000000, B0, 10, 0, 0, // flash each LED in sequence B10000000, B00000000, B00000000, B00000000, B0, 1, 0, 0, B01000000, B00000000, B00000000, B00000000, B0, 1, 0, 0, B00100000, B00000000, B00000000, B00000000, B0, 1, 1, 1, B00010000, B00000000, B00000000, B00000000, B0, 1, 1, 1, B00001000, B00000000, B00000000, B00000000, B0, 1, 2, 2, B00000100, B00000000, B00000000, B00000000, B0, 1, 2, 2, B00000010, B00000000, B00000000, B00000000, B0, 1, 3, 3, B00000001, B00000000, B00000000, B00000000, B0, 1, 3, 3, B00000000, B10000000, B00000000, B00000000, B0, 1, 4, 4, B00000000, B01000000, B00000000, B00000000, B0, 1, 4, 4, B00000000, B00100000, B00000000, B00000000, B0, 1, 5, 5, B00000000, B00010000, B00000000, B00000000, B0, 1, 5, 5, B00000000, B00001000, B00000000, B00000000, B0, 1, 6, 6, B00000000, B00000100, B00000000, B00000000, B0, 1, 6, 6, B00000000, B00000010, B00000000, B00000000, B0, 1, 7, 7, B00000000, B00000001, B00000000, B00000000, B0, 1, 7, 7, B00000000, B00000000, B10000000, B00000000, B0, 1, 8, 8, B00000000, B00000000, B01000000, B00000000, B0, 1, 8, 8, B00000000, B00000000, B00100000, B00000000, B0, 1, 9, 9, B00000000, B00000000, B00010000, B00000000, B0, 1, 9, 9, B00000000, B00000000, B00001000, B00000000, B0, 1, 10, 10, B00000000, B00000000, B00000100, B00000000, B0, 1, 10, 10, B00000000, B00000000, B00000010, B00000000, B0, 1, 11, 11, B00000000, B00000000, B00000001, B00000000, B0, 1, 11, 11, B00000000, B00000000, B00000000, B10000000, B0, 1, 12, 12, B00000000, B00000000, B00000000, B01000000, B0, 1, 12, 12, B00000000, B00000000, B00000000, B00100000, B0, 1, 13, 13, B00000000, B00000000, B00000000, B00010000, B0, 1, 13, 13, B00000000, B00000000, B00000000, B00001000, B0, 1, 14, 14, B00000000, B00000000, B00000000, B00000100, B0, 1, 14, 14, B00000000, B00000000, B00000000, B00000010, B0, 1, 15, 15, B00000000, B00000000, B00000000, B00000000, B1, 10, 15, 15, B00000000, B00000000, B00000000, B00000000, B1, 10, 15, 0, // this is a dummy element for end of table (duration=0) B00000000, B00000000, B00000000, B00000000, B0, 0, 8, 8 };
// initialization void setup() {
Serial.begin(9600);
/*
The MAX72XX is in power-saving mode on startup,
we have to do a wakeup call
*/
lc.shutdown(0,false);
/* Set the brightness to a medium values */
lc.setIntensity(0,8);
/* and clear the display */
lc.clearDisplay(0);
}
// display pattern in table until DisplayTime is zero (then repeat) void loop() { // declare variables byte PatternBuf[PLANE]; // saves current pattern from PatternTable int PatternIdx; byte DisplayTime; // time*100ms to display pattern unsigned long EndTime; int patbufidx; // indexes which byte from pattern buffer
int intStart;
int intEnd;
// Initialize PatternIdx to beginning of pattern table PatternIdx = 0; // loop over entries in pattern table - while DisplayTime>0 do { // read pattern from PROGMEM and save in array memcpy_P( PatternBuf, PatternTable+PatternIdx, PLANE ); PatternIdx += PLANE; // read DisplayTime from PROGMEM and increment index DisplayTime = pgm_read_byte_near( PatternTable + PatternIdx++ );
intStart = pgm_read_byte_near( PatternTable + PatternIdx++ );
intEnd = pgm_read_byte_near( PatternTable + PatternIdx++ );
// loop while DisplayTime>0 and current time < EndTime patbufidx = 0; // reset index counter to beginning of buffer // loop over planes for (int plane=0; plane<PLANE; plane++)
{
// load current plane pattern data into ports
if (plane==PLANE-1)
{
lc.setLed(0, PLANE-1, 0, PatternBuf[plane] );
}
else
{
for (int ledpin=0; ledpin<COLUMN; ledpin++)
{
lc.setLed(0, plane, ledpin, PatternBuf[plane] & (1 << ledpin) ); } // for
} // else if
} // for
if (intStart == intEnd)
{
lc.setIntensity(0, intStart);
delay(TIMECONST * (unsigned long)DisplayTime);
}
else
if (intStart > intEnd)
{
for(int i=intStart; i>=intEnd; i--)
{
lc.setIntensity(0, i);
delay((unsigned long)(TIMECONST * (unsigned long)DisplayTime) / (unsigned long)(intStart - intEnd));
}
}
else
{
for(int i=intStart; i<intEnd; i++)
{
lc.setIntensity(0, i);
delay((unsigned long)(TIMECONST * (unsigned long)DisplayTime) / (unsigned long)(intEnd - intStart));
}
}
} while (DisplayTime > 0); // read patterns until time=0 which signals end
}
Video







