Init() Funktion bauen

Hallo zamma :slight_smile:
Ich möchte mir eine init() Funktion bauen, damit man solche Würste vermeiden kann:

Pseudocode

constexpr byte ledGRUEN = 2;
constexpr byte ledGELB = 4;
constexpr byte ledROT = 5;
constexpr byte ledBLAU = 9;
constexpr byte ledORANGE = 10;
constexpr byte ledWEISS = 12;

void setup() {
  pinMode(ledGRUEN, OUTPUT);
  pinMode(ledGELB, OUTPUT);
  pinMode(ledROT, OUTPUT);
  pinMode(ledBLAU, OUTPUT);
  pinMode(ledORANGE, OUTPUT);
  pinMode(ledWEISS, OUTPUT);
}

Ich möchte gern die Bezeichner erhalten, womit wohl ein Array wegfällt?

constexpr byte ledPINS[] = {2, 4, 5, 9, 10, 12};

Gibt es eine clevere Möglichkeit, das zu vereinfachen?

Ich dachte an etwas wie:

void init(byte pin, char* mode) {
    pinmode(pin, mode);
}

.....

init(ledGRUEN, OUTPUT);

Aber so hätte ich ja noch nix gewonnen :wink:

Wie würdet ihr das lösen?

Danke euch :slight_smile:

Du könntest für die Namen eine Enummeration nutzen. Wenn Du verschiedene Zustände haben willst, dann ein Array aus Strukturen, sonst genügt ein Array aus Pinnummern.

Gruß Tommy

1 Like

Im einfachsten Fall iterierst über das array:

void init(){
 for (auto &i : ledPINS) {   // auto range based for
   pinMode(i, OUTPUT);
 }
}

Der weg zu einer Struktur oder gleich einer Klasse und einer member function init/begin wäre nicht mehr weit.

1 Like
const byte ledPINS[] = {2, 4, 5, 9, 10, 12};

const byte &ledGRUEN  = ledPINS[0];
const byte &ledGELB   = ledPINS[1];
const byte &ledROT    = ledPINS[2];
const byte &ledBLAU   = ledPINS[3];
const byte &ledORANGE = ledPINS[4];
const byte &ledWEISS  = ledPINS[5];

void myInit()
{
  for (const byte pin : ledPINS) pinMode(pin, OUTPUT); 
}

void setup() 
{
  myInit();
}

void loop() 
{
  digitalWrite(ledWEISS, not digitalRead(ledWEISS));
}
2 Likes

verstehe ich.
Andererseits ist halt das array praktisch wenn man Funktionen für alle aufrufen muss - wie z.B. das init.

Eine Enumeration finde ich weniger passend. Daher evtl. wie schon gezeigt mit Referenzen arbeiten.

das wäre mein Hybrid in OOP, mit den Objekten in einem Array und Referenzen für einen Zugriff auf einzelne Instanzen.

Fun With OOP - Wokwi ESP32, STM32, Arduino Simulator

/*
  https://forum.arduino.cc/t/init-funktion-bauen/1225735/3
*/

class Led {
    const uint8_t pin;
  public:
    Led(uint8_t pin) : pin(pin) {}
    
    void begin() {
      pinMode(pin, OUTPUT);
    }

    void on() {
      digitalWrite(pin, HIGH);
    }

    void off() {
      digitalWrite(pin, LOW);
    }
};

Led led[] {2, 4};              // create an array of object

const Led &ledGRUEN  = led[0]; // optional: create a meaningful reference to one instance so you don't need to remember what index is which LED...

void setup() {
  for (auto &i : led) {
    i.begin();
  }
}

void loop() {
  ledGRUEN.on();
  led[1].off();
  delay(500);
  ledGRUEN.off();
  led[1].on();
  delay(500);
}
2 Likes

Vielen Dank an euch (mal wieder) :slight_smile:

Daraus kann ich mir etwas basteln!

Da bin ich gerade dran, um auch das mal zu testen :slight_smile:

enum class Led: byte {gruen = 2, gelb = 4, rot = 5, blau = 9, orange = 10, weiss = 12, };

Aber, so habe ich es nach langer Suche im Internet verstanden, man kann nicht einfach
mit einem Range Based For Loop über ein enum class iterieren (mit einfachen, mir verständlichen Boardmitteln). Ich habe nur sehr abstrakte Lösungen mit vielen Pointern usw.
gefunden.

Gibt es da einen einfacheren Weg zum Iterieren?

Ich habe noch einen "Hack" mit einem kleinen Codeduplikat gefunden (man baut noch ein array dazu), der es dann möglich macht:

byte Led farben[] = { gruen, gelb, rot, blau, orange, weiss };

Was haltet ihr davon?

Danke euch :slight_smile:

nichts :wink:

Schreibe mal worum es dir geht.

Ich auch nicht viel!
Selbst meinen Vorschlag aus #4 habe ich nie wirklich in der Praxis eingesetzt. Es gab immer "bessere" Alternativen.
Der ist also auch (von mir) abgelehnt.

Mein "Gefühl" sagt mir:
Hier wird versucht ein Problem an der falschen Stelle anzufassen, welches dafür sorgt, dass jede Lösung "ugly" aussieht, egal von welcher Seite man darauf schaut.

Ich möchte darauf wetten, dass man es nur schöner hin bekommt, wenn man 1 bis 2 Schichten tiefer ansetzt.

Ich hatte eigentlich einen Vorschlag vom Super-User StefanL38 erwartet, eigentlich.

Hmm, bis jetzt war alles schön kurz gehalten ....

1 Like

Ich wollte solche oft vorkommenden Code-Blöcke gern verschlanken:

Offensichtlich bin ich da (fast) der Einzige :smile:

Welches ist die richtige? :innocent:

Ich dachte halt, ich könnte es schöner/ kürzer gestalten.

Vorschläge wurden dir schon angeboten. Arrays und wenns benamst werden soll Referenzen darauf. Was gefällt dir daran nicht?

Ja klar, Danke dafür :slight_smile:
Die finde ich auch super!

Das wollte ich für mich noch etwas vertiefen….

Oder meintest Du das anders? :face_with_spiral_eyes:

tippfehler.
Lösch das nicht.

Pins sind keine Aufzählung.

1 Like

Hallo progger

Manchmal sind ganz einfache "structured arrays" mit member variablen, hier die Led Pins, und member Funktioen, hier die init() Funktion, sehr hilfreich. Weitere Funktionen, wie on(), off() oder blink() lassen sich einfach hinzufügen.

1 Like

Hmmm....
Wie soll ich das sagen?
OK!

Verstehe ich!
Du bist da auf ein Symptom gestoßen, was dir nicht gefällt.
Jetzt versuchst du das Symptom zu bearbeiten.
Es schöner aussehen zu lassen.
Verstehe ich!

Mein Rat an der Stelle:
Versuche die Ursache für die Symptomatik zu finden!

Wird die Ursache behoben, verschwinden automatisch die Symptome gleich mit.

Wenn ich mich frage, warum "deine" Symptome bei mir nicht/kaum auftauchen, kann ich nur vermuten, dass es ganz stark an meiner OO Sichtweise liegt.

Reminder an mich


void init(byte aPin) {
    pin = aPin;
    digitalWrite(pin, HIGH);  // Pin nach Reset hochohmig, dann aktivierter PullUp
    pinMode(pin, OUTPUT);     // Pin auf HIGH, Relais nicht geschaltet bei aktiv LOW Modulen
  }

Von agmue

Warum nicht

void init(byte pin) {
    digitalWrite(pin, HIGH);  // Pin nach Reset hochohmig, dann aktivierter PullUp
    pinMode(pin, OUTPUT);     // Pin auf HIGH, Relais nicht geschaltet bei aktiv LOW Modulen
}

Gruß Tommy