#include <avr/pgmspace.h>
#define kat1 13 // kata ist Basis des Transistors für Ebene a (unten) katg Basis Ebene oben
#define kat2 12
#define kat3 11
#define kat4 10
#define kat5 9
#define kat6 8
#define kat7 7
#define ser 3// serielle Datenkabel
#define sck 4 // Serielle Clock
#define rck 5 // Clock zum Schiebens ins Ausgangsregister
#define flacker 1500
int time;
boolean animation=0;
int Animation[]={
27,33,7,34,40,7,41,54,14,55,68,14};
int E1 [7];
int E2 [7];
int E3 [7];
int E4 [7];
int E5 [7];
int E6 [7];
int E7 [7];
int i=0;
unsigned int platz;
int maxbild=68;
int empfangen = 0;
unsigned long Tempo;
unsigned long Tempo2;
int neu=0;
int maxlaenge =1000;
int laenge=0;
int laengenanzeige;
int laengenanzeige2;
unsigned char Position[100];
unsigned char Position2[1000
];
prog_uchar PROGMEM data[]={
// Blank
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000,
B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, //0
};
void setup(){
for (int i = 0; i <20; i++)
{
pinMode(i, OUTPUT);
digitalWrite(i,0);
}
Serial.begin(9600);
}
void loop()
{
recieve();
for(int i=0;i<laengenanzeige;i++){
Serial.print(Position[i],DEC);
Serial.print(",");
}
Serial.println(" ");
Serial.println(laengenanzeige,DEC);
Serial.println(animation,DEC);
main_prog:
if(animation==1)
{
umwandeln();
}
{
for (int i =0; i<laengenanzeige; i++)
{
platz=Position[i];
info();
for(int j=0; j<20;j++)
{
shift();
}
delay(50);
}
}
Tempo2=millis();
do{
if(Serial.read()==35)
{
recieve();
}
}
while((millis()-Tempo2) < 4000);
goto main_prog;
}
void info ()
{
for( int h = 0; h<8; h++){
E1[h] = pgm_read_byte_near((platz*49)+data+h);
}
for( int h = 0; h<8; h++){
E2[h] = pgm_read_byte_near((platz*49)+data+7+h);
}
for( int h = 0; h<8; h++){
E3[h] = pgm_read_byte_near((platz*49)+data+14+h);
}
for( int h = 0; h<8; h++){
E4[h] = pgm_read_byte_near((platz*49)+data+21+h);
}
for( int h = 0; h<8; h++){
E5[h] = pgm_read_byte_near((platz*49)+data+28+h);
}
for( int h = 0; h<8; h++){
E6[h] = pgm_read_byte_near((platz*49)+data+35+h);
}
for( int h = 0; h<8; h++){
E7[h] = pgm_read_byte_near((platz*49)+data+42+h);
}
}
void shift () // ins Shiftregister reinschieben
{
for (int f = 7 ;f > -1; f--) //zähler der einzelnen B000 teile einer ebene
{
shiftOut (ser,sck,LSBFIRST,E7[f]);
} // schriebt ein B0000 info raus. Die letzte mit LSB zuerst
digitalWrite(rck,1);
delayMicroseconds(1);
digitalWrite(rck,0);
digitalWrite(kat1, HIGH);
delayMicroseconds(flacker);
digitalWrite(kat1 , LOW);
for (int f = 7 ;f > -1; f--) //zähler der einzelnen B000 teile einer ebene
{
shiftOut (ser,sck,LSBFIRST,E6[f]);
} // schriebt ein B0000 info raus. Die letzte mit LSB zuerst
digitalWrite(rck,1);
delayMicroseconds(1);
digitalWrite(rck,0);
digitalWrite(kat2, HIGH);
delayMicroseconds(flacker);
digitalWrite(kat2 , LOW);
for (int f = 7 ;f > -1; f--) //zähler der einzelnen B000 teile einer ebene
{
shiftOut (ser,sck,LSBFIRST,E5[f]);
} // schriebt ein B0000 info raus. Die letzte mit LSB zuerst
digitalWrite(rck,1);
delayMicroseconds(1);
digitalWrite(rck,0);
digitalWrite(kat3, HIGH);
delayMicroseconds(flacker);
digitalWrite(kat3 , LOW);
for (int f = 7 ;f > -1; f--) //zähler der einzelnen B000 teile einer ebene
{
shiftOut (ser,sck,LSBFIRST,E4[f]);
} // schriebt ein B0000 info raus. Die letzte mit LSB zuerst
digitalWrite(rck,1);
delayMicroseconds(1);
digitalWrite(rck,0);
digitalWrite(kat4, HIGH);
delayMicroseconds(flacker);
digitalWrite(kat4 , LOW);
for (int f = 7 ;f > -1; f--) //zähler der einzelnen B000 teile einer ebene
{
shiftOut (ser,sck,LSBFIRST,E3[f]);
} // schriebt ein B0000 info raus. Die letzte mit LSB zuerst
digitalWrite(rck,1);
delayMicroseconds(1);
digitalWrite(rck,0);
digitalWrite(kat5, HIGH);
delayMicroseconds(flacker);
digitalWrite(kat5 , LOW);
for (int f = 7 ;f > -1; f--) //zähler der einzelnen B000 teile einer ebene
{
shiftOut (ser,sck,LSBFIRST,E2[f]);
}// schriebt ein B0000 info raus. Die letzte mit LSB zuerst
digitalWrite(rck,1);
delayMicroseconds(1);
digitalWrite(rck,0);
digitalWrite(kat6, HIGH);
delayMicroseconds(flacker);
digitalWrite(kat6 , LOW);
for (int f = 7 ;f > -1; f--) //zähler der einzelnen B000 teile einer ebene
{
shiftOut (ser,sck,LSBFIRST,E1[f]);
}// schriebt ein B0000 info raus. Die letzte mit LSB zuerst
digitalWrite(rck,1);
delayMicroseconds(1);
digitalWrite(rck,0);
digitalWrite(kat7, HIGH);
delayMicroseconds(flacker);
digitalWrite(kat7 , LOW);
}
void umwandeln()
{
laengenanzeige2=0;
for (int i=0; i<laengenanzeige; i++)
{
if (Position[i]==1){
for (int n=0; n<7; n++){
Position2[laengenanzeige2+n]=27+n;
}
laengenanzeige2=laengenanzeige2+7;
}
if (Position[i]==2){
for (int n=0; n<7; n++){
Position2[laengenanzeige2+n]=34+n;
}
laengenanzeige2=laengenanzeige2+7;
}
if (Position[i]==3){
for (int n=0; n<15; n++){
Position2[laengenanzeige2+n]=41+n;
}
laengenanzeige2=laengenanzeige2+14;
}
if (Position[i]==4){
for (int n=0; n<15; n++){
Position2[laengenanzeige2
+n]=55+n;
}
laengenanzeige2=laengenanzeige2+14;
}
}
Serial.println("umwandeln");
{
for(int i=0;i<laengenanzeige2;i++){
Serial.print(Position2[i],DEC);
Serial.print(",");
}
}
}
void recieve()
{
if (empfangen ==0)
{
Serial.flush();
do { // Zeichen von serieller Schnittstelle empfangen
if (Serial.available()) {
Position[laenge] = Serial.read();
if (Position[laenge] == 32) Position[laenge]=0;
if (Position[laenge] >64 && Position[laenge]<91) {
Position[laenge] = Position[laenge]-64;
}
if (Position[laenge] >96 && Position[laenge]<123) {
Position[laenge] = Position[laenge]-96;
}
animation=0;
laenge++;
neu=1;
empfangen =1;
laengenanzeige=laenge;
}
//else goto main_prog;
if(laenge<1)Tempo = millis();
}
while (laenge<maxlaenge && (millis()-Tempo) < 4000);
laenge=0;
if(Position[laengenanzeige-1]==35)
{
animation=1;
laengenanzeige=laengenanzeige-1;
}
if(neu==1){
for(int i=0;i<laengenanzeige;i++){
Serial.print(Position[i],DEC);
Serial.print(",");
}
}
Serial.println(" ");
Serial.println(laengenanzeige,DEC);
Serial.println(animation,DEC);
neu=0;
Tempo=0;
empfangen=0;
Serial.flush();
}
delay(20);
}
ich habe mir mal erlaubt den progmem zu kürzen.
ich habe mal die beiden arrays verkleinert. Das war wirklich weil der Ram zu voll war.Dankescön an denjenigen, der mir den Tipp gegeben hat. und für die Leute die den Code haben wollten.
Im progmem sind die einzelnen bilder für meinen LED Würfel gespeichert. In Position ist der Platz gespeichert, an dem ich das bild im progmem gespeichert habe.
in info hole ich die bilder in die arrays für die ebenen, in shift schiebe ich die informationen in die schieberegister.
jetzt wirds interessant. In recieve hole ich mir die Buchstaben oder animation. ich habe dort das so gedreht, dass A und a in 1 umgewandelt werden, b und B in 2 usw. (siehe ASCII Tabelle) im loop habe ich eingebaut, dass nachdem alle bilder angezeigt wurden gecheckt wird, ob ich ein # zeichen eingesendet habe. wenn ja, wird erneut die funktion recieve aktiviert.
Wenn ich ne animation starten will, dann schreibe ich den buchstaben der animation(animation 1 ist a; animation 2 ist b) und am ende ein #. dann soll der obengenennte code" umwandeln()" die buchstaben der animation in die einzelbilder der animation zerlegen. Also animation a hat die einzelbilder 27-33 usw.
ES TUT MIR ÜBERIGENS LEID, DASS ICH EUCH NICHT SOFORT DEN CODE GESENDEHABE, ABER ICH HATTE FREITAG ABEND WAS ANDERS VOR.