Pages: 1 [2]   Go Down
Author Topic: eine LED nach der anderen über tastendruck  (Read 1271 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

habe von jemanden einen code vorschlag bekommen:

Code:
// 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
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 82
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
// 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.
Logged

Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@ marcus
Code:
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.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Offline Offline
God Member
*****
Karma: 9
Posts: 721
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Pages: 1 [2]   Go Up
Jump to: