Lauflicht nur einseitig

Hallo,
Ich habe ein Problem mit meinem Lauflicht.
Da ich nicht das richtige sketch habe/finde/umschreiben kann/selber schreiben kann. :roll_eyes:
Allgemein zu meinem Aufbau:
-Arduino Mirco
-3x 74HC595
-24x Vorwiderstand
-24xLED in Rot

Die verkabelung ist korrekt und nach arduino.cc website aufgebaut.
Funktioniert auch fehlerfrei,ABER nur in eine Richtung (von links nach rechts).
Es sollte aber auch in die andere Richtung laufen.
Da die Arduinosache für mich aber neuland ist habe ich erstmal ein sketch geladen damit ich die funktion überprüfen kann(sketch siehe unten)
Es sollte aber nach möglichkeit so funktionieren wie im angegebenen youtube link(auch unten)
Wäre super wenn mir da mal einer untert die Arme greifen kann.
Probiere schon seit langer zeit rum,aber immer erfolglos.
Wäre schön wenn es mal einen erfolg gibt. :blush:

Sketch:

int dataPin = 10;
int latchPin = 11;
int clockPin = 12;

void setup(){

  // Set the data, latch and clock pins to output mode.

  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(latchPin, OUTPUT);

}

void loop(){

  // Setup array with the individual LED positions. Decimal is easier to use than binary.
  unsigned int displayLED[] = {
    0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768};

  // Setup two 8 bit bytes to hold the data for each 595.
  uint16_t low_byte;
  uint16_t high_byte;

  // Set length of time to display each LED.
  int pause = 45;

  // Loop control variable
  int count;


  // Count up loop.
  for(count = 1; count < 24; count++){

    // Read the decimal value from the array. Use bitwise And with OxFF for the low byte
    // and shift 8 bits right for the high byte.
    //
    // I learned this from Korman at http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1285651171
    //

    low_byte = displayLED[count] & 0xff;
    high_byte = (displayLED[count] >> 8);

    // set the latch pin low prior to shifting out the data.
    digitalWrite(latchPin, LOW);

    // Shift out the data. The first shiftout puts the high byte into the first 595.
    // The second shiftout shifts the high byte from the first 595 to the second and
    // shifts the low byte into the first 595.
    shiftOut(dataPin, clockPin, MSBFIRST, high_byte);
    shiftOut(dataPin, clockPin, MSBFIRST, low_byte);

    // Display the data by setting the latch pin high.
    digitalWrite(latchPin, HIGH);

    // Pause for the number of miliseconds determined by the 'pause' variable.
    delay(pause);

  }

  //Count down loop. Same as the count up loop but moves in the opposite direction.
  for(count = 24; count > 0; count--){

    low_byte = displayLED[count] & 0xff;
    high_byte = (displayLED[count] >> 8);

    digitalWrite(latchPin, LOW);

    shiftOut(dataPin, clockPin, MSBFIRST, high_byte);
    shiftOut(dataPin, clockPin, MSBFIRST, low_byte);

    digitalWrite(latchPin, HIGH);
    delay(pause);

  }
}

Youtubelink:

Hallo,

dein Auf und Abzählen funktioniert so nicht! Wenn dann müsstest du vor beiden for-Schleifen eine Abfrage starten

	if(count == 0)
	{
		for(count = 0; count < NUMBER_OF_LEDS; count++)
		{
			// Setzte alle Leds auf LOW
			// Setzte Led (count) auf HIGH
		}
	}

	if(count == NUMBER_OF_LEDS)
	{
		....
	}

Hier eine Möglichkeit von mir. Arbeit ohne delays (nonBlocking). duration gibt die Dauer an, wann weitergeschaltet wird.

	static boolean state;
	static byte led;
	unsigned int duration;
	static unsigned long previousMillis;
	unsigned long currentMillis = millis();

	// Vergangene Zeit seit letzter Änderung
	if(currentMillis - previousMillis >= duration)
	{
		// Aufwärts zählen
		if(led < NUM_LEDS - 1 && state == false)
		{
			led++;
			if(led == NUM_LEDS - 1) state = true;
		}
		// Abwärts zählen
		else if(led > 0 && state == true) 
		{
			led--;
			if(led == 0) state = false;
		}
		// Vergangene Zeit zurücksetzen
		previousMillis = currentMillis;
	}

Danke für die wirklich schnelle Antwort! XD
Aber was soll ich sagen es tut sich garnichts... :blush:

Ein Teil war ausserhalb der Funktion noch deklariert. Ausgabe erfolgt auf den Seriellen Monitor. (// Debug Serial ...).
Die Variable numberOfLeds kann auch an den Anfang deines Sketches als globale Variable verschoben werden für andere Funktionen.

Die Funktion gibt als Rückgabewert die Zahl deiner Led an. Bei 20 leds wäre das von led0 (die erste led) bis led19.

byte runningLedNew()
{
	static boolean state;
	static byte led;
	byte numberOfLeds = 20;
	unsigned int duration = 1000;
	static unsigned long previousMillis;
	unsigned long currentMillis = millis();

	// Vergangene Zeit seit letzter Änderung
	if(currentMillis - previousMillis >= duration)
	{
		// Aufwärts zählen
		if(led < numberOfLeds - 1 && state == false)
		{
			led++;
			if(led == numberOfLeds - 1) state = true;
		}
		// Abwärts zählen
		else if(led > 0 && state == true) 
		{
			led--;
			if(led == 0) state = false;
		}
		// Vergangene Zeit zurücksetzen
		previousMillis = currentMillis;

		// Debug
		Serial.print("led"); Serial.print(led); Serial.print("  "); Serial.println(currentMillis/1000);

		return led;
	}

P.S.: Da du sagst, dass du mit Arduino erst seit kurzem vertraut bist, hier mal eine Libary, die es dir vereinfacht.
http://www.elcojacobs.com/shiftpwm/

Dann hast du nicht mehr viel mit dem Shiften zu tun. In der loop() wird meine Funktion einem Wert zugewiesen. Mit ShiftPWM.SetAll(0) werden alle Ausgänge ausgeschaltet und mit ShiftPWM.SetOne(...) deine aktuelle Led gesetzt.

void loop()
{
	static byte activeLed = runningLedNew();

	ShiftPWM.SetAll(0);
	ShiftPWM.SetOne(activeLED, 255); // 255 entspricht 100% Helligkeit
}

Wow super...hätte ich mich hier mal eher erkundigt. :smiley:
Mein code sieht nun also wie folgt aus

int dataPin = 10;
int latchPin = 11;
int clockPin = 12;

void setup(){

  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  byte runningLedNew()
    static boolean state;
  static byte led;
  byte numberOfLeds = 24;
  unsigned int duration = 1000;
  static unsigned long previousMillis;
  unsigned long currentMillis = millis();

  // Vergangene Zeit seit letzter Änderung
  if(currentMillis - previousMillis >= duration)
  {
    // Aufwärts zählen
    if(led < numberOfLeds - 1 && state == false)
    {
      led++;
      if(led == numberOfLeds - 1) state = true;
    }
    // Abwärts zählen
    else if(led > 0 && state == true) 
    {
      led--;
      if(led == 0) state = false;
    }
    // Vergangene Zeit zurücksetzen
    previousMillis = currentMillis;

    // Debug
    Serial.print("led"); 
    Serial.print(led); 
    Serial.print("  "); 
    Serial.println(currentMillis/1000);

    return led;
  }
  void loop()
  {
    static byte activeLed = runningLedNew();

    ShiftPWM.SetAll(0);
    ShiftPWM.SetOne(activeLED, 255); // 255 entspricht 100% Helligkeit
  }
}

Nun hab ich aber einen gelb makierten Fehler bei
"static boolean state;" und zwar:
error:a function-definition is not allowed here before '{' token

oder is das sketch so garnicht richtig?

Du hast die schließende Klammer von setup() vergessen und die öffnende von runningLedNew()

erst steh in Orange :
Exepted initialzer before 'static'

danach kommt das alles:
sketch_nov08a.ino: In function 'void setup()':
sketch_nov08a:11: error: expected initializer before 'static'
sketch_nov08a:22: error: 'state' was not declared in this scope
sketch_nov08a:42: error: return-statement with a value, in function returning 'void'
sketch_nov08a.ino: In function 'void loop()':
sketch_nov08a:46: error: 'runningLedNew' was not declared in this scope
sketch_nov08a:48: error: 'ShiftPWM' was not declared in this scope
sketch_nov08a:49: error: 'activeLED' was not declared in this scope
sketch_nov08a.ino: At global scope:
sketch_nov08a:51: error: expected declaration before '}' token

Steht doch alles da.

Nach
pinMode(latchPin, OUTPUT);
fehlt die schließende geweifte Klammer.

Nach
byte runningLedNew()
fehlt ebenfalls eine geschweifte Klammer. Die mal eine öffnende.

Mach das mal, und drück in der Arduino IDE einmal "Strg" + "t"

Juhu is nun grün allerdings ist noch ein angebliches Problem mit
activeLED und der ShiftPWM.SetOne

bei beiden steht :
was not declared in this scope

Was heisst das?

Du musst die Lib schon runterladen, installieren und mit #include einbinden. Die ist nicht standardmäßig vorhanden.

Runtergeladen und installiert war es #include fehlte nur noch(hätte ich auch drauf kommen können irgendwie) :blush: :roll_eyes:
das letzte (bis jetzt angezeigte Problem ist das mit
activeLED was not declared in scope...

Versteh ich das nicht richtig wenn ich sage
activeLED=runningLEDnew=byte
?

Nein, sowas geht nicht. Zumindest ist mir das nicht bekannt.
Hab es dir vorhin doch schon passend hingeschrieben.

static byte activeLed = runningLedNew();

Ne so hab ich es auch nicht geschrieben sonder es war nur dem verständnis halber.

Nun hab ich noch mehr fehler (in der ShiftPWM der latchPin)ich glaube ich sollte es echt lassen...
zumal ich glaube euch zu nerven. =(

Ich hol mal eben nen TLC5916 raus und teste deinen Sketch live.

Also
ich habe dies

const bool ShiftPWM_balanceLoad = 10;
const int ShiftPWM_latchPin = 11;
const bool ShiftPWM_invertOutputs = 12;

void setup(){

  pinMode(ShiftPWM_balanceLoad, OUTPUT);
  pinMode(ShiftPWM_invertOutputs, OUTPUT);
  pinMode(ShiftPWM_latchPin, OUTPUT);
}
#include <ShiftPWM.h>

byte runningLedNew(){
  static boolean state;
  static byte led;
  byte numberOfLeds = 24;
  unsigned int duration = 1000;
  static unsigned long previousMillis;
  unsigned long currentMillis = millis();

  // Vergangene Zeit seit letzter Änderung
  if(currentMillis - previousMillis >= duration)
  {
    // Aufwärts zählen
    if(led < numberOfLeds - 1 && state == false)
    {
      led++;
      if(led == numberOfLeds - 1) state = true;
    }
    // Abwärts zählen
    else if(led > 0 && state == true) 
    {
      led--;
      if(led == 0) state = false;
    }
  }
  // Vergangene Zeit zurücksetzen
  previousMillis = currentMillis;

  // Debug
  Serial.print("led"); 
  Serial.print(led); 
  Serial.print("  "); 
  Serial.println(currentMillis/1000);

  return led;
}
void loop()
{
  static byte activeLed = runningLedNew();
  {
  }

  ShiftPWM.SetAll(0);
  {

  }

  ShiftPWM.SetOne(activeLed, 255);
  { // 255 entspricht 100% Helligkeit
  }
}

hochladen können auch wenn es nicht läuft,aber ich konnte es laden.

Quick and Dirty!
Habs nur mal schnell mit der Lib entsprechend zusammengeschrieben. Da sind einige Dinger drin, die so nicht zu machen sind. Da kümmer ich mich gleich drum. Musste erstmal sehen, das ich mein Shield reaktiviere :wink:

Video:

const int ShiftPWM_latchPin=8;
const bool ShiftPWM_invertOutputs = false;
const bool ShiftPWM_balanceLoad = false;
#include <ShiftPWM.h>

unsigned char maxBrightness = 100;
unsigned char pwmFrequency = 75;
const byte numOutputs = 8;



void setup(){
  ShiftPWM.SetAmountOfRegisters(numOutputs);
  //ShiftPWM.SetPinGrouping(1); //This is the default, but I added here to demonstrate how to use the funtion
  ShiftPWM.Start(pwmFrequency,maxBrightness);
  ShiftPWM.SetPinGrouping(8);
  ShiftPWM.SetAll(0);
  Serial.begin(9600);
}


void loop()
{
runningLedNew();
}


void runningLedNew()
{
  static boolean state;
  static byte led;
  unsigned int duration = 250;
  static unsigned long previousMillis;
  unsigned long currentMillis = millis();

  // Vergangene Zeit seit letzter Änderung
  if(currentMillis - previousMillis >= duration)
  {
    // Aufwärts zählen
    if(led < numOutputs - 1 && state == false)
    {
      led++;
      if(led == numOutputs - 1) state = true;
    }
    // Abwärts zählen
    else if(led > 0 && state == true) 
    {
      led--;
      if(led == 0) state = false;
    }
    // Vergangene Zeit zurücksetzen
    previousMillis = currentMillis;

    // Debug
    Serial.print(led);

ShiftPWM.SetAll(0);
ShiftPWM.SetOne(led,2);
  }
}

Danke euch für die Hilfe,aber es läuft noch nicht. :roll_eyes:
Zumal Der Arduino nun auch nicht mehr erkannt wird(dafür nutze ich die SuFu),aber das ist ein anderes Thema.
XD

Hallo,
ich wollte das alte Thema und somit auch mein Altes Problem wieder aufrufen.
Der PC findet nun mein Micro wieder.
Allerdings ist das Problem mit dem Sketch das gleiche geblieben...
Würde sich vllt.jemand bereit erklären mir nochmal zu helfen?

Marbruk:
Hallo,
ich wollte das alte Thema und somit auch mein Altes Problem wieder aufrufen.
Der PC findet nun mein Micro wieder.
Allerdings ist das Problem mit dem Sketch das gleiche geblieben...
Würde sich vllt.jemand bereit erklären mir nochmal zu helfen?

Wo soll das Problem sein? Hast du zeitgleich mal die Serielle Ausgabe beobachtet.

Also ich habe erfolge zu verzeichnen:
Lauflicht läuft.
Alle 24 Led's leuchten hin und her! XD
Nun ist die Frage wie ich das mit dem "Schweif"hinbekomme.
Sprich:Jetzt leuchten alle einzeln möchte aber das sie langsamer ausgehen.
Mein Code bis jetz ist so:

const int ShiftPWM_latchPin=8;
const bool ShiftPWM_invertOutputs = false;
const bool ShiftPWM_balanceLoad = false;
#include <ShiftPWM.h>

unsigned char maxBrightness = 100;
unsigned char pwmFrequency = 75;
const byte numOutputs = 24;



void setup(){
  ShiftPWM.SetAmountOfRegisters(numOutputs);
  //ShiftPWM.SetPinGrouping(1); //This is the default, but I added here to demonstrate how to use the funtion
  ShiftPWM.Start(pwmFrequency,maxBrightness);
  ShiftPWM.SetPinGrouping(8);
  ShiftPWM.SetAll(0);
  Serial.begin(9600);
}


void loop()
{
runningLedNew();
}


void runningLedNew()
{
  static boolean state;
  static byte led;
  unsigned int duration = 50;
  static unsigned long previousMillis;
  unsigned long currentMillis = millis();

  // Vergangene Zeit seit letzter Änderung
  if(currentMillis - previousMillis >= duration)
  {
    // Aufwärts zählen
    if(led < numOutputs - 1 && state == false)
    {
      led++;
      if(led == numOutputs - 1) state = true;
    }
    // Abwärts zählen
    else if(led > 0 && state == true) 
    {
      led--;
      if(led == 0) state = false;
    }
    // Vergangene Zeit zurücksetzen
    previousMillis = currentMillis;

    // Debug
    Serial.print(led);

ShiftPWM.SetAll(0);
ShiftPWM.SetOne(led,2);
  }
}