Loading...
Pages: [1] 2   Go Down
Author Topic: eine LED nach der anderen über tastendruck  (Read 610 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

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-grin



Code:
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();
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

keiner ne idee?
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 621
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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


« Last Edit: April 11, 2012, 02:43:41 pm by Marcus W » Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

smiley dankeschön, ändern tuts aber nix smiley
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 621
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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):
Code:

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.
« Last Edit: April 11, 2012, 03:56:50 pm by Marcus W » Logged


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

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.

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 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);
     }
   }
}
}

Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 621
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

circuit99: Mein Code oder seiner?

Deiner tut im wesentlich das selbe, wie meiner.
Logged


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

nein ich meinte serpath's Code.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@ 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 !!


Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

nein ich meinte serpath's Code.

 smiley-mr-green
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 621
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 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? ^^
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 621
42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hab ne gute nacht und bis morgen
Logged

NRW
Offline Offline
Sr. Member
****
Karma: 1
Posts: 373
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1] 2   Go Up
Print
 
Jump to: