Lauflicht in 2 Richtungen

Hallo liebe Arduino-Fans

Ich habe ein Arduino Uno und würde mir gerne ein Lauflicht bauen, welches aus 12 LED's besteht und in 2 Richtungen läuft. Also 6 LED's von links nach rechts und zeitgleich 6 LED's von rechts nach links. Und das fließend. Jetzt habe ich allerdings das Problem, dass ich die Programmiersprache überhaupt nicht beherrsche. Könnte mir da eventuell jemand mit einem Sketch behilflich sein? Ich habe nämlich mal den Knight-Rider-Sketch umgeändert, allerdings blinken die 1,6,7 und 12 LED jeweils 2x. Das möchte ich aber nicht. Das macht das Knight-Rider-Licht ja auch nicht.

Mit freundlichen Grüßen

Stefan

Und was genau sollen wir jetzt machen? Glaskugelorakeln, oder vom Wetter erzählen? Stell doch mal deinen Sketch in Code Tags hier rein, und deine Schaltung....

int pinArray[] = {13,12,2,11,3,10,4,9,5,8,6,7};

int pinCount = 14;

int activePin = 2;

int dx = 1;

int poti = 0;

int mintime = 0;

void setup() {
 Serial.begin(9600);
 for (int i=0; i< pinCount; i++) {
   if (pinArray[i] != 0) {
     pinMode(pinArray[i], OUTPUT);
   }
 }
}

void loop() {

 for (int i=0; i<pinCount; i++) {
   digitalWriteNot0(pinArray[i], LOW);
 }

 if (activePin == (pinCount-1)) {
   activePin = (pinCount-2);
   dx = -1;
 }

 if (activePin == 0) {
   activePin = 1;
   dx = 1;
 }

 activePin += dx;

 poti = analogRead(0);

 if (poti < 1023) {
   digitalWriteNot0(pinArray[activePin], HIGH);
   digitalWriteNot0(pinArray[activePin-dx], HIGH);
   digitalWriteNot0(pinArray[activePin-2*dx], HIGH);
 }

 Serial.print(poti);
 Serial.print(" - ");
 Serial.println(activePin);

 delay(mintime+analogRead(0)/4);

}

void digitalWriteNot0(int pin, boolean state) {
 if (pin > 0) {
   digitalWrite(pin, state);
 }
}

Das ist mein Sketch. Und irgendwo da drin sitzt noch ein Fehler. Weil 13,6,7 und 12 gehen noch jeweils 2x an. Die sollen aber beim Richtungswechsel nicht nochmal aufblitzen.

Code Tags!

int pinArray[] = {13,12,2,11,3,10,4,9,5,8,6,7};
 
int pinCount = 14;
 
int activePin = 2;
 
int dx = 1;
 
int poti = 0;
 
int mintime = 0;
 
void setup() {
  Serial.begin(9600);
  for (int i=0; i< pinCount; i++) {
    if (pinArray[i] != 0) {
      pinMode(pinArray[i], OUTPUT);
    }
  }
}
 
void loop() {
 
  for (int i=0; i<pinCount; i++) {
    digitalWriteNot0(pinArray[i], LOW);
  }
 
  if (activePin == (pinCount-1)) {
    activePin = (pinCount-2);
    dx = -1;
  }
 
  if (activePin == 0) {
    activePin = 1;
    dx = 1;
  }
 
  activePin += dx;
 
  poti = analogRead(0);
 
  if (poti < 1023) {
    digitalWriteNot0(pinArray[activePin], HIGH);
    digitalWriteNot0(pinArray[activePin-dx], HIGH);
    digitalWriteNot0(pinArray[activePin-2*dx], HIGH);
  }
 
  Serial.print(poti);
  Serial.print(" - ");
  Serial.println(activePin);
 
  delay(mintime+analogRead(0)/4);
 
}
 
void digitalWriteNot0(int pin, boolean state) {
  if (pin > 0) {
    digitalWrite(pin, state);
  }
}

Steven45141:
Jetzt habe ich allerdings das Problem, dass ich die Programmiersprache überhaupt nicht beherrsche.

a) du sollst nicht schreiben was du nicht kannst, sondern beschreiben was du kannst.
b) weiters sollst du eine Quelle angeben, woher du den Sketch hast den du verändert hast
c) sollst du im Forum suchen, da findest du bereits ähnliches.
d) habe ich was ausprobiert und das hänge ich drann
e) wenn du eine Zeile nicht verstehst sollst du fragen

// Lauflicht in zwei Richtungen http://forum.arduino.cc/index.php?topic=558863.0
// Ähnlich dem Muster von http://forum.arduino.cc/index.php?topic=518131.0
// Beigesteuert von noiasca.
// Version 2018-07-19

/* ***************************
 *  Configuration/Konfiguraton
 * ************************* */

//                                5432109876543210           // das Muster, einfach als Bitfolge in einem 2-Byte dann kann man es einfach in der IDE "hinmalen"
const uint16_t     pattern[] = {0b0000100000000001,          // Led 0 und 11 sollen leuchten
                                0b0000010000000010,
                                0b0000001000000100,
                                0b0000000100001000,
                                0b0000000010010000,
                                0b0000000001100000,
                                0b0000000010010000,
                                0b0000000100001000,
                                0b0000001000000100,
                                0b0000010000000010
                               };

const uint8_t ledPin[] = {13, 12, 2, 11, 3, 10, 4, 9, 5, 8, 6, 7}; // maximal 16 Pins - vorsicht der erster PIN ist Index 0 - und das ist im Bit-Muster/Pattern die letzte Stelle!!!
//const uint8_t ledPin[] = {2,3,4,5,6,7,8,9,10,11,12,13};          // maximal 16 Pins! - auf meinem Board
const uint16_t myIntervall = 300;                            // Hinweis: falls weniger als 254ms gewünscht sind, kann man auch auf uint8_t umstellen
#define DEBUG_UART 1                                         // Debugausgaben auf Serieller Schnittstelle falls man keine LEDs hat: 0 nein / 1 ja 

/* ***************************
 *  Globals / Variablen für den Sketch
 * ************************* */
 
uint32_t lastMillis = 0;                                  // wann wurde das letzte mal ein Update der LEDs gemacht
uint16_t totalNoPattern = 0;                              // soviele Pattern gehen zwar nie auf einen UNO, aber mehr als uint8_t könnten es schon werden. man könnte ein paar Byte sparen wenn man ein fixes precompiler #define oder ein const macht.
uint8_t  actualPattern = 0;                               // welches Muster soll aktuell ausgegeben werden
uint8_t  totalNoPins = 0;                                 // Anzahl der Leds wird einmal zur Laufzeit ermittelt

/* ***************************
 *  Setup
 * ************************* */

void setup() {
#if DEBUG_UART
  Serial.begin(115200);
  Serial.println(F("\nLED Lauflicht in 2 Richtungen"));
#endif

  totalNoPattern = sizeof(pattern) / sizeof(pattern[0]);   // Ermittlung wie viele Pattern definiert wurden, ich mach das zur Laufzeit, weil ich mir das abzählen sparen wollte.
  totalNoPins = sizeof(ledPin) / sizeof(ledPin[0]);        // Ermittlung wie viele Pins definiert wurden um die Konfiguration zu vereinfachen

  for (uint8_t i = 1; i < totalNoPins; i++) {
    pinMode(ledPin[i], OUTPUT);
  }
}

/* ***************************
 *  Main - Loop
 * ************************* */
 
void loop() {
  if (millis() - lastMillis >= myIntervall)
  {
    actualPattern++;
    if (actualPattern >= totalNoPattern) actualPattern = 0;
    for (uint8_t i = 0; i < totalNoPins; i++)                      // von der Vorgabe her reichen die 10 - werden alle 16 Leds benötigt müsste man auch im setup() mehr initialisieren
    {
      if (pattern[actualPattern] & (1 << i)) {
#if DEBUG_UART
        Serial.print(F("X"));
#endif
        digitalWrite(ledPin[i], HIGH);
      }
      else {
#if DEBUG_UART
        Serial.print(F(" "));
#endif
        digitalWrite(ledPin[i], LOW);
      }
    }
#if DEBUG_UART
    Serial.print(F(" - "));
    Serial.println(actualPattern);
#endif
    lastMillis = millis();
  }
  // do what ever you want to do unblocked here
}

Ich weiß nicht, was ich hier noch alles schreiben soll. Damit ihr genug Infos habt. Wie gesagt, ich bin neu, ich habe 0 Ahnung und ich möchte einfach nur ein Lauflicht, was so ähnlich wie Knight-Rider funktioniert. Wobei immer 6 LED's aufeinander zu laufen und dann wieder voneinander weg. Ohne dass irgendeine LED 2x aufblitzt. Das Sketch für Knight-Rider, habe ich weiter oben schon eingehängt und es ist von Makerblog.at Ich habe auch 2 Videos dazu gemacht, die kann ich hier aber leider nicht einhängen. Eine Seite des Lauflichts funktioniert nämlich schon so, wie es soll. Die andere Seite bereitet mir aber noch Probleme. Und hier im Forum etwas zu finden, ist etwas für Leute, die irgendjemanden erschlagen haben. Wenn es keine Suchfunktion gibt.

Steven45141:
.....
Und hier im Forum etwas zu finden, ist etwas für Leute, die irgendjemanden erschlagen haben. Wenn es keine Suchfunktion gibt.

Deine Bemerkungen sind schon dreist.
Man muss niemanden erschlagen, man muss nur lesen oder schauen.
Ich hoffe du kannst es.

Oben rechts im Browserfenster ist eine Lupe, versuche es mal damit.