07-01-2018, 11:22
Witam w Nowym Roku i wszystkiego dobrego ....
Zrobiłem konstrukcję ze strony "http://v3-1255.vlinux.de/mediawiki/index.php/Xmastree" wgrałem kod (arduino uno) i zero animacji , świecą się wszystkie led z podwójnym 300milisek mrugnięciem ....
w linijce kodu " prog_uchart PROGMEM ..." zamieniłem na "const char PROGMEM...."
nie wiem co dalej.... zaznaczam , że sam kod jest dla mnie dość skomplikowany, proszę o jakieś wskazówki .
Pozdrawiam
Zrobiłem konstrukcję ze strony "http://v3-1255.vlinux.de/mediawiki/index.php/Xmastree" wgrałem kod (arduino uno) i zero animacji , świecą się wszystkie led z podwójnym 300milisek mrugnięciem ....
w linijce kodu " prog_uchart PROGMEM ..." zamieniłem na "const char PROGMEM...."
nie wiem co dalej.... zaznaczam , że sam kod jest dla mnie dość skomplikowany, proszę o jakieś wskazówki .
Pozdrawiam
Kod:
#include <avr/pgmspace.h>
#define COLUMN 8 // definicja kolumn
#define PLANE 5 // definicja poziomów
#define PLANETIME 3333 // Anzeigedauer einer Ebene
#define TIMECONST 15 // Mnożnik dla wyświetlania czasu trwania obrazu (33 diody LED)
// LED Muster: Jedna linia składa się z 5 poziomów z 8 diodami LED (z wyjątkiem poziomu 5 z jedną diodą LED) i czasem wyświetlania
prog_uchar PROGMEM PatternTable[] = {
B11111111, B11111111, B11111111, B11111111, B1, 5, // Wszystkie diody LED są włączone
B00000000, B00000000, B00000000, B00000000, B0, 1, // Wszystkie diody LED są wyłączone
B11111111, B11111111, B11111111, B11111111, B1, 5,
B00000000, B00000000, B00000000, B00000000, B0, 10,
// Przy czasie wyświetlania 0 pętla kończy się
B00000000, B00000000, B00000000, B00000000, B0, 0
};
// Definiowanie pinów dla poziomów i kolumn (w zależności od sposobu lutowania)
int LedPin[] = {7, 8, 6, 9, 10, 11, 12, 5};
int PlanePin[] = {18, 17, 16, 15, 14};
void setup()
{
int pin;
// Pins als OUTPUT initialiseren
for (pin=0; pin<COLUMN; pin++) {
pinMode( LedPin[pin], OUTPUT );
}
for (pin=0; pin<PLANE; pin++) {
pinMode( PlanePin[pin], OUTPUT );
}
}
void loop()
{
byte PatternBuf[PLANE]; // zapisuje linię wzorów LED
int PatternIdx;
byte DisplayTime;
unsigned long EndTime;
int plane;
int patbufidx;
int ledpin;
// Index in LED Muster setzen
PatternIdx = 0;
// Wiederholen solange Anzeigedauer > 0
do {
// Zeile aus LED Muster lesen
memcpy_P( PatternBuf, PatternTable+PatternIdx, PLANE );
PatternIdx += PLANE;
// Anzeigedauer lesen
DisplayTime = pgm_read_byte_near( PatternTable + PatternIdx++ );
// Anzeigedauer für Bild berechnen
EndTime = millis() + ((unsigned long) DisplayTime) * TIMECONST;
// Zbuduj diody LED poziomów jeszcze raz i dłużej, o ile czas wyświetlania obrazu nie został jeszcze osiągnięty
while ( millis() < EndTime ) {
patbufidx = 0; // Am Anfang der Zeile beginnen
// Schleife über Ebenen
for (plane=0; plane<PLANE; plane++) {
// vorherige Ebene ausschalten
if (plane==0) {
digitalWrite( PlanePin[PLANE-1], HIGH );
} else {
digitalWrite( PlanePin[plane-1], HIGH );
}
// Spalten der aktuelle Ebene setzen
// Ebene 5 gesondert behandeln, da nur eine LED
if (plane==PLANE-1) {
digitalWrite( LedPin[0], PatternBuf[plane] );
} else {
// Einzelne Spalten setzen
for (ledpin=0; ledpin<COLUMN; ledpin++) {
// Bitoperation zur Ermittlung der einzelnen Bitwerte
// Beispiel:
// LED Zeile & ledpin (left shift (<<) schiebt ledpin um 1 nach rechts)
// B01010000 & B10000000 = 0 (LED leuchtet nicht)
// B01010000 & B01000000 = 1 (LED leuchtet)
// B01010000 & B00100000 = 0 (LED leuchtet nicht)
digitalWrite( LedPin[ledpin], PatternBuf[plane] & (1 << ledpin) );
}
}
// aktuelle Ebene aktivieren
digitalWrite( PlanePin[plane], LOW );
// Anzeigedauer für Ebene
delayMicroseconds( PLANETIME );
}
}
} while (DisplayTime > 0);
}