Hallo zusammen,
Ich habe mir kürzlich einen Funduino MEGA gekauft und versuche damit ein Lauflicht mit Charlieplexed LEDs zu erstellen.
Insgesamt verwende ich 20 LEDs zu je 3 6er und einer 2er Gruppe. Damit soll ein Deko-Christbaum beleuchtet werden.
Die Abfolge der LEDs habe ich mir schon überlegt und auch bereits das Programm geschrieben. Wenn das Lauflicht gewünscht wird, wird ein Index in regelmäßigen Abständen hochgezählt und die nächsten LEDs beginnen zu leuchten, quasi eine Schrittkette. Nur manchmal scheint das Programm etwas zu machen, was ich nicht ganz nachvollziehen kann: alles LEDs gehen aus, und erst wenn der Index wieder bei 1 angekommen ist, beginnt das Lauflicht wieder. Ich kann mir das nicht ganz erklären. Wenn ich mir den Wert des Index in der Konsole anzeigen lasse, kann ich nichts auffälliges entdecken. Der Index zählt auch brav weiter wenn die LEDs ausfallen. Ich habe einige Durchläufe beobachtet und habe gemerkt, dass die Ausfälle nur bei den Schritten 5, 7 und 9 stattfinden. Wie gesagt, der Index läuft trotzdem weiter somit kann ichs mir nicht erklären, warum die LEDs alles ausfallen. Die Kontroll LED ist immer auf true und fällt auch nie aus. Ich hoffe ihr könnt mir weiterhelfen.
Bitte seid nachsichtig bezüglich meines Codes ich programmiere erst seit kurzem (wieder)
hast Du mal zusammengerechnet, wieviel mA die LEDs im "besten Fall" (max.) ziehen, und das mit dem Datenblatt des Mega abgeglichen?
Nur eine Vermutung, denn mehr kann man ohne Schaltplan kaum herauslesen.
Hab ca. 100mA Stromaufnahme. Bei Charlieplexing leuchten ja nie effektiv alle LEDs gleichzeitig sondern es wird lediglich schnell umgeschaltet, es leuchten also grob immer nur maximal 5 gleichzeitig.
Die vielen Code-Duplikate schreien förmlich danach, in Funktionen ausgelagert zu werden.
Leider warst Du mit Kommentaren sehr sparsam und sorry, ich bräuchte dafür schon grob, wie der Kram eigentlich funktionieren SOLL, was Du Dir wo gedacht hast.
Monster trifft's eigentlich ganz gut ... viel viel Arbeit steckt da drin, leider nahezu unwartbar.
MfG
Edit Was so für pastebin spricht ... When this paste gets automatoically deleted in 29 days
Also in einem Monat ist der Thread hier zur endgültigen Löschung prädestiniert, weil Nichts und Niemand sich was aus diesen Posts zusammen reimen können wird.
Ich weiß, es geht bestimmt auch kleiner aber wie gesagt sind meine C Kenntnisse noch begrenzt
Die beiden hardcoded Pins sind im Moment nur zu Testzwecken, der Eingang ist ein Taster um automatik ein und aus zu schalten und der Ausgang ist eine LED die ständig leuchtet unabhängig vom Lauflicht (um zu sehen ob im Programm was nicht stimmt, oder ob der ganze Arduino abschmiert).
Ich habs mit 5 Pins versucht, allerdings wird die Helligkeit dann sehr gering wenn "alle" leuchten. Durch die Aufteilung auf mehrere Gruppen erreiche ich eine höhere Helligkeit bei Komplettansteuerung. Es sind 11 Pins im Einsatz.
Ich werde gleich nen ordentlichen Schaltplan zeichnen
Also hast Du VIER Charly-Plexing-LED-Gruppen - klar, daß bei 1/6tel LEuchtdauer 'MEHR' raus kommt, als wenn Du sämtliche LEDs in das Charly-Plexin einbeziehst.
Damit ist natürlich der Sinn des Charly-Plexing - so wenig Pins wie möglich für diese Zahl an LEDs - hinten runter.
wegen der reduzierten Helligkeit wird dann im erlaubten Bereich der Led Strom erhöht, weil der dann gepulst ist.
Nur können die Ströme dann nicht mehr von den µC Pins geliefert werden. Andere Idee wäre einen MAX7219/MAX7221 zu verwenden oder hier lesen LED-Matrix – Mikrocontroller.net
Vielen Dank für eure Hilfe,
Es geht mir allerdings nicht um die Ansteuerung der LEDs, das funktioniert ja an sich. Ich versteh nur nicht, warum plötzlich alle LEDs ausgehen bis der Index wieder von vorn beginnt.
Habe jetzt den Lauflichtindex probeweise rückwärts laufen lassen, bis jetzt konnte ich keine Ausfälle sehen
Übrigens, nur mal eine Anmerkung : Eine LED auf Daueran zu schalten ist kein Beweis dafür das das Programm
läuft ! Der entsprechende Pin bleibt auch auf HIGH wenn das Programm schon lange abgesemmelt ist.
Ich benutze für so was immer eine "Heartbeatled" also eine die langsam vor sich hin blinkt.
Das Blinken steuer ich aus der Loop. Blinkt es wird zumindest die Loop noch komplett durchlaufen.
Danke agmue, aber dass ich zusätzliche ICs ordnungsgemäß einsetzen kann, bin ich noch ein Stück entfernt
Habs aber halbwegs hinbekommen. Die eigentliche Ansteuerung der LEDs habe ich in eine eigene Funktion verlegt. Die Funktion wird mit einem Int entsprechend der LED-Nr und den zu verwendenden Pins aufgerufen. Die Ansteuerung für das Lauflicht liegt ebenfalls jetzt in einer eigenen Funktion. Funktioniert gut, wenn ich das Lauflicht nur in eine Richtung laufen lassen will und am Ende wieder von 0 starte. Wenn ich das Lauflicht hoch und wieder runterlaufen lassen will, scheint es als ob das Programm am Anfang oder am Ende manchmal "hängen" bleibt. Der "Timer" gibt einen Takt für die Schritte vom Lauflicht vor.
Deklarationen über Loop
bool takt = false;
int lauflichtSchritt = 1;
int schritt = 1;
unsigned long alteMillis = 0L;
unsigned int intervall = 75;
Habs gefunden. Wenn es vorkommt dass lauflichtSchritt über die Grenze hinausgeht, wird dauerhaft das Vorzeichen von schritt geändert, der Wert in lauflichtSchritt ändert sich also nicht bzw. unkontrolliert.
Habs jetzt anders gelöst
if (lauflichtSchritt > 10)
schritt = -1;
if (lauflichtSchritt < 1)
schritt = 1;