Ein- / Ausgänge im laufenden Programm definieren möglich?

Hallo Leute!

Ich habe mir seinerzeit ein Programm geschrieben, welches mit einem Taster eine LED-Leiste (über ein Solid State Relais SSR-25 DD) Ein-/Ausschaltet und heller oder dunkler dimmt.

Für die Profis unter Euch:
sicher nicht „schön“ und übersichtlich / kurz geschrieben, aber es ist selber gestrickt und funktioniert!! Ist unten angehängt.
Ich verwende die Analogeingänge für die Taster, weil mir dann die pins für das Gesamtprojekt ausreichen.

Jetzt möchte ich das Programm für 3 LED-Leisten mit jeweils einem Taster verwenden.

Muss ich das Programm 3x in den Arduino NANO schreiben für A1/D1, A2/D2, A3/D3 oder gibt es irgendwie folgenden Weg:

Das Ein/Aus/Dimmer-Programm wird als void Funktion aufgerufen. (Das funktioniert :blush:!)

Im laufenden Haupt Programm entscheidet eine if-Funktion, ob die void Routine die pins A1/D1, A2/D2, A3/D3 anspricht?

Alle meine Versuche ( #define / integer) sind bisher gescheitert :frowning:

Gruß Martin

// Jb läuft !! / 14.11.2023          Board "CONTROLLINO MAXI", Port X, Programmer: AVRISP mkll

  // Variablen deklarieren :    Integer (-32.767 bis 32.768)/ Byte (0-255)
  int  LED_Status = -1;     // "LED-Status" als Integer -> -1 = Aus / +1 = Ein
  int  Helligkeit = 120;     // "Helligkeit" als Integer und mit Wert für Helligkeit der LED beim Start deklarieren.
  byte Lock = 0;            // "Lock" als Byte - Bei Wert = 1 -> Dimmen sperren
  int  Up_Down = 1;         // Heller (1) oder Dunkler (-1) dimmen - Bei Progrann Start Helligkeit min -> also zuerst heller
  
  #include <Controllino.h>  // Usage of CONTROLLINO library
  #include <LiquidCrystal.h>;                   // include the library code
  LiquidCrystal lcd(9, 10, 11, 12, 13, 42);    // initialize the library  Syntax: LiquidCrystal lcd(rs, enable, d4, d5, d6, d7)
  
void setup() 
  {
  pinMode(8, OUTPUT);                    // pin 8 (PWM) als output definieren
  Serial.begin(9600);    // initialize serial communication at 9600 bits per second
  
  lcd.begin(16, 2);   //Display mit 16 Zeichen und 2 Zeilen definieren
  lcd.clear();
  
   lcd.setCursor(0,0);                      
   lcd.print("WoWa     Rev.: 5");       
   lcd.setCursor(0,1);
   lcd.print("LED Beleuchtung");
   delay(3000); // warten (1.000 = one second)
  }

void loop() {
   Serial.print(LED_Status); Serial.print("  ");   Serial.println(Helligkeit); 
    
    LCD_Anzeige();
 
  if (analogRead(A4) > 500)                  // wenn Taster an A4 gedrückt
          {
          delay(500);                        // 500 Millisekunden warten um den Taster zu entprellen          
          
                if ((analogRead(A4) > 500) && (LED_Status == 1))   // wenn Taster an A4 weiter gedrückt und LED-Status =1 (LED an)
                {
      while (analogRead(A4) > 500)
      {Helligkeit = Helligkeit + Up_Down; 
      delay(20);                                   // Dimm Geschwindigkeit: 245 Schritte in 5.000 Mili Sek  bzw. in 5 Sec. ändern  ( 5.000 / 245 = 20 )
  LCD_Anzeige();
      if (Helligkeit > 180) {Helligkeit = 180; }   // Wert Helligkeit max. begrenzen
      if (Helligkeit <  90) {Helligkeit =  90; }   // Wert Helligkeit min. begrenzen
      analogWrite(8, Helligkeit);}

                Up_Down = Up_Down * -1;         // Nach Ende Dimmen die Richtung heller / dunkler ändern
                LED_Status = LED_Status * -1;   // LED Status toggeln da anschließen nochmal toggle erfolgt
                }
          LED_Status = LED_Status * -1;      // LED Status toggeln
              
          }
          
  if (LED_Status > 0)    // LED Ein
     { analogWrite(8, Helligkeit); }     // LED Leiste An mit Wert Helligkeit 

  if (LED_Status < 0)  // LED Aus
     { analogWrite(8, 0); }               // Ausgabe Wert 0 an pin3 - LED Leiste aus

} 
// Ende void loop()

void LCD_Anzeige()
{
   lcd.setCursor(0,0); lcd.print("Helligkeit "); lcd.print(Helligkeit);  lcd.print("    ");
   lcd.setCursor(0,1); lcd.print("Status LED "); lcd.print(LED_Status);  lcd.print("    ");
}

Ein- / Ausgänge im laufenden Programm definieren möglich?

Definieren?
Nein!

Aber nutzen, konfigurieren, dynamisch, Ja!

Ich muß sagen ich habe den Controllino nur 2 mal ausgeschaltet in der Hand gehabt.
Wenn Du nur einen Taster am Analogeingang hängen hast, dann nutze diesen doch digital.
Grüße Uwe

Es ist schön wenn du selber „strickst“. Da merkt man das Fallen über seine Stricke besser und kann seine Stricke auch schneller so spannen, das man nicht mehr fällt.

Schreibe deinen LED Steuer/Programmablauf in eine Funktion und rufe sie im loop() auf
Wenn dies geklappt hat, übergebe der Funktion zwei Variablen, und reagiere anhand der zwei Variablen in der Funktion.
Im loop() rufst du dann deine Funktion mit unterschiedlichen Werten auf.

das sollte funktionieren. Deinen Versuch hast du aber nicht gezeigt.
Ich würde so anfangen

  • alle Variablen die so einen Lichtkreis ausmachen kommen in eine Struktur.
  • Dann eine Instanz der Struktur als Array anlegen, auch wenn man derzeit nur einen Lichtkreis hätte
  • die meisten Sachen aus dem loop in eine Funktion legen und den Index des Array übergeben.

mal als Idee, grob nur angefangen.
Das wäre ein erster Schritt:

// https://forum.arduino.cc/t/ein-ausgange-im-laufenden-programm-definieren-moglich/1204065/5

// Jb läuft !! / 14.11.2023          Board "CONTROLLINO MAXI", Port X, Programmer: AVRISP mkll

// Variablen deklarieren :    Integer (-32.767 bis 32.768)/ Byte (0-255)
int  LED_Status = -1;     // "LED-Status" als Integer -> -1 = Aus / +1 = Ein
int  Helligkeit = 120;     // "Helligkeit" als Integer und mit Wert für Helligkeit der LED beim Start deklarieren.
byte Lock = 0;            // "Lock" als Byte - Bei Wert = 1 -> Dimmen sperren
int  Up_Down = 1;         // Heller (1) oder Dunkler (-1) dimmen - Bei Progrann Start Helligkeit min -> also zuerst heller

#include <Controllino.h>  // Usage of CONTROLLINO library
#include <LiquidCrystal.h>;                   // include the library code
LiquidCrystal lcd(9, 10, 11, 12, 13, 42);    // initialize the library  Syntax: LiquidCrystal lcd(rs, enable, d4, d5, d6, d7)

struct Licht {
  const uint8_t inPin;
  const uint8_t outPin;
};

Licht licht[] {
  {A4, 8}  // Lichtkreis 0
};

void handle(int i) {
  Serial.print(LED_Status); Serial.print("  ");   Serial.println(Helligkeit);
  LCD_Anzeige();
  if (analogRead(licht[i].inPin) > 500)                  // wenn Taster an A4 gedrückt
  {
    delay(500);                        // 500 Millisekunden warten um den Taster zu entprellen
    if ((analogRead(licht[i].inPin) > 500) && (LED_Status == 1))   // wenn Taster an A4 weiter gedrückt und LED-Status =1 (LED an)
    {
      while (analogRead(licht[i].inPin) > 500)
      { Helligkeit = Helligkeit + Up_Down;
        delay(20);                                   // Dimm Geschwindigkeit: 245 Schritte in 5.000 Mili Sek  bzw. in 5 Sec. ändern  ( 5.000 / 245 = 20 )
        LCD_Anzeige();
        if (Helligkeit > 180) {
          Helligkeit = 180;  // Wert Helligkeit max. begrenzen
        }
        if (Helligkeit <  90) {
          Helligkeit =  90;  // Wert Helligkeit min. begrenzen
        }
        analogWrite(licht[i].outPin, Helligkeit);
      }

      Up_Down = Up_Down * -1;         // Nach Ende Dimmen die Richtung heller / dunkler ändern
      LED_Status = LED_Status * -1;   // LED Status toggeln da anschließen nochmal toggle erfolgt
    }
    LED_Status = LED_Status * -1;      // LED Status toggeln
  }

  if (LED_Status > 0)    // LED Ein
  {
    analogWrite(licht[i].outPin, Helligkeit);  // LED Leiste An mit Wert Helligkeit
  }

  if (LED_Status < 0)  // LED Aus
  {
    analogWrite(licht[i].outPin, 0);  // Ausgabe Wert 0 an pin3 - LED Leiste aus
  }
}

void setup()
{
  pinMode(licht[0].outPin, OUTPUT);                    // pin 8 (PWM) als output definieren
  Serial.begin(9600);    // initialize serial communication at 9600 bits per second

  lcd.begin(16, 2);   //Display mit 16 Zeichen und 2 Zeilen definieren
  lcd.clear();

  lcd.setCursor(0, 0);
  lcd.print("WoWa     Rev.: 5");
  lcd.setCursor(0, 1);
  lcd.print("LED Beleuchtung");
  delay(3000); // warten (1.000 = one second)
}

void loop() {
  handle(0);
}
// Ende void loop()

void LCD_Anzeige()
{
  lcd.setCursor(0, 0); lcd.print("Helligkeit "); lcd.print(Helligkeit);  lcd.print("    ");
  lcd.setCursor(0, 1); lcd.print("Status LED "); lcd.print(LED_Status);  lcd.print("    ");
}

sollte immer noch funktionieren. Tut es das? wenn nicht berichte was passiert.

Die weitern Schritte wären

  • setup() anpassen
  • Jene Variablen die pro Lichtkreis benötigt werden, auch in die Struktur verschieben und die handle Funktion anpassen
  • Funktion LCD_Anzeige() anpassen damit man ihr die Variablen Werte als Parameter übergibt
  • weitere Kreise anlegen (das ist dann nur mehr je Lichtkreis EINE EINZIGE ZEILE)

wenn du weitere Hilfe benötigst, erkläre auch warum du auf einem Nano die Controllino.h inkludierst und wo diese gegebenenfalls downloadbar wäre.

1 Like

PS.: Man kann analoge Eingänge auch als digitale Eingänge verwenden. Macht es leichter und schneller.

Danke für die vielen Antworten quasi über Nacht!
Ich werde weiter basteln und "stricken" ....

Hallo Wuehlmaus

Probier mal im Wohnwagen aus:

//https://forum.arduino.cc/t/ein-ausgange-im-laufenden-programm-definieren-moglich/1204065
//https://europe1.discourse-cdn.com/arduino/original/4X/7/e/0/7e0ee1e51f1df32e30893550c85f0dd33244fb0e.jpeg
#define ProjectName "WoWa LED Beleuchtung "
#define NotesOnRelease "Arduino MEGA tested"
//-------------------------------------------------------------------------------------*
// make variables
constexpr uint8_t PwmPins[] {9};      // [PortPin] --- [LedStrippe] --- [GND]
constexpr uint8_t ButtonPins[] {A0};  // [PortPin] --- [Knopf] --- [GND]
constexpr int32_t DimSteps[] {10};    // Angabe in msec für einen Schritt
constexpr int16_t StartPWM[] {128};   // Helligkeit nachm Arduinostart
//-------------------------------------------------------------------------------------*
// make names
enum TimerEvent {NotExpired, Expired};
enum TimerControl {Halt, Run};
enum DimControl {Up, Down};
// make structures
struct TIMER
{
  uint32_t interval;
  uint8_t control;
  uint32_t now;
  void start(uint32_t currentMillis)
  {
    now = currentMillis;
    control = Run;
  }
  void stopp()
  {
    control = Halt;
  }
  uint8_t expired(uint32_t currentMillis)
  {
    uint8_t timerEvent = currentMillis - now >= interval and control;
    if (timerEvent == Expired) now = currentMillis;
    return timerEvent;
  }
};
struct DIMMER
{
  uint8_t ledPin;
  uint8_t buttonPin;
  uint8_t stateOld;
  int16_t value;
  uint8_t dimControl;
  TIMER debounce;
  TIMER dimmerTime;
  void make(uint8_t ledPin_, uint8_t buttonPin_, uint8_t value_, uint32_t dimStep)
  {
    ledPin = ledPin_;
    buttonPin = buttonPin_;
    debounce.now = millis();
    debounce.interval = (20);
    debounce.control = HIGH;
    dimmerTime.now = millis();
    dimmerTime.interval = dimStep;
    dimmerTime.control = Halt;
    pinMode (ledPin, OUTPUT);
    pinMode (buttonPin, INPUT_PULLUP);
    value = value_;
    analogWrite(ledPin, value);
    dimControl = Up;
  }
  void run(uint32_t currentMillis)
  {
    if (debounce.expired(currentMillis) == Expired)
    {
      uint8_t stateNew = digitalRead(buttonPin) ? LOW : HIGH;
      if (stateOld != stateNew)
      {
        stateOld = stateNew;
        stateNew ? dimmerTime.start(currentMillis) : dimmerTime.stopp();
      }
    }
    if (dimmerTime.expired(currentMillis) == Expired)
    {
      analogWrite(ledPin, (dimControl == Up) ? ++value : --value);
      if ((value == 0) or (value == 255)) dimControl = dimControl ? LOW : HIGH;
      analogWrite(ledPin, value);
    }
  }
} dimmers[sizeof(PwmPins)];
// make support
void heartBeat(const uint8_t LedPin, uint32_t currentMillis)
{
  static bool setUp = false;
  if (setUp == false) pinMode (LedPin, OUTPUT), setUp = true;
  digitalWrite(LedPin, (currentMillis / 500) % 2);
}
// make application
void setup()
{
  Serial.begin(115200);
  Serial.print("Source: "), Serial.println(__FILE__);
  Serial.print(ProjectName), Serial.print(" - "), Serial.println(NotesOnRelease);
  uint8_t element = 0;
  for (auto &dimmer : dimmers)
  {
    dimmer.make(PwmPins[element], ButtonPins[element], StartPWM[element], DimSteps[element]);
    element++;
  }
  Serial.println(" =-> and off we go\n");
}
void loop()
{
  uint32_t currentMillis = millis();
  heartBeat(LED_BUILTIN, currentMillis);
  for (auto &dimmer : dimmers) dimmer.run(currentMillis);
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.