Sequenz ohne delay() / synchronisation

hallo,

auch auf die gefahr hin, dass das thema irgendwo schon behandelt wurde und ich mich zum doesbaddel mache, frage ich mal nach:

eine sequenz mit delay() funktioniert ohne probleme. so weit bin ich schon gekommen.

jetzt moechte ich gerne, dass wenn der input "HIGH" ist, die erste LED mit "HIGH" geschrieben wird. beim naechsten intervall soll dann die 2. LED mit "HIGH" geschrieben werden. das weitersteppen funktioniert in meinem programm nur per zufall bzw. mit einer zu schnellen geschwindigkeit.

die variable wird erst mit einem input "LOW" inkrementiert... gerne haette ich eine loesung, bei der ein zwischenwert von HIGH zu LOW den wert inkrementiert.

hier mein quellcode:

int inPin12 = 12;

int state = LOW;
int count = 0;

void setup()
{
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(inPin12, INPUT);
}

void loop()
{
state = digitalRead(inPin12);

if (state == HIGH)
{
digitalWrite(count, HIGH);
}
else
{
digitalWrite(count, LOW);
count++;
}

if (count >= 8)
{
count = 0;
}
}

ueber eine hilfestellung bin ich sehr dankbar.

Hallo,

ich weiß jetzt noch nicht so richtig was du meinst und willst.
Wenn du in bestimmten Zeitabschnitten eine Aktion auslösen willst, dann kannst du ganz gut einen Timer verwenden Arduino Playground - MsTimer2

Wenn du mehrer Aktionen zu verschiedenen Zeitpunkten durchführen möchtest, dann kannst du den Timer dazu verwenden, eine Funktion aufzurufen, in der Zähler hochgezählt werden.
Den Wert des Zählers kannst du mit einer if-Anweisung abfragen und eine Aktion durchführen lassen. Somit kannst du beliebige Aktionen zu verschiedenen Zeitpunkten (mehrere counter) ausführen.

Beachte, dass die Zähler nach einer Aktion wieder auf Null gesetzt werden müssen.

Gerade die "hohe" Geschwindigkeit gekoppelt mit Unregelmäßigkeit lässt darauf schliessen das Du vielleicht gar kein Software- sondern ein Hardwareproblem hast.

Thema Tastenprellen....

Ist das im Bereich des möglichen ??

hallo,

sorry wenn etwas unverstaendlich.

hardwareproblem ist es nicht, da bei einem HIGH am input eine LED ja durchgaengig leuchtet.

bei einem LOW am input inkrementiert mein programm den counter permanent. das ist das problem.

ich moechte, dass das inkrementieren des counters beim dem tastendruck erfolgt.

  1. tastendruck = 0
  2. tastendruck = 1
  3. tastendruck = 2
    etc

verstaendlicher? :-[

Da ich selbst absoluter Anfänger bin ist mein Ratschlag eher naiver Natur sollte aber das Problem lösen können:

http://arduino.cc/en/Reference/If

damit sollte eine Lösung möglich sein.

Es bessere Antwort bekommst Du bestimmt von den Code-Königen

Bei Deinem Code wird der Zähler permanent bei jedem Loop-Durchlauf inkrementiert, solange der Input LOW ist. Wenn Du es nur bei einem Wechsel von HIGH zu LOW haben willst, musst Du Dir den vorherigen Zustand merken.

int inPin12 =  12;

int state = LOW;
int lastState = LOW;       // Variable zum Speichern des letzten Zustandes
int count = 0;

void setup()   
{                
  pinMode(0, OUTPUT);     
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);     
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(inPin12, INPUT);
}

void loop()                     
{
  state = digitalRead(inPin12);

  if (state == HIGH)
  {
    digitalWrite(count, HIGH);
    lastState = HIGH;
  }
  else
  {
    digitalWrite(count, LOW);
    if (lastState == HIGH)
    {
      count++;
      if (count >= 8)
        count = 0;
      lastState = LOW;
    }
  }
}

Wenn die Inkrementierung auch beim Wechsel von LOW zu HIGH erfolgen soll, dann so:

int inPin12 =  12;

int state = LOW;
int lastState = LOW;       // Variable zum Speichern des letzten Zustandes
int count = 0;

void setup()   
{                
  pinMode(0, OUTPUT);     
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);     
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(inPin12, INPUT);
}

void loop()                     
{
  state = digitalRead(inPin12);

  if (state == HIGH)
  {
    digitalWrite(count, HIGH);
  }
  else
  {
    digitalWrite(count, LOW);
  }
  if (state != lastState)
  {
    count++;
    if (count >= 8)
      count = 0;
    lastState = state;
  }
}

super. vielen dank! funktioniert genau so wie ich es haben wollte :slight_smile: