Inkrementelles Lauflicht, LEDs sind von Anfang an dauerhaft an

Hi,

ich habe einen Arduino Mega und möchte damit 48 LEDs ansteuern, die mit drei externen Tastern hoch und runter laufen, bzw. einen Reset durchführen.

Ich gehe aus den Digitalausgängen über einen BC548 Transistor auf einen Widerstand zur LED.

jetzt habe ich alles aufgebaut und den Arduino auf meine Platine aufgesteckt und die LEDs leuchten nach ein paar Sekunden dauerhaft und lassen sich über keinen Taster beeinflussen.

hier noch mein Code:

int LED [] ={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49};
int auf = 90;
int set = 0;
int ab = 91;
int setter = 0;
int reset = 92;
int setting = 0;
int zaehler = 0;

void setup() {
  // put your setup code here, to run once:
for (int i = 0; i<48; i++)
  {pinMode(LED[i], OUTPUT);
   digitalWrite(LED[i], LOW);}

  pinMode(auf, INPUT); 
  pinMode(ab, INPUT);
  pinMode(reset, INPUT);
  digitalWrite(auf, HIGH); 
  digitalWrite(ab, HIGH);
  digitalWrite(reset, HIGH);
}

void loop() {
  // put your main code here, to run repeatedly:
if (digitalRead(auf) == LOW && set == 0) {zaehler = zaehler+1; set=1;}
 if (digitalRead(auf) == HIGH && set == 1) {delay(1000); set=0;}
if (digitalRead(ab) == LOW && setter == 0) {zaehler = zaehler-1; setter=1;}
 if (digitalRead(ab) == HIGH && setter == 1) {delay(1000); setter=0;}
if (digitalRead(reset) == LOW && setting == 0) {zaehler =0; setting=1;}
 if (digitalRead(reset) == HIGH && setting == 1) {delay(1000); setting=0;}

if (zaehler = 0)
  {for (int j = 0; j<48; j++) {digitalWrite(LED[j], LOW);}}

if (zaehler = 1) {digitalWrite(LED[1], HIGH);} else {digitalWrite(LED[1], LOW);}
if (zaehler = 2) {digitalWrite(LED[2], HIGH);} else {digitalWrite(LED[2], LOW);}
if (zaehler = 3) {digitalWrite(LED[3], HIGH);} else {digitalWrite(LED[3], LOW);}
if (zaehler = 4) {digitalWrite(LED[4], HIGH);} else {digitalWrite(LED[4], LOW);}
if (zaehler = 5) {digitalWrite(LED[5], HIGH);} else {digitalWrite(LED[5], LOW);}
if (zaehler = 6) {digitalWrite(LED[6], HIGH);} else {digitalWrite(LED[6], LOW);}
if (zaehler = 7) {digitalWrite(LED[7], HIGH);} else {digitalWrite(LED[7], LOW);}
if (zaehler = 8) {digitalWrite(LED[8], HIGH);} else {digitalWrite(LED[8], LOW);}
if (zaehler = 9) {digitalWrite(LED[9], HIGH);} else {digitalWrite(LED[9], LOW);}
if (zaehler = 10) {digitalWrite(LED[10], HIGH);} else {digitalWrite(LED[10], LOW);}
if (zaehler = 11) {digitalWrite(LED[11], HIGH);} else {digitalWrite(LED[11], LOW);}
if (zaehler = 12) {digitalWrite(LED[12], HIGH);} else {digitalWrite(LED[12], LOW);}
if (zaehler = 13) {digitalWrite(LED[13], HIGH);} else {digitalWrite(LED[13], LOW);}
if (zaehler = 14) {digitalWrite(LED[14], HIGH);} else {digitalWrite(LED[14], LOW);}
if (zaehler = 15) {digitalWrite(LED[15], HIGH);} else {digitalWrite(LED[15], LOW);}
if (zaehler = 16) {digitalWrite(LED[16], HIGH);} else {digitalWrite(LED[16], LOW);}
if (zaehler = 17) {digitalWrite(LED[17], HIGH);} else {digitalWrite(LED[17], LOW);}
if (zaehler = 18) {digitalWrite(LED[18], HIGH);} else {digitalWrite(LED[18], LOW);}
if (zaehler = 19) {digitalWrite(LED[19], HIGH);} else {digitalWrite(LED[19], LOW);}
if (zaehler = 20) {digitalWrite(LED[20], HIGH);} else {digitalWrite(LED[20], LOW);}
if (zaehler = 21) {digitalWrite(LED[21], HIGH);} else {digitalWrite(LED[21], LOW);}
if (zaehler = 22) {digitalWrite(LED[22], HIGH);} else {digitalWrite(LED[22], LOW);}
if (zaehler = 23) {digitalWrite(LED[23], HIGH);} else {digitalWrite(LED[23], LOW);}
if (zaehler = 24) {digitalWrite(LED[24], HIGH);} else {digitalWrite(LED[24], LOW);}
if (zaehler = 25) {digitalWrite(LED[25], HIGH);} else {digitalWrite(LED[25], LOW);}
if (zaehler = 26) {digitalWrite(LED[26], HIGH);} else {digitalWrite(LED[26], LOW);}
if (zaehler = 27) {digitalWrite(LED[27], HIGH);} else {digitalWrite(LED[27], LOW);}
if (zaehler = 28) {digitalWrite(LED[28], HIGH);} else {digitalWrite(LED[28], LOW);}
if (zaehler = 29) {digitalWrite(LED[29], HIGH);} else {digitalWrite(LED[29], LOW);}
if (zaehler = 30) {digitalWrite(LED[30], HIGH);} else {digitalWrite(LED[30], LOW);}
if (zaehler = 31) {digitalWrite(LED[31], HIGH);} else {digitalWrite(LED[31], LOW);}
if (zaehler = 32) {digitalWrite(LED[32], HIGH);} else {digitalWrite(LED[32], LOW);}
if (zaehler = 33) {digitalWrite(LED[33], HIGH);} else {digitalWrite(LED[33], LOW);}
if (zaehler = 34) {digitalWrite(LED[34], HIGH);} else {digitalWrite(LED[34], LOW);}
if (zaehler = 35) {digitalWrite(LED[35], HIGH);} else {digitalWrite(LED[35], LOW);}
if (zaehler = 36) {digitalWrite(LED[36], HIGH);} else {digitalWrite(LED[36], LOW);}
if (zaehler = 37) {digitalWrite(LED[37], HIGH);} else {digitalWrite(LED[37], LOW);}
if (zaehler = 38) {digitalWrite(LED[38], HIGH);} else {digitalWrite(LED[38], LOW);}
if (zaehler = 39) {digitalWrite(LED[39], HIGH);} else {digitalWrite(LED[39], LOW);}
if (zaehler = 40) {digitalWrite(LED[40], HIGH);} else {digitalWrite(LED[40], LOW);}
if (zaehler = 41) {digitalWrite(LED[41], HIGH);} else {digitalWrite(LED[41], LOW);}
if (zaehler = 42) {digitalWrite(LED[42], HIGH);} else {digitalWrite(LED[42], LOW);}
if (zaehler = 43) {digitalWrite(LED[43], HIGH);} else {digitalWrite(LED[43], LOW);}
if (zaehler = 44) {digitalWrite(LED[44], HIGH);} else {digitalWrite(LED[44], LOW);}
if (zaehler = 45) {digitalWrite(LED[45], HIGH);} else {digitalWrite(LED[45], LOW);}
if (zaehler = 46) {digitalWrite(LED[46], HIGH);} else {digitalWrite(LED[46], LOW);}
if (zaehler = 47) {digitalWrite(LED[47], HIGH);} else {digitalWrite(LED[47], LOW);}
if (zaehler = 48) {digitalWrite(LED[48], HIGH);} else {digitalWrite(LED[48], LOW);}
}

Das ist falsch:

if (zaehler = 1) {digitalWrite(LED[1], HIGH);} else {digitalWrite(LED[1], LOW);}

überall.

Geh mal in der IDE auf DATEI - VOREINSTELLUNGEN
Mach einen Haken bei
AUSFÜHRLICHE WARNUNGEN BEI Kompilierung
Und darunter die Warnungen auf ALLE
Dann siehst Du wo die Reise hingeht.

Nachtrag:
Das hier nicht machen, wenn Du die USB-Schnittstelle brauchst.

int LED [] ={0, 1,

jetzt funktioniert es. Vielen Vielen Dank. An Stelle des "=" muss halt "==" hin.

Pin 0 wird drei zweimal verwendet:

  1. USB
  2. LED-Ausgang
  3. set Eingang

Wo sollen die Pins 90, 91 und 92 sein?

Tipp: Du kannst A0 bis A15 als digitale IOs verwenden.

Da gibt es noch einige Baustellen.
Dein LED-Array hat 48 Elemente. Sowohl im Setup als auch später im Code zählst Du nur bis 47.

Deine ganzen if's mal abgekürzt sehe dann so aus:

  }
  digitalWrite(LED, LOW);
  {digitalWrite(LED[zaehler], HIGH);}
}

@agmue:

Der PIN 0 wird nur für LED (und USB) verwendet...
set ist ein Merker.

Arduino - PinMapping2560 (Den IronieMerker bitte setzen)

ich glaube auch dass du da etwa 50 Zeilen rausschmeissenkannst,inkl.deiner ersten for.
alles ersetzen durch:

for (int j = 0; j < 48; j++)       // dirty magic number
{
  if (zaehler == j) 
    digitalWrite(LED[j], HIGH);
  else
    digitalWrite(LED[j], LOW);
}

Das hat mir jetzt keine Ruhe gelassen.
Also ein for braucht er doch ;(
Da wo es evtl. haken könnte, ist sein hoch und runterzählen.
Er hat keine Begrenzung des zaehler auf die tatsächliche Anzahl der PINs.
Bleibt jetzt nur noch das ändern der Pins.

const byte LED [] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49};
const byte anzahl = sizeof(LED) / sizeof(LED[0]);
const byte auf = 90;
const byte ab = 91;
const byte reset = 92;
unsigned int zaehler = 0;
bool set = false;
bool setter = false;
bool setting = false;


void setup()
{
  // put your setup code here, to run once:
  for (byte i = 0; i < sizeof(LED) / sizeof(LED[0]); i++)
  {
    pinMode(LED[i], OUTPUT);
    digitalWrite(LED[i], LOW);
  }
  pinMode(auf, INPUT_PULLUP);
  pinMode(ab, INPUT_PULLUP);
  pinMode(reset, INPUT_PULLUP);
}

void loop()
{
  // put your main code here, to run repeatedly:
  if (!digitalRead(auf) && !set) {zaehler = zaehler + 1; set = true;}
  if (digitalRead(auf) && set) {delay(1000); set = false;}
  if (!digitalRead(ab) && !setter) {zaehler = zaehler - 1; setter = true;}
  if (digitalRead(ab) && setter) {delay(1000); setter = false;}
  if (!digitalRead(reset) && !setting) {zaehler = 0; setting = true;}
  if (digitalRead(reset) && setting) {delay(1000); setting = false;}
  if (zaehler > anzahl) {zaehler = 0;}
  for (byte b = 0; b < anzahl; b++)
  {
    if (zaehler == b) {digitalWrite(LED[b], HIGH);}
    else {digitalWrite(LED[b], LOW);}
  }
}

Hallo
Ich habe auch noch einen Beitrag:
Diese Zeilen

 for (byte b = 0; b < anzahl; b++)
  {
    if (zaehler == b) {digitalWrite(LED[b], HIGH);}
    else {digitalWrite(LED[b], LOW);}
  }

austauschen gegen:

for (byte b = 0; b < anzahl; b++) digitalWrite(LED[b], zaehler == b ? HIGH : LOW);

Wenn schon, dann gleich

for (byte b = 0; b < anzahl; b++) digitalWrite(LED[b], zaehler == b);

:stuck_out_tongue:

in setup kann man übrigens auch noch anzahl verwenden
oder dort gleich

for (auto& led:LEDS) {
   pinMode(led, OUTPUT);
}

Damit der Compiler auch weiß, warum er aktualisiert wurde.

1 Like

Das ist ja ne ganz interressante Variante.
Musste tatsächlich mehrfach draufschaun, bevor ich das hatte was da passiert. THX!

Vergiß es nicht, falls der Themensteller mal nach einer Erklärung fragen sollte :roll_eyes:

da ein = vergessen wird :stuck_out_tongue_winking_eye:

so eine Abkürzung würde ich nicht machen. Die digitalWrite Beschreibung verlangt nach LOW oder HIGH. nicht false oder true. Sollte mal an LOW oder HIGH gedreht werden, kann das böse ins Auge gehen.

Parameter

pin: Die Arduino-Pinnummer.
value: HIGH oder LOW.

https://www.arduino.cc/reference/de/language/functions/digital-io/digitalwrite/

Das ist kein Spaghetticode mehr sondern Lasagnecode. :wink: :wink: :wink:

Grüße Uwe

Einschätzung:
Das steht nicht zu erwarten, da dann SÄMTLICHER Arduino Code der letzten 200(?) Jahre, zum globalen Versagen gezwungen wird.

Und außerdem grundfalsch, da if (zaehler = irgendwas) immer wahr ist, solange irgendwas != 0 ist.

Gruß Tommy

Das ist allerdings wahr. Eine Arduino Version bei der das nicht mehr ginge, würde ich nie verwenden.

Wenn das
#define HIGH 1
mal in ein
const bool HIGH = true;
geändert wird, könnte ich akzeptieren.

Aber Code sollte lesbar sein, da gebe ich dir recht, @noiasca.
Hab noch nicht mal ausprobiert, ob der Compiler nicht aus beiden das Gleiche macht.

Die = / == Problematik wurde ja schon aufgezeigt und darum hab ich dann nicht weiter behandelt.
Grüße Uwe

Aber ich!
Zumindest im Code überprüft.

if (val == LOW)

Ob LOW jetzt ein uint8_t 0 ist, oder ein bool false, ist völlig egal.
Das Ergebnis ist immer das gleiche, das korrekte.