Arduino LED-Reihe

Hallo,

Ich habe vor einigen Wochen mein Projekt die LED Reihe angefangen und habe dabei ein kleines Problem.
Das Programm beinhaltet 4 Muster, die durch einen Knopf geändert werden können. Außerdem kann man mit einem Potentiometer die Geschwindigkeit verändern.
Wenn ich das Programm ausführe funktioniert noch alles super, aber wenn ich beim 4. Muster angelange, ändert sich nach einpaar mal ausführen die Variable, welche bestimmt, welches Muster erscheint. Wenn ich diese Variable durch einen Serial print am PC ausgebe, funktioniert das Programm einwandfrei, aber wenn ich den Part mit dem Ausgeben der Variable weglösche, hat es wieder den gleichen Fehler wie davor.

Das Programm, sowie der Schaltungsaufbau sind unten verlinkt.

char led[]={1,2,3,4,5,6,7,8,9,10,11,12,13}, z[12];
int b,i,v,x,y,t=100;
int muster=1;
int pot = A1;
const int buttonp = A3;
long currentmillis=0;
long previousmillis=0;
boolean buttonbackup=false;




int button(int ti)
{
 boolean input;
 boolean buttondown = false;

 
 currentmillis=millis();
 previousmillis=currentmillis;

 while(currentmillis - previousmillis < ti/10)
 {
   input =digitalRead(buttonp);
   if(input==HIGH & buttonbackup==false)
   {
     buttonbackup = true;
     muster++;
     if(muster>4) muster=muster-4;
     
     
   }
   else if(input==LOW & buttonbackup==true)
   {
     buttonbackup=false;
   }
   //Serial.println(muster);
   ti= analogRead(pot);
   currentmillis=millis();
 }
/* if(buttondown==true)
 {
   muster++;
   if(muster>3) muster=muster-3;
   Serial.prvoidln(muster);
   
 }*/
}

void up()
{
 for(i=0;i<=12;i++)
 {
   digitalWrite(led[i],HIGH);
   button(50);
   if(buttonbackup==true) break;
 }
}

void down()
{
   for(i=12;i>=0;i--)
 {
   if(buttonbackup==true) break;
   digitalWrite(led[i],LOW);
   button(50);
 }
}

void stack()
{
 x=12;
 y=12;
 for(v=0;v<=y;v++)
 {
   if(buttonbackup==true) break;
   for(i=0;i<=x;i++)
   {
     if(buttonbackup==true) break;
     digitalWrite(led[i], HIGH);
     button(100);
     if(i==x) x--;
     else digitalWrite(led[i], LOW);      
   }
 }
}


void ausbreitung()
{
 if(buttonbackup==true) return;
 digitalWrite(led[6], HIGH);
 button(100);
 for(i=1;i<=6;i++)
 {
   digitalWrite(led[6+i], HIGH);
   digitalWrite(led[6-i], HIGH);
   button(100);
   if(buttonbackup==true) break;
 }
 
}

void ausbreitung2()
{
 if(buttonbackup==true) return;
 digitalWrite(led[6], HIGH);
 button(100);
 for(i=1;i<=6;i++)
 {
   if(buttonbackup==true) break;
   digitalWrite(led[6+i], HIGH);
   digitalWrite(led[6-i], HIGH);
   if(i==2) digitalWrite(led[6], LOW);
   digitalWrite(led[6+i-1], LOW);
   digitalWrite(led[6-i+1], LOW);
   button(100);
   if(buttonbackup==true) break;
   
 }
}

void einzug()
{
 for(i=6;i>0;i--)
 {
   if(buttonbackup==true) break;
   digitalWrite(led[6+i], HIGH);
   digitalWrite(led[6-i], HIGH);
   button(100);
 }
 if(buttonbackup==true) return;
 digitalWrite(led[6], HIGH);
 button(100);
}

void einzug2()
{

 for(i=6;i>0;i--)
 {
   if(buttonbackup==true) break;
   digitalWrite(led[6+i], HIGH);
   digitalWrite(led[6-i], HIGH);
   digitalWrite(led[6+i+1], LOW);
   digitalWrite(led[6-i-1], LOW);
   button(100);
   if(i==1) 
   {
     digitalWrite(led[6+i], LOW);
     digitalWrite(led[6-i], LOW);
   }
   
   
 }
 if(buttonbackup==true) return;
 digitalWrite(led[6], HIGH);
 button(100);
}

void knightrider()
{
 for(i=0;i<13;i++)
 {
   digitalWrite(led[i],HIGH);
   button(100);
   digitalWrite(led[i+1],HIGH);
   button(100);
   if(buttonbackup==true) break;
   if(i>0) digitalWrite(led[i-1],HIGH);
   button(100);
   digitalWrite(led[i+2],HIGH);
   digitalWrite(led[i-1],LOW);
 }

 for(i=12;i>=0;i--)
 {
   digitalWrite(led[i],HIGH);
   button(100);
   digitalWrite(led[i-1],HIGH);
   button(100);
   if(buttonbackup==true) break;
   if(i<12) digitalWrite(led[i+1],HIGH);
   button(100);
   digitalWrite(led[i-2],HIGH);
   digitalWrite(led[i+1],LOW);    
 }
}


void ende()
{
 for(i=0;i<=12;i++)
 {
   digitalWrite(led[i], LOW);
 }
 button(500);
}

void setup() {
 for(i=0;i<=12;i++)
 {
 pinMode(led[i], OUTPUT);
 }
 pinMode(button, INPUT);
// Serial.begin(9600);

}

void loop() {
 // put your main code here, to run repeatedly:

//if(muster>4) muster=muster-4;
 switch(muster)
 {
 case 1: 
     up();
     down();
     ende();
     break;
 case 2:
     stack();
     ende();
     break;
 case 3:
     ausbreitung2();
     einzug();
     einzug2();
     ausbreitung();
     ende();
     break;
  case 4:
     knightrider();
     ende();
     break;
 }
//if(muster>4) muster=muster-4;



}

Ich würde mich freuen, wenn mir wer dabei helfen könnte!

Danke

LED-Reihe.ino (3.88 KB)

Ich würde mich freuen, wenn mir wer dabei helfen könnte!

Gern.

Du hast nur 12 Elemente im Array, sprichst aber 13 an. EDIT: stimmt nicht, es sind 13 Elemete Das Nachfolgen stimmt dann natürlich auch nicht.

Kein Wunder, dass das Scherben gibt, würde ich mal sagen.

(den Rest habe ich dann gar nicht mehr geprüft)

combie: Gern.

Du hast nur 12 Elemente im Array, sprichst aber 13 an. Kein Wunder, dass das Scherben gibt, würde ich mal sagen.

(den Rest habe ich dann gar nicht mehr geprüft)

Die Variable z[12] kommt gar nicht zum Einsatz, die habe ich vergessen wegzulöschen

Du hast nur 12 Elemente im Array, sprichst aber 13 an. EDIT: stimmt nicht, es sind 13

Korrektur: Du sprichst 14 Arrayelemente an. EDIT: das stimmt wiederrum, und ist auch ein Fehler

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).

Gruß Tommy

wo spreche ich 14 Elemente an?

  for(i=12;i>=0;i--)
  {
    digitalWrite(led[i],HIGH); // <<<<< ---- hier Element 0 bis 12,
    button(100);
    digitalWrite(led[i-1],HIGH);
    button(100);
    if(buttonbackup==true) break;
    if(i<12) digitalWrite(led[i+1],HIGH);
    button(100);
    digitalWrite(led[i-2],HIGH);
    digitalWrite(led[i+1],LOW);    // <<<<< ---- hier Element 1 bis 13,
  }

macht in der Summe 14 Stück

Gewöhne dir die magischen Zahlen ab.
Arbeite stattdessen mit der Arraygröße, als Limit

0 … <=12
sind schon Mal 13 (bei for-Schleife mit <12 wäre das Problem hier gefangen)
i=0 … i<13
wieder 13 Elemente - nur beginnt das Array bei 0 und endet bei 11 (bei 12 eingetragenen Werten), Du zählst bis 12

14 wäre mir jetzt auch nicht aufgefallen :o
Auch dürften sich die Array-Überschreitungen kaum auf das Programm ausweiten, vll., wenn das unbenutzte aber verwendete Feld Null ist, könnte der digitalWrite(0,??) die Kommunikation stören - aber den Programmfluss?

MfG

PS: Bei Element Nummer 0 und i-2 könnte ich mir auch ‘Hoppalas’ vorstellen, oder?

könnte der digitalWrite(0,??)

Es gibt kein digitalWrite(0,??) Sondern ein

digitalWrite(led[i+1],??)
digitalWrite(led[i-1],??)
digitalWrite(led[i],??)

Kein Mensch weiß, was an dieser zauberhaften Stelle, außerhalb der Arraygrenzen, geschrieben steht.

Hi

Genau Das meine ich, wenn in der Speicherstelle VOR dem Array zufällig 0 steht, würde led[i-1] zu 0, und 0 und 1 waren RX/TX (oder anders herum). Sonst könnte 'ein beliebiger Pin oder PullUP' geschaltet werden, mit nach Außen seltsamen Erscheinungen, aber sollte im Programmfluss nicht stören (ok, wenn vom Taster der PullUP plötzlich weg ist, haben wir wohl ein Dauerdrücken, aber das Programm 'läuft' normal weiter - bei Taster gegen GND).

MfG

combie:

  for(i=12;i>=0;i--)

{
   digitalWrite(led[i],HIGH); // <<<<< ---- hier Element 0 bis 12,
   button(100);
   digitalWrite(led[i-1],HIGH);
   button(100);
   if(buttonbackup==true) break;
   if(i<12) digitalWrite(led[i+1],HIGH);
   button(100);
   digitalWrite(led[i-2],HIGH);
   digitalWrite(led[i+1],LOW);    // <<<<< ---- hier Element 1 bis 13,
 }



macht in der Summe 14 Stück

Gewöhne dir die magischen Zahlen ab.
Arbeite stattdessen mit der Arraygröße, als Limit

Wie würdest du das UP knightrider schreiben?

Hi

Was willst Du? Schreibe Dir auf, welche LED in welcher Situation leuchten soll. Z.B. wird bei der LED 1 (von 0 aus gezählt) ganz sicher nicht die LED 'i-2' irgendwie geschaltet.

MfG

Ich habe jetzt das Programm so umgeschrieben, aber manchmal wird das 4. Muster nur einmal ausgeführt und dann kommt wieder das 1. Muster.

void knightrider()
{
  for(i=0;i<13;i++)
  {
    digitalWrite(led[i],HIGH);
    button(100);
    if(i<11) digitalWrite(led[i+1],HIGH);
    button(100);
    if(buttonbackup==true) break;
    if(i>0) digitalWrite(led[i-1],HIGH);
    button(100);
    if(i<10) digitalWrite(led[i+2],HIGH);
    digitalWrite(led[i-1],LOW);
  }

  for(i=12;i>=0;i--)
  {
    digitalWrite(led[i],HIGH);
    button(100);
    digitalWrite(led[i-1],HIGH);
    button(100);
    if(buttonbackup==true) break;
    if(i<12) digitalWrite(led[i+1],HIGH);
    button(100);
    digitalWrite(led[i-2],HIGH);
    if(i<12) digitalWrite(led[i+1],LOW);    
  }
}

led[i-2]

Was ergibt i - 2, wenn i == 0 ist?

Wie würdest du das UP knightrider schreiben?

KA, auf jeden Fall nicht so!

Und nein, ich frage dich nicht was ein "UP knightrider" sein soll....

UP knightrider ist:

UP: Unterprogramm knightrider: Unterprogrammname

Dachte ich mir schon, dass sich das nicht lohnt, zu fragen....

Wie ich das machen würde? Muster hin und her schieben. (aber das Wort muster, hast du ja schon verbraucht)

Verarbeitung und Ausgabe trennen. Für mich sind das zwei Zuständigkeiten.

Ich habe es geschafft, Danke für eure Hilfe!

void knightrider()
{
  for(i=0;i<13;i++)
  {
    digitalWrite(led[i],HIGH);
    button(100);
    if(i<11) digitalWrite(led[i+1],HIGH);
    button(100);
    if(buttonbackup==true) break;
    if(i>0) digitalWrite(led[i-1],HIGH);
    button(100);
    if(i<10) digitalWrite(led[i+2],HIGH);
    if(i>0) digitalWrite(led[i-1],LOW);
  }

  for(i=12;i>=0;i--)
  {
    digitalWrite(led[i],HIGH);
    button(100);
    if(i>0) digitalWrite(led[i-1],HIGH);
    button(100);
    if(buttonbackup==true) break;
    if(i<12) digitalWrite(led[i+1],HIGH);
    button(100);
    if(i>1) digitalWrite(led[i-2],HIGH);
    if(i<12) digitalWrite(led[i+1],LOW);    
  }
}

Gerne doch!

Obwohl:

 for(i=0;i<13;i++)
  {
    digitalWrite(led[i],HIGH);

Weiterhin 13 Arrayelemente.
EDIT: Was auch voll korrekt ist

Ich finde, du solltest etwas sorgfältiger arbeiten.
Denn sonst fällt dir das noch häufig auf die Zehen.
Den dann aufkeimenden Frust, kannst du schon jetzt durch geübte Disziplin vermeiden.
EDIT: Zu der “Disziplin” Ansage, muss ich trotzdem weiter stehen.

ich glaub so passts…

for(i=0;i<=12;i++)

Weiterhin 13 Arrayelemente.

Aber du hast vollkommen recht…
Pin 1 bis 13 sind 13 Elemente!

Es ist also egal, ob for(i=0;i<=12;i++) oder for(i=0;i<13;i++)

Ich habe mich von den magischen Zahlen verwirren lassen.
Und wieder merke ich, warum ich sie so hasse.
(Aus tiefster Seele)