2x LED-Fade - unabhängig voneinander

Hallo,

habe da ein kleines Projekt, dazu möchte ich 2x eine LED mit einem Taster mit “fade-effekt” ein- und ausschalten. Und zwar unabhängig voneinander.
In einfacher Ausführung (eine LED ein Taster Kombi) habe ich einen Sketch der auch wunderbar funktioniert.

Sketch:

int LED = 5;
int Taster = 16;

int brightness = 0;
int fadeamount = 5;

void setup ()
{ 
  pinMode (LED,OUTPUT);
  pinMode (Taster,INPUT_PULLUP);
}

void loop ()
{ 
  if( digitalRead(Taster)==LOW && brightness<255 )
  {
    brightness = brightness + fadeamount;
    if( brightness>255 )
      brightness = 255;
    analogWrite(LED,brightness);
    delay (2);
  }
  else if( digitalRead(Taster)==HIGH && brightness>0 )
  {
    brightness = brightness - fadeamount;
    if( brightness<0 )
      brightness = 0;
    analogWrite(LED,brightness);
    delay (6);
  }
}

Ich benötige dieses in zweifacher Ausführung.
Ich könnte es mir natürlich einfach machen und zwei Arduinos nehmen und mein Projekt würde funkionieren.
ABER, dieses wäre dann auch irgendwie Verschwendung eines Arduino wenn sich das ganze nicht auch mit einem Arduino bewerkstellingen ließe.

Leider übersteigt das meine Fähigkeiten beim Programmieren, hoffe daher auf Hilfe hier.

Nimm statt der loop eine Funktion für jede Led und rufe die Funktion aus der loop auf.
Achte aber darauf, dass Funktionsname und Variablenname nicht doppelt genutzt werden.

Zumindest ist das erst mal eine einfache Version für dein Projekt.

Solange du dein Timing mit delay machst, wird das mit 'unabhängig' recht schwierig.

Schaue Dir mal das Beispiel SoftLed_01 der MobaTools an, wäre eine sehr einfache Implementierung.

Hallo,

delay ist da ganz schlecht, hast du aber sicher schon bemerkt. Anstelle dessen solltest Du eine Konstruktion mit millis() verwenden. Schau dir das Beispiel "blinkWithoutDelay" and und die Nachtwächter Erklärung hier im Forum. Wenn Du das dann für eine LED gemacht hast und es funktioniert, machst Du das für die zweite LED genauso.

Wenn Du Dich mit dem Thema Funktionen beschäitigen willst, kannst Du den Vorschlag von #2 aufnehmen. Wenn du dabei ein paar Dinge beachtest, insbesondere bei der Übergabe der Parameter, kannst Du mit der einen Funktion dann auch mehrere LED ansteuern.

Heinz

agmue:
Schaue Dir mal das Beispiel SoftLed_01 der MobaTools an, wäre eine sehr einfache Implementierung.

Ich habe das jetzt mal mit meiner neuen Lib zum Einlesen von vielen Tastern kombiniert :wink: ( die ist allerdings noch nicht in die MobaTools integriert). Die Zahl der Led’s/ Taster lässt sich dabei ganz einfach erhöhen/vermindern ( im Beispiel 4 Taster und Leds):

// Test-Sketch zum weichen An- und Ausschalten ven LEDs  beim Drücken der zugeordnenten Taster

#define BUTTON_CNT 4
#include <MoToButton.h>
#include <MobaTools.h>

// Variablen deklarieren und mit definierten Grundwerten vorbelegen
const byte tasterPinNr [] = { A0, A1, A2, A3 }; // Taster-Pins
const byte LEDPinNr[]     = {  2,  3,  4,  5 }; // LED-Pins
const byte anzahlTaster = sizeof(tasterPinNr);  // Anzahl der angeschlossenen Taster

// Funktion zum Einlesen der Taster-HW
button_t getHW( void ) {
  button_t tasterTemp = 0;
  for (byte i = 0; i < anzahlTaster; i++) {
    bitWrite( tasterTemp,i,!digitalRead(tasterPinNr[i]) );    
  }
  return tasterTemp;
}

MoToButton Taster1( getHW, 20, 500 );
MoToSoftLed Leds[anzahlTaster];

void setup()
{
  // alle Taster und LEDs definieren und Initialisieren
  for (int i = 0; i < anzahlTaster; i++)  {     // Bei Abfrage auf < kann man das -1 sparen
    // Taster einrichten
    pinMode(tasterPinNr[i], INPUT_PULLUP);            // Taster-Pins als Input definieren (gedrückt = LOW)

    // LEDs einrichten
    Leds[i].attach( LEDPinNr[i] );
    Leds[i].riseTime( 800 );
  }
}

void loop() {
  // Taster entprellt einlesen
  Taster1.processButtons();
  
  // Beim Drücken des Tasters Led Ein/Ausschalten
  for (byte i = 0; i < anzahlTaster; i++) {
      if ( Taster1.pressed(i) ) Leds[i].toggle();
  }

}   // Ende loop

MicroBahner:
Ich habe das jetzt mal mit meiner neuen Lib zum Einlesen von vielen Tastern kombiniert :wink:

Sehr schön!

Wozu wird BUTTON_CNT benötigt?

Zur Steuerung der Lib.

Gruß Tommy

Hast Recht, blöd formuliert. Zweiter Versuch: Warum wift man die Flexibilität von sizeof(tasterPinNr) durch #define BUTTON_CNT 4 weg?

Starr:

#define BUTTON_CNT 4
#include <MoToButton.h>
#include <MobaTools.h>

// Variablen deklarieren und mit definierten Grundwerten vorbelegen
const byte tasterPinNr [BUTTON_CNT] = { A0, A1, A2, A3 }; // Taster-Pins
const byte LEDPinNr[BUTTON_CNT]     = {  2,  3,  4,  5 }; // LED-Pins

MoToButton Taster1( getHW, 20, 500 );
MoToSoftLed Leds[BUTTON_CNT];

Flexibel:

// Variablen deklarieren und mit definierten Grundwerten vorbelegen
const byte tasterPinNr [] = { A0, A1, A2, A3 }; // Taster-Pins
const byte anzahlTaster = sizeof(tasterPinNr);  // Anzahl der angeschlossenen Taster
const byte LEDPinNr[anzahlTaster]     = {  2,  3,  4,  5 }; // LED-Pins

#define BUTTON_CNT anzahlTaster
#include <MoToButton.h>
#include <MobaTools.h>

MoToButton Taster1( getHW, 20, 500 );
MoToSoftLed Leds[anzahlTaster];

Ist nicht entscheidend, aber wenn dies zu einem Bibliotheksbeispiel aufsteigen würde, dann wäre dies meine Anmerkung.

Es wäre halt schön, würden die MobaTools richtig schick!

Schau doch mal in den Code der Lib.

Gruß Tommy

Danke für die ganzen Tipps. Ich bin dann aber ehrlich, bin da nicht sehr weit gekommen, da ich, wie schon ewähnt, dass meine Fähigkeiten nicht so gut sind in der Richtung.

Der Sketch von "MicroBahner" gefällt mir da aber schon sehr gut, funktioniert auch unabhängig voneinander.

Leider muss da der Taster einmal zum einschalten und nochmal zum ausschalten betätigt werden.
Könnte man das dahingehend ändern dass man die Taste halten muss und beim loslassen der Taste die LED aus geht.

Kann man da auch noch irgendwo die Fade-Geschwindigkeit einstellen und zwar auch unteschiedliche Ein- und Ausschltgeschwindigkeiten.

aandre:
Leider muss da der Taster einmal zum einschalten und nochmal zum ausschalten betätigt werden.
Könnte man das dahingehend ändern dass man die Taste halten muss und beim loslassen der Taste die LED aus geht.

Ja, siehe void myLed.on(); und void myLed.off();

aandre:
Kann man da auch noch irgendwo die Fade-Geschwindigkeit einstellen und zwar auch unteschiedliche Ein- und Ausschltgeschwindigkeiten.

Ja, siehe void myLed.riseTime( int Wert );

Hallo,

agmue:
Wozu wird BUTTON_CNT benötigt?

Letzlich dient es dazu den Ram-Verbrauch zu steuern, und die Maximalzahl der verwaltbaren Taster festzulegen. Vielleicht sollte ich es auch besser BUTTON_MAX nennen, und der Anwender gibt damit an, wieviel Taster er maximal zu nutzen gedenkt. Die Variante

#define BUTTON_CNT anzahlTaster

funktioniert leider nicht, da der Precompiler da nur eine reine Textersetzung macht, die ich im Precompiler nicht auf einen echten Wert abfragen kann. Die tatsächliche Anzahl ist ja erst beim eigentlichen Compilerlauf bekannt, der Precompiler weis nicht davon.
Man kann den define ja auch einfach weglassen, dann werden maximal 16 Tasten angenommen.
Aber vielleicht ist es doch besser es BUTTON_MAX zu nennen. Das macht den Sinn wohl etwas deutlicher. Ich möchte aber schon die Steuerungsmöglichkeit beibehalten. Bei dem knappen RAM des Arduino ist es ja Unsinn, Platz für 32 Taster vorzuhalten, wenn nur 5 oder 6 genutzt werden sollen.

@aandre:

aandre:
Leider muss da der Taster einmal zum einschalten und nochmal zum ausschalten betätigt werden.
Könnte man das dahingehend ändern dass man die Taste halten muss und beim loslassen der Taste die LED aus geht.

Kann man da auch noch irgendwo die Fade-Geschwindigkeit einstellen und zwar auch unteschiedliche Ein- und Ausschltgeschwindigkeiten.

Das ist kein Problem:

// Test-Sketch zum weichen An- und Ausschalten ven LEDs  beim Drücken der zugeordnenten Taster

#define BUTTON_CNT 4
#include <MoToButton.h>
#include <MobaTools.h>

// Variablen deklarieren und mit definierten Grundwerten vorbelegen
const byte tasterPinNr [] = { A0, A1, A2, A3 }; // Taster-Pins
const byte LEDPinNr[]     = {  2,  3,  4,  5 }; // LED-Pins
const byte anzahlTaster = sizeof(tasterPinNr);  // Anzahl der angeschlossenen Taster

// Funktion zum Einlesen der Taster-HW
button_t getHW( void ) {
  button_t tasterTemp = 0;
  for (byte i = 0; i < anzahlTaster; i++) {
    bitWrite( tasterTemp,i,!digitalRead(tasterPinNr[i]) );   
  }
  return tasterTemp;
}

MoToButton Taster( getHW, 20, 500 );
MoToSoftLed Leds[anzahlTaster];

void setup()
{
  // alle Taster und LEDs definieren und Initialisieren
  for (int i = 0; i < anzahlTaster; i++)  {     // Bei Abfrage auf < kann man das -1 sparen
    // Taster einrichten
    pinMode(tasterPinNr[i], INPUT_PULLUP);            // Taster-Pins als Input definieren (gedrückt = LOW)

    // LEDs einrichten
    Leds[i].attach( LEDPinNr[i] );
    Leds[i].riseTime( 800 );
  }
}

void loop() {
  // Taster entprellt einlesen
  Taster.processButtons();
 
  // Beim Drücken des Tasters Led Ein/Ausschalten
  for (byte i = 0; i < anzahlTaster; i++) {
      if ( Taster.pressed(i) ) {
        Leds[i].riseTime(1000);
        Leds[i].on();
      }
      if ( Taster.released(i) ) {
        Leds[i].riseTime(200);
        Leds[i].off();
      }
  }

}   // Ende loop

Wenn Du magst, kannst Du auch die Fadegeschwindigkeiten noch in ein Array schreiben, und für jede Led unterschiedlich einstellen. Aber das bekommst Du sicher selbst hin :wink: .

Hi

Du kannst doch die Textersetzung so nutzen, daß Du dort die sizeof-Berechnung 'einsetzen' lässt - da die variablen eh global sind, sollte Das klappen.

MfG

Ich brauch die Info aber zur Precompilezeit, weil ich damit die Datentypen für die Variablendefiniton anpasse ( uint8_t, uint16_t oder uint32_t ). Und der Precompiler weis halt nichts von 'sizeof'. Wenn Du da eine Lösung kennst - immer her damit.

MicroBahner:
Wenn Du da eine Lösung kennst - immer her damit.

Bin nicht sicher, mir fallen da templates ein. Siehe combies Ausgabe von 64 Bit Werten.

@MicroBahner
A-sooo ... das #define wird ganz zu Anfang 'flächendeckend' ersetzt.
Das sizeof wird erst vom Kompiler berechnet - für Dich 'etwas spät'.

... warum überhaupt? (ok ok ... vll. sollte ich mir den Quelltext anschauen ...)
Du hast per #define eine Zahl, Diese hättest Du auch per sizeof - nur vom Kompiler.
Gehe ich also recht in der Annahme, daß Du #ifdef oder so was benutzt, um den Speicherverbrauch in akzeptable Grenzen zu halten?
(ich hätte gerne das rosa Schwein'erl)
Also, Du musst diese Zahl bereits als Zahl haben, BEVOR der Kompiler den entsprechenden Code dafür zusammen stückelt ... und keine Ahnung hat, wie groß überhaupt egal was ist ...

MfG

agmue:
Bin nicht sicher, mir fallen da templates ein.

Ja grundsätzlich ist das mit Templates machbar - die Variante hatte ich auch schon in einem eigenen Branch realisiert. Löst dieses Problem des ‘Automatismus’ aber auch nicht. Im Gegenteil, bei Klassentemplates muss der Anwender den gewünschten Typ beim Instanziieren grundsätzlich explizit übergeben:

MoToButton<uint16_t> Taster1( getHW, 20, 500 );

Das ist sicher nicht einfacher verständlich als die #define - Lösung. Ich tendiere daher jetzt eher dazu, das define so zu benennen, dass klar ist, dass damit die Maximalzahl der Taster eingestellt wird. Wieviele tatsächlich benutzt werden, kann man ja gegebenenfalls im Sketch ganz ‘klassisch’ mit sizeof bestimmen.
Je nachdem wie die Schalter-HW organisiert ist, geht das aber auch nicht immer so.

postmaster-ino:
Gehe ich also recht in der Annahme, daß Du #ifdef oder so was benutzt, um den Speicherverbrauch in akzeptable Grenzen zu halten?

Du gehst recht :wink:

MicroBahner:
Ich tendiere daher jetzt eher dazu, das define so zu benennen, dass klar ist, dass damit die Maximalzahl der Taster eingestellt wird.

Ich tendiere mit Dir, dann aber in der starren Variante:

#define BUTTON_MAX 4
#include <MoToButton.h>
#include <MobaTools.h>

// Variablen deklarieren und mit definierten Grundwerten vorbelegen
const byte tasterPinNr [BUTTON_MAX] = { A0, A1, A2, A3 }; // Taster-Pins
const byte LEDPinNr[BUTTON_MAX]     = {  2,  3,  4,  5 }; // LED-Pins

MoToButton Taster1( getHW, 20, 500 );
MoToSoftLed Leds[BUTTON_MAX];

Nur meine Meinung.

Sehr schön, bitte weitermachen!

Danke an alle. Funktiniert super, genau was ich wollte!

Sogar ein kleines Extra mit bis zu vier Taster/LED Kombis.

Wünschte ich hätte genau so viel drauf wie ihr.