eine LED nach der anderen über tastendruck

hallo landsleut,

ich bekomm es einfach nicht auf den schirm. was muss ich tun damit das nichtmehr automatisch von LED eins zu LED 16
zählt sondern immer nur dann wenn ich einen schalter drücke.
ziel ist:

arduino an den strom hängen, LED 1 leuchtet, nun drück ich den taster, LED eins geht aus und die zweite LED geht an … usw
nach der16ten LED fängt alles wieder von vorne an = tastedrück, nächste LED.
ich weiss das ich das mit den variablen

int tasterstatus = 0; //pressing this button
int tasterValue = 0; //i think i need that integer
int previousTasterValue = 0; // and this one

machen muss, dazu IF und else kommandos setzen muss … nur wie und wo.
das die leds vor und zurücklaufen hab ich auch schon hinbekommen und auch das man zwischen nur vor und vor/zurück wechseln
kann … aber das die leds nur durch tastendruck vorlaufen bekomm ich einfach nich hin.

mit ner analogen schlatung würde ich das hinbekommen, digital und programmieren sind aber NEULAND welches
ich unbedingt betreten will. das spart massig analoge komponenten.

wäre ganz super wenn mir jemand helfen könnte. danke im voraus und beste grüße vom anfänger :smiley:

int ledPin[] = {30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45};
int schalterPin = 8;
int schalterStatus;
int sensorPin = A1;
int taster = 22;        //doesnt know how i can start counting led after led by 
int tasterstatus = 0;   //pressing this button 
int tasterValue = 0;          //i think i need that integer
int previousTasterValue = 0;  // and this one
int sensorValue;

void setup()
{
  for(int i = 0; i < 16; i++)
  for(int i = 15; i >= 0; i--)
  pinMode(ledPin[i], OUTPUT);
  pinMode(schalterPin, INPUT);
     
   
}

/*void forthback(){   // the delay is unusual but iam glad that iam able to control the rate :)
  for (int i = 0; i < 16; i++)
    {
    sensorValue = analogRead(sensorPin);
    // turn the pin on:
    digitalWrite(ledPin[i], HIGH); 
    delay(sensorValue);                 
    // turn the pin off:
    digitalWrite(ledPin[i], LOW);   
    }

  // loop from the highest pin to the lowest:
  for (int i = 15; i >= 0; i--)
    {
    sensorValue = analogRead(sensorPin);
    // turn the pin on:
    digitalWrite(ledPin[i], HIGH);
    delay(sensorValue);
    // turn the pin off:
    digitalWrite(ledPin[i], LOW);
    }
}*/

void forth(){ // lets take this one for experimenting
  for (int i = 0; i < 16; i++)
    {
    sensorValue = analogRead(sensorPin);  // do i need to insert a IF ELSE  commandline here?
    digitalWrite(ledPin[i], HIGH);        // how can i make it count ????
    delay(sensorValue);                 
    // turn the pin off:
    digitalWrite(ledPin[i], LOW);   
    }
}
 


void loop() {  // here i can switch between leds forware or forward and then backward
  schalterStatus = digitalRead(schalterPin);
  if(schalterStatus == HIGH)
    forthback();
  else
    forth();
}

keiner ne idee?

Ohne die Eigentliche Schleife überprüft zu haben, oder den restlichen Code:

void setup()
{
  for(int i = 0; i < 16; i++)
  for(int i = 15; i >= 0; i--)
  pinMode(ledPin[i], OUTPUT);
  pinMode(schalterPin, INPUT);
}

in

void setup()
{
  for(int i = 0; i < 16; i++)
  for(int i = 15; i >= 0; i--)
  {
    pinMode(ledPin[i], OUTPUT);
    pinMode(schalterPin, INPUT);
  }
}

ändern, da du die geschweiften klammer nur weglassen kannst, wenn das darauffolgende nur aus einem Befehl besteht.

EDIT: Außerdem macht ddie Doppelschleife keinen sinn - zuerst zählst du “i” rauf, nur um es pro Schritt von 15 auf 0 zahlen zu lassen und jeweils den pin setzt…

:) dankeschön, ändern tuts aber nix :)

So, nachdem ich mir das ganze ding angesehn habe: meiner Meinung nach ist der Sketch mist.

Einfacher, schneller und vor allem funktionierend (so aus dem kopf, hab gerade keinen Arduino da um ihn zu testen):

int ledPin[] = {30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45};
int buttonPin = 8;
int activeLed = 0;

void setup()
{
  for (int i=0; i<=15, i++)
  {
     pinMode(ledPin[i], OUTPUT);
  }
  pinMode(buttonPin, INPUT);
  digitalWrite(ledPin[activeLed], HIGH);
}

void loop()
{
  if(digitalRead(buttonPin) == HIGH)
  {
    for (int i=0; i<=15; i++)
    {
       digitalWrite(ledPin[i], LOW);
    }
    
    activeLed = activeLed == 15 ? 0:activeLed++;
    digitalWrite(ledPin[activeLed], HIGH);
    
  }
}

so oder so ähnlich - wie gesagt, der ist aus dem Stehgreif und ungetestet.

EDIT: Variablennamen angepasst.

Hallo,
dein code scheint mir sehr kompliziert. Du brauchst doch nur 2 Dinge 1. Erfassung ob der Schalter gedrückt wurde und zweitens eine Zählvariable bis 15 bzw. 16 zu inkremenntieren. Das einlesen kannst du mit der bounce-Libary machen, da hast du gleich eine Entprellung;
http://www.arduino.cc/playground/Code/Bounce
Wenn der Taster gedrückt ist zählst du einfach den counter um eins hoch und setzt die Ausgangspins. Vorher fragst du noch kurz ab ob der counter schon bei 16 angelangt ist und wenn ja fängst du von vorne an (counter=0).
Das Setzen der Ausgangspins geht sicher noch wesentlich eleganter (eigentlich braucht man immer nur zwei Pins zu schreiben), da ist deiner Fantasie keine grenzen gesetzt.

// This code turns a led on/off through a debounced switch

#include <Bounce.h>

// This code turns a led on/off through a debounced button
// Build the circuit indicated here: http://arduino.cc/en/Tutorial/Button

#define BUTTON 8 //schalterPin
int ledPin[] = {30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45};
int i;
int schalterStatus;
int counter=0;

// Instantiate a Bounce object with a 5 millisecond debounce time
Bounce bouncer = Bounce( BUTTON,5 ); 

void setup() {
  pinMode(BUTTON,INPUT);
  for (i=0; i<16;i++)
  {
  pinMode(ledPin[i],OUTPUT);
  }
  //erste LED soll leuchten beim einschalten
  digitalWrite(30,HIGH);
}

void loop() {
// Update the debouncer
bouncer.update ( );

// Get the update value
schalterStatus = bouncer.read();
 
// Hochzählen des counters beim Tastendruck
if ( schalterStatus == HIGH)
   {
   counter = counter + 1;
      // Rücksetzen beim erreichen der letzten led
      if(counter>15)
      {
      counter=0;
      }
   //Pins Ausschalten
   for (i=0; i<counter; i++)
      {
      digitalWrite(ledPin[i],LOW);
      }
   // Pin einschalten
   digitalWrite(ledPin[counter],HIGH);
   //Pins ausschalten
   for (i=counter+1; i<16; i++)
      {
     digitalWrite(ledPin[i],LOW);
     }
   } 
}
}

circuit99: Mein Code oder seiner?

Deiner tut im wesentlich das selbe, wie meiner.

nein ich meinte serpath's Code.

@ marcus: der compiler sagt

sketch_apr11a.cpp: In function 'void setup()': sketch_apr11a:6: error: expected `;' before ')' token

@circuit99: der compiler sagt OK nachdem ich das allerletzte } gelöscht hab. auch die erste LED geht an. allerdings beim tastendruck werden alle leds so dermassen schnell durchgejagt das das ziemlich unnütz ist. erst wenn der taster wieder geöffnet ist bleibt es bei irgendeiner LED wahlos stehen.

eventuell könnte ich es auch so formulieren: immer WENN ein HIGH (eine rising edge einer pulsewelle zum beispiel in verbindung mit nem transistor und 5 volt) pegel kommt umswitchen zum nächsten led. man könnte dann quasi ne analoge clock nutzen um die steps durchzufahren ... in die richtung solls eigent gehen.

ich dnak euch aufjedenfall schonmal sehr für die tips !!

circuit99: nein ich meinte serpath's Code.

:grin:

schmeiß mal die leerzeichen die sich beim digitalwrite im setup() eingeschlichen haben raus...

@ marcus

void setup()
{
  for(int i= 0 ; i <= 15, i++);
  { 
    pinMode(ledPin[i], OUTPUT);
  }
  pinMode(buttonPin, INPUT);
  digitalWrite(ledPin[activeLed],HIGH);
}

da kann ich entfernen was an leerzeichen da is, das ändert irgendwie nichts. … isses etwa schon zu spät? ^^

ich setz mich morgen mal hin und probiere es aus… hab momentan keine Ahnung, woran es liegen könnte.

hab ne gute nacht und bis morgen

Um die aus mach schleife zu sparen würde ich hin gehen und erst die aktuelle LED aus machen dann hoch zählen und uberprüfen auf überlauf und diese dann an machen. Mal abgesehen davon das man entprellen muß sollte das aber kein hexenwerk sein.

habe von jemanden einen code vorschlag bekommen:

// Number of Button location
int buttonPin = 22;     

// Array of where leds are
int ledPinArray[] = {30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45};
// Current location in array
int pos = 0;

// read button state
int buttonState = 0;        

void setup() {
  // initialize the LEDs as an output
  for(int i = 0; i < 16; i++) { // Change 4 to length of array
    pinMode(ledPinArray[i],OUTPUT);
  }
  
  // Accept inputs from button pin
  pinMode(buttonPin, INPUT);    
  
  // Turn on the first LED
  digitalWrite(ledPinArray[0],HIGH); 
  digitalWrite(30,HIGH);
  
}

void loop(){
  
  // read the state of the pushbutton
  buttonState = digitalRead(buttonPin);

   // if the button is preseed
  if (buttonState == HIGH) {     

    // increment location in Array
    pos++;
    
    // if the location is higher than the length of the array, set it back to 0
    if(pos >= 16) {
      pos = 0;
    }
    
    // turn on next LED
    digitalWrite(ledPinArray[pos], HIGH);  
    
    // Turns off last LED
    if(pos!=0) { // If the current possition isnt the first in the row
      digitalWrite(ledPinArray[pos-1], LOW);
    } else { // If it is, turn off the last one
      digitalWrite(ledPinArray[15],LOW);
    }
    
    // without this, it will change LED's faster than you can let go of the button
    delay(70);
    
  }

}

das signal des tasters muss nun so getweaked werden das nur eine spitze übrig bleib … vergleicht mal die zwei unteren abbildungen:

diese kleine spitze ermöglicht das triggern.

eine analoge clock ist ja ne pulswelle die gleichmässig an/aus geht. in der phase AN … blinken bei diesem code jedoch mehrere leds hintereinander weg. mit dem trigger signal ist es immer nur eine

Dein Problem ist nicht die Erkennung des Signals, dein problem ist, dass du zu langsam für den uC bist. In meinem Code wird der Taster schon softwaremäßig entprellt (5ms). Eine weitere Verzögerung ist im Code noch nicht enthalten. D.h. der Code braucht wahrscheinlich weniger als 10ms zum durchlaufen. Wenn du den Taster 0,5s drückst läuft die Schleife mindestens 50 mal durch → LEDs werden durchgejagt. Wenn es langsamer gehen soll, füg ein delay am Ende des if-Blocks ein. Wenn bei jeder steigenden Flanke eine LED geschaltet werden soll musst du halt den Flankenwechsel und nicht den Schalterzustand abfragen

// This code turns a led on/off through a debounced switch

#include <Bounce.h>

// This code turns a led on/off through a debounced button
// Build the circuit indicated here: http://arduino.cc/en/Tutorial/Button

#define BUTTON 8 //schalterPin
int ledPin[] = {30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45};
int i;
int schalterStatus;
int oldschalterStatus = LOW;
int counter=0;

// Instantiate a Bounce object with a 5 millisecond debounce time
Bounce bouncer = Bounce( BUTTON,5 ); 

void setup() {
  pinMode(BUTTON,INPUT);
  for (i=0; i<16;i++)
  {
  pinMode(ledPin[i],OUTPUT);
  }
  //erste LED soll leuchten beim einschalten
  digitalWrite(30,HIGH);
}

void loop() {

// Update the debouncer
bouncer.update ( );
// Get the update value
schalterStatus = bouncer.read();
 
// Abfragen des Flankenwechsels
if ( schalterStatus == HIGH && oldschalterStatus == LOW)
   {
   counter = counter + 1;
      // Rücksetzen beim erreichen der letzten led
      if(counter>15)
      {
      counter=0;
      }
   //Pins Ausschalten
   for (i=0; i<counter; i++)
      {
      digitalWrite(ledPin[i],LOW);
      }
   // Pin einschalten
   digitalWrite(ledPin[counter],HIGH);
   //Pins ausschalten
   for (i=counter+1; i<16; i++)
      {
     digitalWrite(ledPin[i],LOW);
     }
   } 
oldschalterStatus=schalterStatus;
}

Wenn beim Drücken mehrere LEDs durchlaufen musst du die Entprellzeit hochsetzen [Bounce bouncer = Bounce( BUTTON,5); <-Die 5 größer machen]. Das ist vom Taster abhängig.

serpath:
@ marcus

void setup()

{
  for(int i= 0 ; i <= 15, i++);
  {
    pinMode(ledPin[i], OUTPUT);
  }
  pinMode(buttonPin, INPUT);
  digitalWrite(ledPin[activeLed],HIGH);
}




da kann ich entfernen was an leerzeichen da is, das ändert irgendwie nichts. .. isses etwa schon zu spät? ^^

Da hat sich ein Semikolon am Ende der for-Anweisung eingeschlichen, nimm das mal raus.

sth77:
Da hat sich ein Semikolon am Ende der for-Anweisung eingeschlichen, nimm das mal raus.

oops - das passiert mir allerdings häufig… und ich such mir dann auch immer den Wolf.