Go Down

Topic: LEDs werden nicht richtig angesteuert (Read 1 time) previous topic - next topic

valin1984

Oct 30, 2016, 02:02 am Last Edit: Oct 30, 2016, 02:11 am by valin1984 Reason: Code Tag vergessen
Guten Abend zusammen!

Ich bin neu im Forum und auch ziemlich neu am Arduino. Habe meine ersten Gehversuche mit dem UNO und ein paar LEDs hinter mir und stoße an meinem ersten komplexeren Projekt auf Probleme.

Ich habe 11 LEDs an den digitalen Pins 2 bis 12 angeschlossen und möchte davon jeweils 1 aus Pin 8 - 12 per random nach Knopfdruck leuchten lassen und 1 aus Pin 2 - 7 per Potentiometersignal auswählen und leuchten lassen.

Das ganze funktioniert auch schon prima, aber 2 LEDs, Pin 12 und Pin 6 verhalten sich sehr seltsam. Wenn sie angewählt sind leuchten sie nur mit sehr verminderter Helligkeit und wurden sie einmal angewählt, bleiben sie auf dieser Helligkeit, bis ich den UNO resette...

Ich habe bei gleichbleibender Schaltung für beide Pins jeweils einen Sketch erstellt, der nur die jeweilige LED einschaltet und da funktionieren sie prima.


Hat jemand dafür eine Erklärung oder einen Lösungsvorschlag? Wäre Euch sehr dankbar für Eure Hilfe!

Beste Grüße!
Valin1984

Habe Fotos von der Schaltung gemacht und auf meine Dropbox geladen:

Ursprungsprogramm LED links oben an Pin 12 ist nur halbhell und sollte auf LOW sein, rechts die zweite grüne LED von oben an Pin 6 sollte LOW sein und ist extrem schwach beleuchtet.


Sketch für Pin 12 hier ist die selbe Schaltung mit einem Sketch bespielt der nur die LED an PIN 12 auf HIGH setzt. Pin 6 funktionierte analog.

Anbei sende ich euch mal den Sketch für das Ursprungsprogramm:

Code: [Select]

//int potiWert = 0; // Potentiometerwert
int potiRead = A5; // Analog In des Potentiometers
int RED[] = {8, 9, 10, 11, 12}; // Pin-Belegung der 5 roten LEDs
int RED_Nr = 0; // Ausgewählte rote LED
int GREEN_Nr = 0; // Ausgewählte grüne LED
int GREEN[] = {2, 3, 4, 5, 6, 7}; // Pin Belegung der 5 grünen LEDs + 1 weiße LED
int taster = 13; // Eingangs-Pin des Tasters
int tasterReset = 0; // Taster Reset --> zur Erkennung wann der Taster losgelassen wird
int gameReset = 0; // Game Reset --> zur Freigabe des Spielneustarts bei Wahl der weißen LED

void setup() {
 // put your setup code here, to run once:
 for (int i = 0; i < 4; i++) { //For Schleife zur Festlegung pinModes
   pinMode(RED[i], OUTPUT);
   pinMode(GREEN[i], OUTPUT);
 }
 pinMode(GREEN[5], OUTPUT); //Grün hat eine LED mehr
 pinMode(taster, INPUT); // Der Taster als INPUT
 Serial.begin(9600); // Startet den Serial Monitor
}

void loop() {
 // put your main code here, to run repeatedly:

 for (int i = 0; i < 4; i++) { //For Schleife zum Ausschalten aller LEDs
   digitalWrite(RED[i], LOW);
   digitalWrite(GREEN[i], LOW);
 }
 digitalWrite(GREEN[5], LOW); //Grün hat eine LED mehr zum Ausschalten

 digitalWrite(RED[RED_Nr], HIGH); // Die gewählte rote LED wird eingeschaltet
 digitalWrite(GREEN[GREEN_Nr], HIGH); // Die gewählte grüne LED wird eingeschaltet

 if (digitalRead(taster) == HIGH && tasterReset == 0) { // Wenn Taster gedrückt und Tasterreset freigegeben dann...

   tasterReset = 1; // Taster sperren
   Serial.println(analogRead(potiRead)); // Debug: Potiwert auslesen
   RED_Nr = random (5);
 }

 if (digitalRead(taster) == LOW) { // Bei Loslassen des Tasters
   tasterReset = 0; // Taster etsperren
 }

 if (analogRead(potiRead) > 500) { // Weist je nach Poti-Wert eine Grüne LED zu.

   GREEN_Nr = 5;

 } else {
   if (analogRead(potiRead) > 400) {
     GREEN_Nr = 4;
   } else {
     if (analogRead(potiRead) > 300) {
       GREEN_Nr = 3;
     } else {
       if (analogRead(potiRead) > 200) {
         GREEN_Nr = 2;
       } else {
         if (analogRead(potiRead) > 100) {
           GREEN_Nr = 1;
         } else {
           GREEN_Nr = 0;
         }
       }

     }
   }
 }
}

pixxel46

Guten Abend valin1984,

Dein Problem könnte sein das dein Sketch zu schnell durchläuft. Wie ich das jetzt so auf die schnelle beurteilen kann schaltest du die LEDs alle aus und die jeweilige die ausgewählt ist wieder an. Und das machst du jeden Cycle. Probiere mal ein delay von ca. 500 ms am ende. Damit solltest du ein besseres Ergebnis bekommen. Falls das nicht hilft ist es ein anderes Problem und wenn es hilft dann musst du schauen das du nur bei einer Zustandsänderung den Pin neu beschreibst.


Grüße 

uxomm

#2
Oct 30, 2016, 04:31 am Last Edit: Oct 30, 2016, 04:48 am by uxomm
Der Fehler liegt hier:
Code: [Select]
for (int i = 0; i < 4; i++) { //For Schleife zur Festlegung pinModes
   pinMode(RED[i], OUTPUT);
   pinMode(GREEN[i], OUTPUT);
 }

Dein Array RED zum Beispiel hat 5 Werte (8, 9, 10, 11, 12).
In dieser Schleife nimmt i aber nur die Werte 0, 1, 2 und 3 an (solange eben die Bedingung i < 4 erfüllt ist - i muss kleiner 4 bleiben).
Deshalb werden RED[4] und GREEN[4] (also Pin D12 und D6) nicht als Output definiert.

Wenn du
Code: [Select]
for (int i = 0; i < 5; i++) {   // i nimmt die Werte 0, 1, 2, 3, 4 an
   pinMode(RED[i], OUTPUT);
   pinMode(GREEN[i], OUTPUT);
 }

schreibst sollte es funktionieren.

Warum leuchten die beiden LEDs an D6 und D12 dann trotzdem, aber nur sehr dunkel?
Weil alle Pins nach dem Reset des Boards zunächst mal Eingänge sind. In deinem Sketch werden Pin 6 und 12 ja nicht als Ausgänge definierst, also bleiben sie Eingänge. Irgendwann kommt die Anweisung digitalWrite(pin, HIGH). Dabei werden die internen Pullup-Widerstände (ca. 20 bis 50 kOhm) aktiviert (siehe: Digital Pins - dort ist zwar nur INPUT_PULLUP beschrieben, aber das ist dasselbe).
Der geringe Strom (über die Pullup-Widerstände) sorgt dafür, dass die LEDs ganz schwach leuchten.

Noch ein Hinweis:
Du kannst Fotos (falls sie nicht zu groß sind) auch direkt hier im Forum hochladen (unter "Attachments and other options"), dann ist die Wahrscheinlichkeit viel größer, dass sie jemand anschaut. Die meisten hier im Forum landen sich nicht gern Sachen von "irgendwo" runter. :)
Always decouple electronic circuitry.

valin1984

Vielen Dank Euch beiden!

@uxomm: Jap, das wars. Nach deiner Beschreibung war das einleuchtend und funktionierte nach der Korrektur erwartungsgemäß. Ich verbuche das mal als Anfängerfehler, da ich das < als ein <= behandelt hatte. Danke auch für den Hinweis mit den Fotos, werde das in Zukunft so machen.

@pixxel46: Das Problem ließ sich ja auf einen Fehler im Code zurückführen, aber dennoch danke ich für deinen Hinweis. Meine Lösung bei jedem Zyklus die LEDs zurückzusetzen und dann jene wieder einzuschalten die Leuchten sollen, scheint also nicht Best-Practice zu sein. Ich denke, ich werde den Code dahingehend umschreiben, dass für jede LED überprüft wird, ob sie der Einstellung entspricht oder nicht und sie dann entsprechend eingestellt wird.

DrDiettrich

Solange immer nur eine LED aus jeder Gruppe leuchten soll, kann man die Prüfung des Zustands auf diese zwei Kandidaten beschränken. Man muß sich dazu nur merken, welche LED aus jeder Gruppe zuvor eingeschaltet wurde, und bei einer Änderung genau diese LED wieder ausschalten.

Go Up